用给定角度计算贝塞尔曲线控制点

时间:2017-01-11 08:14:28

标签: c# bezier

enter image description here假设我们有一个贝塞尔曲线,其起点p0为(0,0),结束点p4为(100,0)。现在它基本上是一条没有曲线的线。现在让我们假设我想根据给定的角度计算两个缺失的控制点(p1 p2)。实现这一目标的最佳方法是什么?

让我们假设我想要这样的东西:

https://1.bp.blogspot.com/_W3ZUYKgeEpk/SDcAerq1xkI/AAAAAAAAAAc/W9OnovkzgPI/s400/RectanglularControlPoly.jpg

我的意思是取决于控制点的位置,它形成某种三角形,这就是为什么我想知道它是否可能。

1 个答案:

答案 0 :(得分:2)

控制通过具有给定角度的贝塞尔点的点,位于该角度的切线上。

由于选择的控制点越远,产生的弯曲越柔软,因此有许多不同的解决方案具有相同的角度和不同的曲率。

enter image description here

要找到两个Bezier点具有相同柔和曲率的控制点,只需找到两条切线的交叉点即可!使用交叉作为两个段的公共控制点,即C1 = C2。

对于任何类型的对称曲线,您需要保持与交叉点的偏差对称,即50%,10%等。

注意,为了优化整体形状,还需要查看相邻点;一般来说,提供的GDI功能做得很好;所以值得考虑简单地添加更多Bezier点来控制形状;但当然使用完善的控制点是最经济的解决方案。

更新:我添加了一个例子,说明圆圈(橙色)与this interesting post中的数学近似有多好。

短版本:确切的解决方案实际上是不可能的,但最适合四分之一圆的是将控制点移动到交叉点的~0.55%。 ( d=r*4*(sqrt(2)-1)/3 的)。有时代替使用4段解决方案,使用8段解决方案进行更接近的近似。

private void button_Click(object sender, EventArgs e)
{
    int w = Math.Abs(P2.Left - P1.Left);
    int h = Math.Abs(P2.Top - P1.Top);
    C2.Left =  (int) (P2.Left + w * 0.5523f);
    C2.Top = P2.Top;
    C1.Left = P1.Left;
    C1.Top = (int) (P1.Top + h * 0.5523f);
    C1.Parent.Invalidate();
}

代码使用Labels作为点和控制点..

顺便说一下:将椭圆/圆圈添加到GraphicsPath将创建贝塞尔曲线,这些曲线似乎就像那样近似。