我正在使用DrawCurve和DrawClosedCurve在我的PictureBox上绘制曲线,如下所示:
if(isClosed) {
g.DrawClosedCurve(
new Pen(c, lineSize),
points,
tension,
FillMode.Alternate
);
} else {
g.DrawCurve(
new Pen(c, lineSize),
points,
tension
);
}
问题是,我希望开放曲线看起来像闭合曲线,因为现在,如果我对两条曲线使用相同的张力(0.8f),它们看起来像这样:
我真正想要的是它看起来像这样:
我怎样才能达到这个效果?我需要使用DrawBezier(或DrawBeziers)而不是DrawCurve吗?如果是,我该如何计算要使用的控制点?此外,必须使用张力,以便用户可以绘制不同类型的曲线。
=====编辑=====
我想我无法正确解释我想要的东西,所以我试着考虑另一个例子......
有一组要点:
使用1.2f作为张力,DrawCurve将其绘制成:
DrawClosedCurve是这样的:
现在我意识到我并不真的希望开放曲线像闭合曲线那样绘制,但我真正想要修复的是第一点和最后一点附近的曲线。
曲线以逆时针方向运动开始,然后切换到顺时针方向移动到下一个点。同样的情况发生在最后一点,但它从倒数第二个点顺时针开始,并在中途切换到逆时针到下一个点(这也可以在第一个例子中看到)。因此,在这个例子中,我希望曲线以顺时针方向运动开始,而不是中途切换到下一个点并以顺时针方向运动结束。
但是现在我认为没有一个简单的解决方案,因为我希望DrawCurve在所有点上的正常行为,但第一个和最后一个......
我相信这仍然可以通过使用DrawBezier来实现,但我不知道如何计算出有紧张感的控制点......
答案 0 :(得分:0)
使用Graphics.DrawArc
。
https://msdn.microsoft.com/en-us/library/ms142028(v=vs.110).aspx
“绘制一个弧,表示由矩形结构指定的椭圆的一部分。”
将startAngle设置为0,将sweepAngle设置为180
答案 1 :(得分:0)
DrawCurve()和DrawClosedCurve()将创建基数样条曲线,这是一种特殊类型的三次Hermite样条曲线,其中切线向量是从相邻点推断出来的。如果您希望能够在第一个或最后一个点(或任何点)指定自己的切向量,则应使用更一般的立方Hermite样条曲线。有关详细信息,请参阅link。您可以将立方Hermite样条转换为立方贝塞尔曲线
B0 = P0
B1 = P0' / 3 + B0
B2 = B3 - P1' / 3
B3 = P1
其中B0,B1,B2和B3是三次贝塞尔曲线的控制点,P0'和P1'是P0和P1点处的切向量。