1
votes

I want N points on a circle, set apart by a Euclidean distance (straight line, not around the circumference) of 50. The radius is determined by the number of points and the distance between consecutive points.

However, when I choose one of the points as a reference and calculate the distances to other points, I do not get any distance values equal to 50.

Below is my code:

N        =  100;    % number of points
eclddst  =  50;     % euclidean distance between adjacent points
r        =  eclddst/(2*sin(pi/N));         % radius of the circle 
cord     =  r*exp((0:1/(N-1):1)*pi*2*1i)'; % coordinates
XCor     =  real(cord);
YCor     =  imag(cord);
N_COORD  =  [XCor YCor];
% taking location 3 as the reference point to check the distance between the points
DSTNT    =  sqrt( (N_COORD(3,1)-N_COORD(:,1)).^2 + ( N_COORD(3,2)- N_COORD(:,2)).^2)';  

The distance values around the third point which I obtain are:

100.959
 50.505
  0.000
 50.505
100.959
151.311

The points adjacent to point 3 should have 50 as their distance value and not 50.505.

Why do I get this error? Thanks in advance.

1
Where is the formula for cord coming from? And why do you use imaginary stuff? Also, just an off-topic tip: use linspace(0,1,N) instead of 0:1/(N-1):110a
@Tina The formula of cord was obtained from this link.nashynash

1 Answers

2
votes

Your issue is in the number of points which your formula generates, because of a misleading statement at the link you were following. Note that it was stated:

r = A*exp((0:1/300:1)*pi*2j); % 300 point circle, radius A

However, this will give 301 points not 300. If you plotted this though, you would see only 300 points (much easier to see if you use, say, 4 points). The first and last points are identical since

exp(0*pi*2j) = exp(1*pi*2j) = 1

To get around this, the simplest options are to change 0:1/300:1 to not reach 1, or simply create and remove an extra point as shown here:

N =  100;    % number of points
d =  50;     % Euclidean distance between adjacent points
% Euclidean distance around circle is essentially side length of N-sided polygon.
% Triangular sector angle within polygon (rads): 2*pi/N 
% By bisecting the triangle to get a right-triangle, we can deduce that
% sin((2*pi/N)/2) = (d/2)/r  =>  r = (d/2)/sin(pi/N)
r = (d/2)/sin(pi/N);
% Use linspace as it's clearer than colon array, create N+1 points
% Note that point 1 and point N+1 will be identical!
complexcoords =  r*exp(linspace(0,1,N+1)*pi*2*1i).'; 
% Remove the last point as you put it in an array
coords        =  [real(complexcoords(1:N)) imag(complexcoords(1:N))];

As a check:

% Euclidean distances from point 3
dists = sqrt((coords(3,1)-coords(:,1)).^2 + (coords(3,2)-coords(:,2)).^2);
dists(1:5)
>> 99.951
       50  % Neighbouring points are distance 50! 
        0
       50  % Ditto
   99.951

Note that you should be careful using '. This is the complex conjugate transpose, meaning that x + yi becomes x - yi. You won't notice this on a circle centred around 0 and an even number of points, but when you want to transpose something in MATLAB always use .', otherwise you may get some hard to diagnose issues! I have corrected this in my above code.

Doc links: ctranspose/', transpose/.'.