我最初发布了一个更简单(也不太有帮助)的问题,并对此进行了更具体的编辑。
来自维基百科的这个动画基本上显示了我想要完成的事情,但是 - 我希望它可以翻转,它开始向目的地前进并“向上”(在此图像中),然后更直接到了终点。但是,我只能访问起点和终点,我希望能够通过指定“高度”(或宽度,无论你想要什么称呼它)来确定其他点,以确定有多高电弧实际上是。 http://en.wikipedia.org/wiki/File:Bezier_3_big.png(由于低代表无法发布图片)
我希望能够使用起点和终点以及高度来调用函数,并让它返回曲线沿途的所有点。
感谢帮助或指示。
答案 0 :(得分:2)
我已经完成了一个博客,用于计算Bezier曲线角度,并在我的博客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先前的文章有助于计算2点之间的角度。 http://www.carlosfemmer.com/post/2006/02/Calculate-Angle-between-2-points-using-C.aspx
答案 1 :(得分:1)
答案 2 :(得分:1)
不失一般性,假设终点位于x轴上,起点位于终点的上方和左侧。
想象一下,起点位于悬崖的顶部,终点位于悬崖的底部。想象一下,你从起点水平抛出一个球,这样重力将它拉下来,使它完全砸到终点。
该曲线似乎具有您想要的属性。当球加速时,它开始浅,然后朝垂直方向增加。
通过改变最初投球的角度,您可以在开始时使曲线更浅。通过改变重力强度,最终可以使其更加陡峭。
这条曲线是否符合您的需求?找到那条曲线是一个非常基本的物理问题。
答案 3 :(得分:0)
除起点和终点外,您还需要描述弧的“角度”或曲率。贝塞尔曲线可以很好,但它们通常用较长的点序列实现(因为弧的曲率由线中的其他点定义)。看一下http://en.wikipedia.org/wiki/B%C3%A9zier_curve,在底部你可以找到一些关于“二次曲线”的信息。我打赌快速谷歌搜索会给你一些实施例子。
答案 4 :(得分: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)
。
改变沿着和向上的值,直到找到你想要的那种倾斜曲线。