如何在给定旋转度的螺旋线上得到一个点?

时间:2015-11-24 22:12:00

标签: c++ loops point spiral

我发现最接近帮助解释我需要的东西的是这个问题:Draw equidistant points on a spiral

但是,这并不是我想要的。

The spiral to draw is an archimedean spiral and the points obtained must be equidistant from each other.(引用:来自上面链接的问题。)

鉴于阿基米德螺旋方程equation,这正是我想要的。

用户可以输入一组特定的数据,它们不是基于螺旋而是基于圆形数字。它们如下:中心点[X,Y,Z],半径,水平分离[可称为X分离,取决于图形],垂直分离[可称为Y分离,取决于图形],最重要的是度轮换。我希望水平分离是连续点之间的距离,因为它们是彼此之间需要相同距离的点。我也喜欢垂直分离是并行'之间的距离。曲线。

因此,考虑到特定的输入选择(是的,有些可以忽略),我如何迭代所有连续的等距点来达到输入度(可能非常大但是有限)和返回这些点的每个点的X和Y点?

基本上,我尝试实现的是从零到输入度数的循环,给定上面提到的所有其余输入和我的首选项,并为所有等距离绘制一个点,连续点(如果您决定使用代码表示,只需使用' print'来表示图形。)

我很难解释,但我认为我已经覆盖了很多。这张图上的点正是我所需要的:

enter image description here

1 个答案:

答案 0 :(得分:3)

假设2D情况和阿基米德螺旋以零(a = 0)为中心,因此使用等式r=a\theta。然后将连续的行分开2\pi b,以便获得“垂直间距”。 v,设置b=v/(2\pi)

从中心到给定角度的弧的长度由Wolfram给出,但他的解决方案难以使用。相反,我们可以将弧的长度(使用非常粗略的for-large-theta近似)近似为s=0.5*theta^2。重新排列s=sqrt(s/b),允许我们确定哪些角度对应于所需的水平间距'。如果这个近似值不够好,我会考虑使用像Newton-Raphson这样的东西。您链接使用的问题也使用近似值,但不是相同的。

最后,认识到极坐标r=b\theta转换为笛卡尔坐标如下:x=b*theta*cos(theta); y=b*theta*sin(theta)

我得到以下内容:

Spiral!

这是由以下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);