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

Calculate bezier curve control points with given angle

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

假设我想要这样的东西:

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

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

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

选择的控制点越远弯曲的结果越柔和,所以有很多相同角度不同曲率的不同解决方案..

要为两个贝塞尔点找到曲率相同的控制点,只需找到两条切线的交点即可!使用十字路口作为两个路段的公共控制点,即 C1 = C2.

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

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

更新: 我在 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 作为点和控制点..

顺便说一句:将 ellipses/circles 添加到 GraphicsPath 将创建看起来像那样近似的贝塞尔曲线。