假设我们有一个贝塞尔曲线,其起点p0为(0,0),结束点p4为(100,0)。现在它基本上是一条没有曲线的线。现在让我们假设我想根据给定的角度计算两个缺失的控制点(p1 p2)。实现这一目标的最佳方法是什么?
让我们假设我想要这样的东西:
我的意思是取决于控制点的位置,它形成某种三角形,这就是为什么我想知道它是否可能。
答案 0 :(得分:2)
控制通过具有给定角度的贝塞尔点的点,位于该角度的切线上。
由于选择的控制点越远,产生的弯曲越柔软,因此有许多不同的解决方案具有相同的角度和不同的曲率。
要找到两个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
将创建贝塞尔曲线,这些曲线似乎就像那样近似。