C#-如何绘制像闭合曲线一样的开放曲线?

C#-如何绘制像闭合曲线一样的开放曲线?,c#,graphics,curve,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),

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

if(isClosed) {
    g.DrawClosedCurve(
        new Pen(c, lineSize),
        points,
        tension,
        FillMode.Alternate
    );
} else {
    g.DrawCurve(
        new Pen(c, lineSize),
        points,
        tension
    );
}

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

if(isClosed) {
    g.DrawClosedCurve(
        new Pen(c, lineSize),
        points,
        tension,
        FillMode.Alternate
    );
} else {
    g.DrawCurve(
        new Pen(c, lineSize),
        points,
        tension
    );
}

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

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

我想我没有正确地解释我想要什么,所以我试着思考另一个例子

有以下几点:

使用1.2f作为张力,DrawCurve按如下方式绘制:

if(isClosed) {
    g.DrawClosedCurve(
        new Pen(c, lineSize),
        points,
        tension,
        FillMode.Alternate
    );
} else {
    g.DrawCurve(
        new Pen(c, lineSize),
        points,
        tension
    );
}

还有像这样的拉近曲线:

if(isClosed) {
    g.DrawClosedCurve(
        new Pen(c, lineSize),
        points,
        tension,
        FillMode.Alternate
    );
} else {
    g.DrawCurve(
        new Pen(c, lineSize),
        points,
        tension
    );
}

现在我意识到我不想让开放曲线像封闭曲线那样画,但我真正想修正的是第一点和最后一点附近的曲线

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

但是现在我不认为有一个简单的解决方案,因为我想要从DrawCurve在所有点上的正常行为,除了第一点和最后一点


我相信这仍然可以通过使用DrawBezier来实现,但我不知道如何在考虑张力的情况下计算控制点…

使用
图形。DrawArc

“绘制一条弧,表示矩形结构指定的椭圆的一部分。”

只需将startAngle设置为0,将sweepAngle设置为180,DrawCurve()和DrawClosedCurve()将创建基数样条曲线,这是一种特殊类型的三次Hermite样条曲线,其中切线向量从相邻点推断。如果希望能够在第一点或最后一点(或任何点)指定自己的切线向量,则应使用更通用的三次Hermite样条曲线。有关更多详细信息,请参阅。可以将三次Hermite样条曲线转换为三次Bezier曲线,如下所示:

B0=P0
B1=P0'/3+B0
B2=B3-P1'/3
B3=P1


其中B0、B1、B2和B3是三次贝塞尔曲线的控制点,P0'和P1'是点P0和P1处的切线向量。

这对我来说不起作用,因为我需要张力,所以,如果用户使用0.5f作为张力,当它不应该是那样时,它仍然会显示为椭圆的一部分…@Thunderbert sry我误解了你的问题。你说的“不同类型的曲线”是什么意思?我的意思是一切都是由用户定义的,这意味着这些点也是用户输入的,用户想要一组特定的点,它将对其进行标记,还将通知张力,以及它是闭合曲线还是开放曲线。@Thunderbert由于您提供的示例非常具体,并且您的定义非常笼统,因此该特定问题的解决方案应由用户提供(例如,指定更多点、圆弧类型等)我添加了另一个例子,更好地解释了我想要实现的目标。