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

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

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

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

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

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

有任何想法吗? 我一直在谷歌搜索,并不觉得我比我开始时更接近解决方案。

以下是一些可能有用的信息:

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

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

  2. 测试点(x,y,z)是否具有螺旋上任何点的给定范围。

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

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

PolarPlot[{ Exp[(t + 10)/100], Exp[t/100]}, {t, 0, 100 Pi}] 

输出:

替代文字

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

 PolarPlot[{ - Exp[(t + 10)/100], - Exp[t/100]}, {t, 0, 100 Pi}] 

输出:

替代文字

笛卡尔坐标

转换笛卡尔< - >极地是

  (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}] 

输出:

替代文字

不确定这是你想要的,但是你可以反转日志function(或者“任何”其他function)。 假设您有A = B,要从B获得A,你会做e ^ B = A.

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

我认为这可能有用……

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

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

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

对于您的问题1 – 要控制紧密度,您可以像在Wiki页面中一样调整参数’a’。 – 要控制方向,请将θ抵消一定量。

对于你的问题2

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

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

这里有一个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(中心半径)只是比较θ为多的点PI = PI2 = 6,283185307179586476925286766559如果任何点接近非旋转螺旋状

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

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