如何计算只有起点和终点的贝塞尔曲线?

问题描述 投票:0回答:5

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

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

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

帮助或指导将不胜感激。

c# .net angle bezier
5个回答
3
投票

我在我的博客中写了一篇用于计算贝塞尔曲线角度并确定其各个点的博客http://johnexalt.wordpress.com/2011/05/21/bezier-curve-angle-calculation-silverlight/

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

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

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.


1
投票

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

想象起点在悬崖顶部,终点在悬崖底部。想象一下,您从起点水平扔一个球,重力会将其向下拉,使其恰好撞到终点。

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

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

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



0
投票

您基本上想要一条具有三个控制点的贝塞尔曲线 - 起点、终点和中间的另一个点。

如果起点 1 为

( x1, y1 )
,终点 2 为
( x2, y2 )
,则从点 1 到点 2 的向量为
( dx = x2-x1, dy = y2-y1 )

沿着直线,距离 0 到 1 之间的量

along
的点是
( x1 + along * dx, y1 + along * dy )

矢量

( -dy, dx )
与直线成直角,因此如果您想偏离直线一定量
above
,那么中点就是
( x1 + along * dx - above * dy, y1 + along * dy + above * dx)

改变沿和上方的值,直到找到所需的倾斜曲线。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.