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

How can I get a point on a spiral given degrees of rotation?

我发现最接近于帮助解释我需要的东西是在这个问题中: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间隔,取决于图],最重要的是度数的旋转。我希望水平间隔是连续点之间的距离,因为它们是彼此之间需要相同距离的点。我还希望垂直间隔是 'parallel' 曲线之间的距离。

鉴于特定的输入选择(是的,有些可以忽略),我如何遍历所有连续的等距点才能达到输入度数(可以很大但有限)和return那些点的每个点的X和Y点?

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

我很难解释,但我想我已经基本了解了。这张图上的点正是我需要的:

假设二维情况和阿基米德螺线以零为中心 (a=0),因此方程 r=a\theta。连续的行然后 分开,因此要获得 的 'vertical spacing',请设置 b=v/(2\pi).

从中心到给定角度的一点的弧长由 Wolfram 给出,但他的解决方案很难使用。相反,我们可以将弧的长度(使用非常粗略的 for-large-theta 近似值)近似为 。重新排列,s=sqrt(s/b),允许我们确定哪些角度对应于所需的 'horizontal spacing'。如果这个近似值不够好,我会考虑使用类似 Newton-Raphson 的方法。您 link 使用的问题也使用了近似值,尽管不是同一个。

最后,认识到极坐标 r=b\theta 转换为笛卡尔坐标如下: ; .

我得到以下信息:

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