如何计算曲线上的点?

7
我正在为wpf编写自定义动画,并且作为一个非数学专业的人,我有几个问题...
如果我有两个Point3D,From和To,假设原点在0,0,0处,如何计算两点之间的曲线?
一旦我绘制出曲线并知道其长度(如何实现?),如何计算沿着该线某个给定距离处的x、y、z坐标?
谢谢!

2
你可能想在http://mathoverflow.net/上发布这个问题,然后再回到这里寻求实现建议。这是一个好问题...当你得到解决方案时,把它存起来...几年后它会再次出现,就像我一样,你会忘记数学。现在...我把它归档到哪里了?曲线?图形?...糟糕。 - Rusty
1
当你说你想要一条“曲线”时,这听起来不仅仅是想要一个连接两个点的直线,而是想要一条曲线连接你的端点和中间的一些其他点。也许可以先了解一下样条曲线和NURBS。 - FrustratedWithFormsDesigner
你应该明确指定你想要的曲线类型:有无限多个曲线经过两个点。编辑:如果你想要一个样条曲线,至少需要三个点。 - nico
2
@Rusty:mathoverflow.net是专为专业数学家和高级学生而设的;这个问题可能会被认为过于基础,因此不适合在那里讨论。 - Jim Lewis
1
Wpf有贝塞尔曲线构造。贝塞尔曲线非常容易被普通人理解,并且在许多图形应用程序中广泛用作动画首选的曲线。因此,您可以通过Google搜索找到大量信息和代码示例。请查看:https://dev59.com/o03Sa4cB1Zd3GeqPtTvP。 - Rusty
显示剩余5条评论
3个回答

5

要从点A到点B得到一条直线向量:

B - A

这可以翻译为:

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#"的向量类型,可以为您完成很多工作。
如果您想要一条曲线,则需要:
a)定义您想要的曲线类型(弧、样条等);
b)更多的点(中心、控制点等)。

你可以看一下我上面的评论,但说实话,我不知道我想要什么样的曲线——我只知道这两个点必须存在于一个包围我的原点的表面上——基本上球体或椭球体是我唯一的两个选择... - Nicros

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

连接任意两点的曲线有无限多条,因此您需要更多信息来决定f(t)、g(t)和h(t)应该采取什么形式。要沿着曲线移动一个点,只需让t在0到1之间变化并计算x、y和z坐标。一种方法是定义一组控制点,使您的曲线通过(或接近)这些点,然后用样条函数表示您的参数方程。您不需要知道曲线的弧长来完成这个过程。


谢谢回复!我在上面发了几条评论,但基本上,我的想法是我的两个点位于一个闭合曲面上-一个球体或一个椭球体。因此,考虑到原点和这两个点,我需要在给定时间(或沿着该线的距离)获取xyz位置。 - Nicros

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接