C# 计算具有给定角度的bezier曲线控制点

C# 计算具有给定角度的bezier曲线控制点,c#,bezier,C#,Bezier,假设有一条bezier曲线,起点p0为(0,0),终点p4为(100,0)。现在它基本上是一条没有曲线的直线。现在假设我想根据给定的角度计算两个缺失的控制点(p1p2)。实现这一目标的最佳方式是什么 假设我想要这样的东西: 我的意思是,根据控制点的位置,它会形成某种三角形,这就是为什么我想知道它是否可能。以给定角度通过贝塞尔点的控制点位于该角度的切线上 选择的控制点越远,产生的弯曲越软,因此有许多具有相同角度和不同曲率的不同解决方案 要找到两个贝塞尔点具有相同软曲率的控制点,只需找到两条切线

假设有一条bezier曲线,起点p0为(0,0),终点p4为(100,0)。现在它基本上是一条没有曲线的直线。现在假设我想根据给定的角度计算两个缺失的控制点(p1p2)。实现这一目标的最佳方式是什么

假设我想要这样的东西:


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

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

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

要找到两个贝塞尔点具有相同软曲率的控制点,只需找到两条切线的交点!将交叉点用作两段的公共控制点,即C1=C2

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

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

更新:我添加了一个例子,说明了一个圆(橙色)如何通过中的数学公式进行近似

简短的版本:精确的解决方案实际上是不可能的,但最适合四分之一圆的方法是将控制点移动到交叉点的~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();
}
代码对点和控制点使用
标签


顺便说一句:将椭圆/圆添加到
GraphicsPath
将创建类似于此的贝塞尔曲线。

这是一个数学问题。可以贴在什么角度?可以指定点/线之间的角度吗?1个角度或2?@S.Serp基本上让我们假设两个控制点的角度都是45度,所以只有1个角度。您是否知道手动解决问题的方法并将其转换为c代码?或者你在寻找问题的解决方案?在三次贝塞尔曲线的起点和终点指定坡度的角度并不能唯一地决定中间的两个控制点。如果我想要一个完美的圆呢?或者说四分之一圆。我该怎么计算呢?我的意思是,我真的在努力计算,使两个控制点在位置上对称。产生一条均匀的曲线(如果我可以这么说的话)。我刚刚读到你们说的:两条切线的交叉。有趣。你能详细说明那件事吗?我当然可以用谷歌搜索,但既然你提到了,那就太酷了。对于四分之一个圆,控制点必须向后移动,大约距离切线交叉点的一半,否则结果看起来会指向点。当然,通常的方法是对椭圆段使用DrawArc。。不过,我无法提供精确解的数学。。对于任何类型的对称解,都需要保持与交叉对称的偏差,即50%、10%等。。注意,为了优化整体形状,还需要查看相邻点;一般来说,提供的功能做得很好;因此,只需考虑添加更多的贝塞尔点即可实现控制。对!谢谢你的回答,一旦有机会,你还会得到奖金吗