2010-11-27 111 views
0

可以说我有一个3D笛卡尔网格让我们也假设有从原点在水平面上发出的一个或多个日志螺旋数螺旋 - 被点上螺旋(笛卡尔坐标

如果我再有。我想测试一个点,如果这个点是在一个螺旋线上,我很想测试它是否在一定范围内的螺旋线上,但是确定它是否在这个点上是一个好的开始。所以我想这个问题有几个部分。

  1. 如何从参数武器(方向,密封性)

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

任何想法的呢?我一整天都在用Google,并且觉得我比起初开始时更接近解决方案。

这里有更多的信息,可以帮助:

我实际上并不需要渲染的螺旋。我想设置音高和旋转角度,然后将一个点传递给一个方法,该方法可以告诉我我传递的点是否在螺旋线内(螺旋线上任意点的给定范围内)。根据返回的值(true或false),我的程序将决定是否在太空中存在某物。

  1. 如果一个点(x,Y,Z)被withing在螺旋的任何点的给定范围如何以参数定义日志螺旋(俯仰和转动和??)

  2. 测试。

注:上述两种将只是在水平面上

+0

这是用图形完成的,所以有人可以点击一个3D图像,你想看看它是否落在螺旋?或者,你只是有点矩阵和有人给你坐标?基本上,你如何显示它以及某人如何给出坐标? – 2010-11-27 00:46:55

+0

最终它将是图形化的,但现在我有一个方法,想要确定是否存在某个点在笛卡尔网格中。该点是否位于水平面上的一个对数螺旋上或附近是该决定的一部分。我希望这是有道理的。 – pglaspey 2010-11-27 01:32:16

+0

谢谢。我会记住这些事情。欣赏帮助 – pglaspey 2010-11-27 06:23:54

回答

0

不知道这是你想要的,但你可以扭转日志功能(或“任何”其他为此事)。 假设你有A = B,为了从B得到A,你做e^B = A。

所以你明白了你的观点并将它作为B传递给你,那么你将得到A.然后你只需要检查是否A(具有一定的+范围)在你首先传递给ln的值中以产生螺旋。

我认为这可能工作...

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

笛卡尔坐标

转换笛卡尔< - >极地是

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

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

所以,如果你在笛卡尔COORDS(X,Y)的点,你把它转换为使用(1)的等价极坐标。然后,你使用螺旋函数的原型(任何四个mentinoned在地块上面,或类似的)在那里把t的值,并获得Ro。最后一步是将这个Ro与我们从坐标收敛中得到的一个进行比较。如果他们是平等的,这一点就是螺旋式的。

编辑回答您的评论

对于数螺旋线几乎是相同的,但有多个螺旋你需要采取的日志不会为负值的照顾。这就是为什么我用指数...

例子:

PolarPlot[{ 

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

}, {t, 1, 10}] 

输出:

alt text

0

不幸的是,你将需要反正知道一些数学符号 - 这是关于一个良好的阅读对数螺线。

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

,我们只需要前4方程。

对于您的问题1 - 为了控制气密性,您可以像维基页面一样调整参数'a'。 - 控制方向,你抵消了一定的金额。

对于你的问题2

在浮点运算,你将永远不会得到绝对的精确度,这意味着不会有一点正好落在sprial。然而,在屏幕上,您将知道渲染哪个像素,并且您可以测试是否正在渲染渲染的点。

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

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); 
} 

OK现在螺旋的参数是1.19(斜率)和3.0(在中心半径) 刚比较其中θ是2的多发PI = PI2 = 6,283185307179586476925286766559 的点,如果任何点就像是

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

那么你的鼠标是在螺旋非旋转的螺旋靠近......我搜索ŧ他今晚和我GOOGLE了你的过去的问题