根据欧几里德距离创建围绕圆的等距点:MATLAB

Posted

技术标签:

【中文标题】根据欧几里德距离创建围绕圆的等距点:MATLAB【英文标题】:Create equidistant points around a circle, based on Euclidean distance: MATLAB 【发布时间】:2017-08-11 06:20:02 【问题描述】:

我想要一个圆上的 N 个点,由 50 的欧几里得距离(直线,而不是圆周)分开。半径由点的数量和连续点之间的距离决定。

但是,当我选择其中一个点作为参考并计算到其他点的距离时,我没有得到任何等于 50 的距离值。

下面是我的代码:

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)';  

我获得的第三点周围的距离值为:

100.959
 50.505
  0.000
 50.505
100.959
151.311

与点 3 相邻的点的距离值应为 50,而不是 50.505

为什么会出现此错误? 提前致谢。

【问题讨论】:

绳子的配方从何而来?你为什么要使用虚构的东西?另外,只是一个题外话:使用linspace(0,1,N) 而不是0:1/(N-1):1 @Tinacord的公式就是从这个link得到的。 【参考方案1】:

您的问题在于您的公式生成的点数,因为您关注的 link 有误导性陈述。请注意,它是这样声明的:

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

但是,这将给出 301 分而不是 300。如果您绘制此图,您只会看到 300 分(如果您使用 4 分则更容易查看)。第一点和最后一点是相同的,因为

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

要解决这个问题,最简单的选择是将0:1/300:1 更改为不达到 1,或者简单地创建并删除一个额外的点,如下所示:

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))];

作为检查:

% 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

请注意,您应该小心使用'。这是复共轭转置,意味着x + yi 变为x - yi。您不会在以 0 和偶数个点为中心的圆上注意到这一点,但是当您想在 MATLAB 中转置某些内容时,请始终使用.',否则您可能会遇到一些难以诊断的问题!我已在上面的代码中更正了这一点。

文档链接:ctranspose/'transpose/.'

【讨论】:

哇...似乎主要问题是相同的点。在您为相同的点建议的纠正之后,它就像一个魅力。非常感谢。 也感谢' 转置的提示。从来不知道。 这是一个令人头疼的问题,直到我做了一个 4 点的快速绘图并得到一个三角形之前,这并不明显!如果您有兴趣,我添加了转置函数的文档链接,当您使用复数时它们变得很重要! 太棒了。再次感谢您的帮助。

以上是关于根据欧几里德距离创建围绕圆的等距点:MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

在Matlab中有效地计算成对平方欧几里德距离

matlab入门——矩阵运算

M-各种距离定义

MATLAB点云处理:欧式聚类分割

等距螺旋的七个实验实验四:等距螺旋的数学计算

使用由两个远点定义的半径绘制的 MKCircle 渲染不正确