2010-05-21 64 views
7

我正在为wpf写一个自定义动画,并且作为一个非数学家伙,我有几个问题...如何计算曲线上的点?

如果给出两个Point3D,From和To,并假设原点位于0,0, 0我如何计算两点之间的曲线?如果我有曲线'绘制'并且知道它的长度(怎么做呢?),我怎样才能计算沿线的某个给定距离处的x,y,z坐标?

谢谢!

+2

你可能想把它放在http://mathoverflow.net/上,然后回到实施建议。这是一个很好的问题。当你得到解决方案时,把它归档......它会在几年后再次出现,像我一样,你会忘记数学。现在...我是在什么文件下?曲线?...图形?....废话。 – Rusty 2010-05-21 19:02:29

+1

当你说你想要一个“曲线”时,它听起来像你不只是想要在你的两点之间有一条直线,而是你想要一条连接你的端点和其他点之间的曲线。也许将样条曲线和NURBS作为开始。 – FrustratedWithFormsDesigner 2010-05-21 19:07:39

+0

你应该真正指定你想要的曲线类型:有无数曲线通过2点。 编辑:如果你想要一个样条,你至少需要3分。 – nico 2010-05-21 19:09:08

回答

5

为了从点A的直线向量的点B:

乙 - 甲

这将转化为:

vector.x = b.x - a.x; 
vector.y = b.y - a.y; 
vector.z = b.z - a.z; 

长度:

length = Math.Sqrt(vector.x * vector.x + 
        vector.y * vector.y + 
        vector.z * vector.z); 

拿到一分沿着你需要做的向量的单位向量的向量(长度1)一定的距离:

vector.x = vector.x/length; 
... 

,然后由你的距离乘以:

vector.x = distance * vector.x; 
... 

这是所有从内存因此可能无法立即编译。

CodeProject上有A Vector Type for C#这将为你做很多事情。

如果你想有一个曲线,那么你需要:

一个)来定义你想要什么类型的曲线(圆弧,样条等)

B)分以上(中心,控制点等)

+0

,则需要第三点您可以查看我上面的注释,但如实说,我不知道我想要什么样的曲线 - 我所知道的是这两点必须存在于我的起源周围的表面上 - 基本上球体或椭球体是我唯一的两个选择...... – Nicros 2010-05-21 21:04:39

0

你可能想表达你的曲线为一组的其他变量的参数功能:

x = f(t) 
y = g(t) 
z = h(t) 

where 0 <= t <= 1, and 

f(0) = from.x, f(1) = to.x 
g(0) = from.y, g(1) = to.y 
h(0) = from.z, h(1) = to.z 

有曲线connectin无限多g任意两点,所以你需要更多的信息来决定f(t),g(t)和h(t)应该采用什么形式。要沿着曲线移动点 ,只需让t在0和1之间变化,然后计算x,y和z坐标。一种方法是定义一组您希望曲线通过(或接近)的控制点,然后根据 spline functions表示您的参数方程。你不需要知道曲线的弧长就可以做到这一点。

+0

感谢您的回复!我上面发表了一些评论,但基本上,我认为我的两点是在一个封闭的表面上 - 一个球体或一个椭球体。所以考虑到原点和这两点,我需要在给定的时间(或沿线的距离)得到xyz位置。 – Nicros 2010-05-21 21:09:57

0

所以我只是想跟进我的解决方案 - 虽然它是真的有无数的曲线 - 我的(措辞不佳)问题是如何在曲线上的两点之间绘制 - 最短距离,假设0,0,0的原点和两个3d点。我所做的就是将我的点从笛卡尔转换为极点,在给定时间计算球面点,然后将该点转换回笛卡儿。如果有人想让我发布实际的C#代码,请告诉我。