c# - 绘制贝塞尔曲线的半弧

标签 c# graphics bezier

我想将贝塞尔曲线一分为二。例如,如果点 (100,100) 和 (200, 100) 之间有一条贝塞尔曲线,控制点为 (150,150) 和 (175, 150),则曲线应该用两种不同的颜色(比如红色和绿色)着色,一种从 (100,100) 到 (150, 100) 的颜色表示红色,从 (150,100) 到 (200,100) 的另一种颜色表示绿色。

这是我绘制贝塞尔曲线的代码:

void Form1_Paint(object sender, PaintEventArgs e)
        {
            Point startPoint = new Point(100, 100);
            Point endPoint = new Point(200, 100);
            Point ctPoint1 = new Point(150, 150);
            Point ctPoint2 = new Point(175, 150);
            GraphicsPath gp = new GraphicsPath();
            gp.AddLine(new Point(100, 0), new Point(100, 100));
            gp.AddBezier(startPoint, ctPoint1, ctPoint2, endPoint);
            gp.AddLine(new Point(200, 100), new Point(200, 0));
            gp.AddLine(new Point(100, 0), new Point(200, 0));
            e.Graphics.FillPath(Brushes.Aqua, gp);
}

我想像上面解释的那样用两种颜色填充它。

Result

期望的结果: Desired Result

我怎样才能做到这一点

编辑:

我检查了几个用于拆分贝塞尔曲线的链接 enter link description here但它告诉我找到曲线的中点这不是我的场景,我正在寻找绘制半贝塞尔曲线。

已知值:两点及其控制点绘制两点之间的贝塞尔曲线

预期结果:绘制一段贝塞尔曲线从起点到中点,另一段从中点到终点。

最佳答案

如果你心目中贝塞尔曲线的“中点”其实就是贝塞尔曲线上x=150的那个点,那么还是可以解析计算出来的。由于贝塞尔曲线只有 3 阶,我们可以计算对应于中点的参数“t”(例如,使用 Cardano 公式)。一旦有了中点参数,就可以使用 de Cateljau 算法找到两条分割曲线的控制点。将两条分割曲线作为贝塞尔曲线后,您可以根据需要绘制这两个区域。

这里是分割曲线的结果控制点:

第一条分割曲线:(100, 100) (120.196418101, 120.196418101), (136.313883161, 132.234930120) and (150.000000000, 136.115536​​056)。

第二条分割曲线:(150.000000000, 136.115536​​056), (170.196418101, 141.842093918), (185.098209050, 129.803581899) and (200, 100).

顺便说一句,“中点”处的参数 t 大约为 0.403928。

对于具有控制点 P0、P1、P2 和 p3 的三次贝塞尔曲线,给定分割参数 t,分割曲线的控制点计算如下(使用 De Casteljau 算法)

1) 将 Q0、Q1 和 Q2 计算为
Q0 = (1-t)*P0 + t*P1
Q1 = (1-t)*P1 + t*P2
Q2 = (1-t)*P2 + t*P3

2) 将 R0 和 R1 计算为
R0 = (1-t)*Q0 + t*Q1
R1 = (1-t)*Q1 + t*Q2

3) 将 S0 计算为 S0 = (1-t)*R0 + t*R1。这将是曲线上的分割点

4) 第一条分割曲线的控制点为P0、Q0、R0、S0,第二条分割曲线的控制点为S0、R1、Q2、P3。

关于c# - 绘制贝塞尔曲线的半弧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157838/

相关文章:

c# - 将多个视频文件与延迟的音频文件连接起来

c# - 使用动态参数的方法重载决议

graphics - 如何检查3D网格的凸度?

javascript - SVG 动画路径 d 属性

algorithm - 在绘图应用程序中使用的最佳线条算法是什么?

python - 将点列表转换为 SVG 三次分段贝塞尔曲线

c# - 按索引向自定义链表添加节点,向右移动

c# - 逐字符写入控制台时避免换行

java - graphics.setColor(颜色);不工作

java - 如何停止 java.awt.graphics 中的闪烁?