计算给定角度的贝塞尔曲线控制点
Calculate bezier curve control points with given angle
假设我们有一条贝塞尔曲线,起点 p0 为 (0, 0),终点 p4 为 (100, 0)。现在它基本上是一条还没有曲线的线。现在假设我想根据给定的角度计算两个缺失的控制点 (p1 p2)。实现此目标的最佳方法是什么?
假设我想要这样的东西:
我的意思是根据控制点的位置它会形成某种三角形,这就是为什么我想知道它是否可能。
控制以给定角度通过贝塞尔点的点,位于该角度的切线上。
选择的控制点越远弯曲的结果越柔和,所以有很多相同角度不同曲率的不同解决方案..
要为两个贝塞尔点找到曲率相同的控制点,只需找到两条切线的交点即可!使用十字路口作为两个路段的公共控制点,即 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
将创建看起来像那样近似的贝塞尔曲线。
假设我想要这样的东西:
我的意思是根据控制点的位置它会形成某种三角形,这就是为什么我想知道它是否可能。
控制以给定角度通过贝塞尔点的点,位于该角度的切线上。
选择的控制点越远弯曲的结果越柔和,所以有很多相同角度不同曲率的不同解决方案..
要为两个贝塞尔点找到曲率相同的控制点,只需找到两条切线的交点即可!使用十字路口作为两个路段的公共控制点,即 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
将创建看起来像那样近似的贝塞尔曲线。