1

我有一组数据点,我想测试它们是否位于给定参数的对数螺旋臂上。以下程序似乎有效,但没有返回靠近我的平面中心的任何点,其中包含所有数据点。所附图像显示我的程序似乎没有找到任何与中心附近的螺旋重叠的点。这是链接:http: //imgur.com/QbNPg5S。此外,似乎在重叠点处显示出两条螺旋线,这是另一个问题。

int main(){ 
float radial[10000]={0}, angle[10000]={0};  // my points of interest
float theta, r_sp;  // radius and the angle theta for the spiral

构建一个与我的源位于同一平面的螺旋(图像中的绿色)

for (j=0;j<=PI*10; j++){
    theta=j*3./10;  
    r_sp=a_sp*exp(b_sp*theta);

从给定坐标的 x 和 y 计算径向和角度分量(从文件中读取)

        for (m=0;m<=30;m++){
        radial[m]=pow((x_comp*x_comp+y_comp*y_comp),0.5); 
        angle[m]= atan2f(y_comp, x_comp);

将范围从 [ -pi, pi] 更改为 [0, 2*pi] 与螺旋的“theta”一致

        if (angle[m] < 0.){
        angle[m]=angle[m]+PI;
    }

检查点(径向和角度)是否位于螺旋上/周围。为了获得真实的效果,我正在考虑远离螺旋的“r_sp”值的径向距离“dr=0.5”(抖动)的点。

 if (fabs(r_sp-radial[m]) <=0.5 && fabs(theta-angle[m]) <= 1.0e-2){
     printf("%f\t%f\t%f\t%f\n",l[k],b[k],ns[k],radial[m]);
                 }
             } 
    }
return 0;
}
4

1 回答 1

1

您只检查位于角度范围 0..2*Pi 内的第一圈螺旋的条件。首先,您必须从r = radial[m]

r=a*exp(b*t)
r/a=exp(b*t)
ln(r/a)=b*t
t = ln(r/a) / b
turnnumber = Floor(ln(r/a) / b)

现在你可以使用

angle[m] = YourAngleFromArctan + 2 * Pi * turnnumber

比较

于 2015-05-13T12:36:53.563 回答