1

我最初发布了一个更简单(而且帮助更少)的问题,并对其进行了更具体的编辑。

来自维基百科的这个动画基本上显示了我想要完成的事情,但是 - 我希望它翻转过来,它开始向目的地前进并“向上”(在这张图片中),然后更直接地弧线到最后观点。但是,我只能访问起点和终点,我希望做的是能够通过指定“高度”(或宽度,无论你怎么称呼它)来确定其他点,以确定多高弧线实际上去了。 http://en.wikipedia.org/wiki/File:Bezier_3_big.png(由于低代表无法发布图片)

我希望能够调用具有起点和终点以及高度的函数,并让它返回曲线沿途的所有点。

帮助或方向将不胜感激。

4

5 回答 5

2

我已经结束了一个计算贝塞尔曲线角度的博客,并在我的博客http://johnexalt.wordpress.com/2011/05/21/bezier-curve-angle-calculation-silverlight/中确定了它的各个点

下面的代码显示了如何在任何给定的 t 值处计算贝塞尔曲线点(其中 t 的范围从 0 到 100 %,用 0-1 表示。

x = ((1 - t) * (1 - t) * p0.X) + (2 * t * (1 - t) * p1.X) + (t * t * p2.X); //该语句用于确定曲线的x坐标。

y = ((1 - t) * (1 - t) * p0.Y) + (2 * t * (1 - t) * p1.Y) + (t * t * p2.Y);
//this statement is used to determine the y coordinate of the curve. 

x = Math.Round(x, 3);
y = Math.Round(y, 3);
angle = Math.Round(Angle(xold, yold, x, y), 3);

Carlos Femmer 之前有一篇文章有​​助于计算两点之间的角度。http://www.carlosfemmer.com/post/2006/02/Calculate-Angle-between-2-points-using-C.aspx

于 2011-05-22T04:29:04.363 回答
1

.NET 中似乎有一种机制可以帮助您: Graphics.DrawCurve

通过指定的 Point 结构数组绘制基数样条

此外,快速谷歌搜索发现这些

于 2010-10-27T14:17:16.943 回答
1

不失一般性,假设终点在 x 轴上,起点在终点的上方和左侧。

想象一下起点在悬崖的顶部,终点在悬崖的底部。想象一下,你从起点水平投掷一个球,重力会将其拉下,使其正好撞到终点。

该曲线似乎具有您想要的属性。它开始较浅,然后随着球的加速向垂直方向增加。

通过改变你最初投球的角度,你可以使曲线在开始时更浅。通过改变重力的强度,你可以让它在最后变得更陡峭。

这条曲线是否符合您的需求?找到那条曲线是一个非常基本的物理问题。

于 2010-10-27T14:26:49.477 回答
0

除了起点和终点,您还需要描述弧的“角度”或曲率。贝塞尔曲线可能很好,但它们通常使用较长的点序列来实现(因为弧的曲率由线中的其他点定义)。看看http://en.wikipedia.org/wiki/B%C3%A9zier_curve,在底部你可以找到一些关于“二次曲线”的信息。我敢打赌,快速的谷歌搜索会给你一些实现示例。

于 2010-10-27T14:25:25.270 回答
0

你基本上想要一条带有三个控制点的贝塞尔曲线——起点、终点和介于两者之间的另一个点。

如果起点 1 是( x1, y1 )终点 2 是( x2, y2 )那么从点 1 到点 2 的向量是( dx = x2-x1, dy = y2-y1 )

沿直线的一个点along在 0 和 1 之间的量是( x1 + along * dx, y1 + along * dy )

向量( -dy, dx )与线成直角,所以如果你想离开线一定量above,那么中间点就是( x1 + along * dx - above * dy, y1 + along * dy + above * dx)

改变沿着和上面的值,直到找到你想要的那种倾斜曲线。

于 2010-10-27T14:25:52.830 回答