【发布时间】:2014-09-29 05:43:02
【问题描述】:
我想将贝塞尔曲线一分为二。例如,如果在点 (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);
}
我想用上面解释的两种颜色填充它。
期望的结果:
我怎样才能做到这一点
编辑:
我检查了一些用于分割贝塞尔曲线enter link description here 的链接,但它告诉我要找到曲线的中点,这不是我的情况,我正在寻找绘制半贝塞尔曲线。
已知值:两点及其控制点在两点之间绘制贝塞尔曲线
预期结果:贝塞尔曲线的一部分从起点画到中点,另一部分从中点画到终点。
【问题讨论】:
-
最好的办法可能是创建一个自定义画笔,用颜色 1 绘制前半部分,用颜色 2 绘制后半部分。
-
我认为您没有仔细阅读链接。两条半曲线由控制点组 P0P4P7P9 和 P9P8P6P3 生成。这是贝塞尔曲线的绝妙属性。
-
该链接非常有趣,但我认为您是对的:根据贝塞尔曲线的形状,中点不会在中间分割形状。您可以使用一个简单的技巧,而不是进行更复杂的数学运算:在 (150,?) 处找到贝塞尔曲线上的分割点,画一条直到 (150,0) 的线,然后 floodfill你形状的一半。 FloodFill 并不难做到——wikipedia.. 中有一个不错的非递归算法。