我发现最接近帮助解释我需要的东西的是这个问题:Draw equidistant points on a spiral
但是,这并不是我想要的。
The spiral to draw is an archimedean spiral and the points obtained must be equidistant from each other.
(引用:来自上面链接的问题。)
用户可以输入一组特定的数据,它们不是基于螺旋而是基于圆形数字。它们如下:中心点[X,Y,Z],半径,水平分离[可称为X分离,取决于图形],垂直分离[可称为Y分离,取决于图形],最重要的是度轮换。我希望水平分离是连续点之间的距离,因为它们是彼此之间需要相同距离的点。我也喜欢垂直分离是并行'之间的距离。曲线。
因此,考虑到特定的输入选择(是的,有些可以忽略),我如何迭代所有连续的等距点来达到输入度(可能非常大但是有限)和返回这些点的每个点的X和Y点?
基本上,我尝试实现的是从零到输入度数的循环,给定上面提到的所有其余输入和我的首选项,并为所有等距离绘制一个点,连续点(如果您决定使用代码表示,只需使用' print'来表示图形。)
我很难解释,但我认为我已经覆盖了很多。这张图上的点正是我所需要的:
答案 0 :(得分:3)
假设2D情况和阿基米德螺旋以零(a = 0)为中心,因此使用等式。然后将连续的行分开,以便获得“垂直间距”。 ,设置。
从中心到给定角度的弧的长度由Wolfram给出,但他的解决方案难以使用。相反,我们可以将弧的长度(使用非常粗略的for-large-theta近似)近似为。重新排列,允许我们确定哪些角度对应于所需的水平间距'。如果这个近似值不够好,我会考虑使用像Newton-Raphson这样的东西。您链接使用的问题也使用近似值,但不是相同的。
最后,认识到极坐标转换为笛卡尔坐标如下:;
我得到以下内容:
这是由以下MATLAB代码生成的,但如果这是您实际需要的话,它应该足够直接转换为C ++。
% Entered by user
vertspacing = 1;
horzspacing = 1;
thetamax = 10*pi;
% Calculation of (x,y) - underlying archimedean spiral.
b = vertspacing/2/pi;
theta = 0:0.01:thetamax;
x = b*theta.*cos(theta);
y = b*theta.*sin(theta);
% Calculation of equidistant (xi,yi) points on spiral.
smax = 0.5*b*thetamax.*thetamax;
s = 0:horzspacing:smax;
thetai = sqrt(2*s/b);
xi = b*thetai.*cos(thetai);
yi = b*thetai.*sin(thetai);