0

我发现的最接近的东西可以帮助解释我需要什么是在这个问题中:在螺旋上绘制等距点

然而,这并不是我想要的。

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点?

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

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

在此处输入图像描述

4

1 回答 1

4

假设 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).

我得到以下信息:

螺旋!

这是由以下 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);
于 2015-11-25T12:03:23.300 回答