对数螺旋 - 螺旋上的点(笛卡尔坐标

时间:2010-11-27 00:38:44

标签: c#

让我说我有一个3D笛卡尔网格。让我们假设在水平面上有一个或多个从原点发出的对数螺旋。

如果我在网格中有一个点,我想测试该点是否在其中一个螺旋中。我真的想测试它是否在螺旋的某个范围内,但确定它是否在这一点上是一个良好的开端。

所以我猜这个问题有几个部分。

  1. 如何从参数(方向,紧密度)生成手臂

  2. 如何判断网格中的某个点是否在其中一个旋臂中

  3. 有什么想法吗?我一整天都在谷歌搜索,并不觉得我比我开始时更接近解决方案。

    以下是可能有用的更多信息:

    我实际上不需要渲染螺旋。我想设置音高和旋转然后将一个点传递给一个方法,该方法可以告诉我我通过的点是否在螺旋内(在螺旋上任何点的给定范围内)。根据返回的值(真或假),我的程序将决定是否在空间点存在某些东西。

    1. 如何参数化定义对数螺旋(俯仰和旋转以及??)

    2. 测试点(x,y,z)是否包含螺旋上任意点的给定范围。

    3. 注意:以上两者都只是在水平面上

4 个答案:

答案 0 :(得分:1)

这是定义逆时针螺旋的两个函数:

PolarPlot[{

  Exp[(t + 10)/100],
  Exp[t/100]},

 {t, 0, 100 Pi}]

输出:

alt text

这是定义顺时针螺旋的两个函数:

PolarPlot[{

 - Exp[(t + 10)/100],
 - Exp[t/100]},

 {t, 0, 100 Pi}]

输出:

alt text

笛卡尔坐标

转换Cartesian< - >极地是

  (1)  Ro = Sqrt[x^2+y^2] 
        t = ArcTan[y/x]

  (2)  x  = Ro Cos[t]
       y  = Ro Sin[t]  

因此,如果在笛卡尔坐标(x,y)中有一个点,则使用(1)将其转换为等效的极坐标。然后你使用forula进行螺旋函数(在图上面的四个中的任何一个,或类似的那个)放入t的值,并获得Ro。最后一步是将这个Ro与我们从坐标转换得到的那个进行比较。如果他们是平等的,那就是螺旋式的。

编辑回复您的评论

对于Log螺旋几乎相同,但是对于多个螺旋,您需要处理不会出现负值的日志。这就是我使用指数的原因......

示例:

PolarPlot[{

  Log[t],
  If[t > 3, Log[ t - 2], 0],
  If[t > 5, Log[ t - 4], 0]

}, {t, 1, 10}]

输出:

alt text

答案 1 :(得分:0)

不确定这是您想要的,但您可以反转日志功能(或“任何”其他功能)。 假设您有A = B,要从B获得A,则执行e ^ B = A.

所以你得到你的观点并将其作为B传递,你将得到A.然后你只需要检查A(具有某个+ - 范围)是否在您首次传递给ln的值中以生成螺旋。

我认为这可能有用......

答案 2 :(得分:0)

不幸的是,无论如何你都需要知道一些数学符号 - 这是关于对数sprial的一个很好的解读。

http://en.wikipedia.org/wiki/Logarithmic_spiral

我们只需要前4个方程式。

对于你的问题1 - 要控制紧密度,请在wiki页面中调整参数“a”。 - 为了控制方向,你将θ偏移一定量。

对于你的问题2

在浮点运算中,你永远不会得到绝对精度,这意味着精确地落在sprial上没有任何一点。但是,在屏幕上,您将知道要渲染的像素,并且您可以测试是否正在击中渲染的点。

要渲染曲线,通常将其渲染为一系列线段,足够短以使整体看起来像曲线。如果你想知道一个点是否与螺旋相距一定距离,你可以通过粗线来渲染曲线(如果你愿意,可以在屏幕外的缓冲区上)。

答案 3 :(得分:0)

这里有一个C ++代码,它绘制了鼠标在这里传递的任何螺旋线 (对不起我的英文)

int cx = pWin->vue.right / 2;
int cy = pWin->vue.bottom / 2;


double theta_mouse = atan2((double)(pWin->y_mouse - cy),(double)(pWin->x_mouse - cx));
double square_d_mouse = (double)(pWin->y_mouse - cy)*(double)(pWin->y_mouse - cy)+
                        (double)(pWin->x_mouse - cx)*(double)(pWin->x_mouse - cx);
double d_mouse = sqrt(square_d_mouse);
double theta_t = log( d_mouse / 3.0 ) / log( 1.19 );
int x = cx + (3 * cos(theta_mouse)); 
int y = cy + (3 * sin(theta_mouse));

MoveToEx(hdc,x,y,NULL);
for(double theta=0.0;theta < PI2*5.0;theta+=0.1)
{
    double d = pow( 1.19 , theta ) * 3.0;

    x = cx + (d * cos(theta-theta_t+theta_mouse)); 
    y = cy + (d * sin(theta-theta_t+theta_mouse));

    LineTo(hdc,x,y);
}

好了,现在螺旋参数是1.19(斜率)和3.0(中心半径) 只需比较θ为2的多个点PI = PI2 = 6,283185307179586476925286766559 如果任何点靠近非旋转螺旋,如

x = cx + (d * cos(theta)); 
y = cy + (d * sin(theta));

然后你的鼠标在螺旋上......我今晚搜索了这个,然后用Google搜索过去的问题