C# - 如何绘制闭合曲线等开放曲线?

时间:2015-11-03 20:03:11

标签: c# graphics curve

我正在使用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),它们看起来像这样:

open curve and closed curve

我真正想要的是它看起来像这样:

enter image description here

我怎样才能达到这个效果?我需要使用DrawBezier(或DrawBeziers)而不是DrawCurve吗?如果是,我该如何计算要使用的控制点?此外,必须使用张力,以便用户可以绘制不同类型的曲线。

=====编辑=====

我想我无法正确解释我想要的东西,所以我试着考虑另一个例子......

有一组要点:

enter image description here

使用1.2f作为张力,DrawCurve将其绘制成:

enter image description here

DrawClosedCurve是这样的:

enter image description here

现在我意识到我并不真的希望开放曲线像闭合曲线那样绘制,但我真正想要修复的是第一点和最后一点附近的曲线。

曲线以逆时针方向运动开始,然后切换到顺时针方向移动到下一个点。同样的情况发生在最后一点,但它从倒数第二个点顺时针开始,并在中途切换到逆时针到下一个点(这也可以在第一个例子中看到)。因此,在这个例子中,我希望曲线以顺时针方向运动开始,而不是中途切换到下一个点并以顺时针方向运动结束。

但是现在我认为没有一个简单的解决方案,因为我希望DrawCurve在所有点上的正常行为,但第一个和最后一个......

我相信这仍然可以通过使用DrawBezier来实现,但我不知道如何计算出有紧张感的控制点......

2 个答案:

答案 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点处的切向量。