coool
coool

Reputation: 419

Drawing star-like figure in Matlab

I had to plot this in matlab :
enter image description here

so I wrote the following code:

x=[0.9 1 0.9 -0.9 0.7 0.7 -0.9 0.9];
y=[-1 0 1 -0.5 -0.8 0.8 -0.4 -1];
plot(x,y);  

but this gives me: enter image description here

Is this method insufficient to draw the first figure....Is there some other short method for this...

Upvotes: 2

Views: 2302

Answers (3)

MeMyselfAndI
MeMyselfAndI

Reputation: 1320

It seems to me that you want to construct a star polygon, which has the property that all points are equidistant to its neighboring points, and all points lie on the same circle.

First, we generate the desired angles a (measured from the x-axis to a line that connects the origin with the desired point, see wikipedia). Based on the polygon, we rearrage the angles in such a way that a desired number of points is skipped (in the code below, this is done by using among others repmat - but many alternatives exist).

To convert the angles to actual points in the plane, we take sine and cosine values, and then we can plot the dots and lines. Putting this together results in the following code, which results in the dersired figure

n = 7;
a = linspace(0,2*pi,n+1);
skip = 1;

b = [repmat(a(1:end-1),1,skip+1) a(end)];
a = b(1:skip+1:end);

figure;
clf;
hold on;
plot(cos(a),sin(a),'b-');
plot(cos(a(1:end-1)),sin(a(1:end-1)),'ro');

axis([-1 1 -1 1])
axis equal

A little less involved would be to compute the vector a like this:

a = mod(linspace(0,(skip+1)*2*pi,n+1),(skip+1)*2*pi);

Upvotes: 2

Shai
Shai

Reputation: 114826

You can do better positioning your data points

nPoints = 7;
th = linspace(-2*pi, 2*pi, 2*nPoints+1);%// extra point to close the curve
r = 1;
x = r*cos(th);
y = r*sin(th);
scatter( x, y, 'ro' );
hold on;
plot( x(1:2:end), y(1:2:end), 'b-' );
axis equal;

Resulting with:
enter image description here

BTW, this code works for any odd nPoints - just try ;)

Upvotes: 2

tashuhka
tashuhka

Reputation: 5126

I tried manually:

x = [-0.4 0.6 1 0.6 -0.4 -0.8 -0.8];
y = [-0.9 -0.7 0 0.7 0.9 0.4 -0.4];

x_ = [x,x];
y_ = [y,y];

figure;
hold on;
for ii=1:numel(x),
    scatter(x(ii),y(ii),'ro');
    plot([x_(ii),x_(ii+1+1)],[y_(ii),y_(ii+1+1)],'b-');
end
axis([-1 1 -1 1]);

And I get his:

enter image description here

Upvotes: 0

Related Questions