【问题标题】:C# - How to draw open curves like closed curves?C# - 如何绘制像闭合曲线一样的开放曲线?
【发布时间】:2016-02-04 03:10:17
【问题描述】:

我正在使用 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(或 DrawBezier)而不是 DrawCurve 吗?如果是,我如何计算要使用的控制点?此外,必须使用张力,以便用户可以绘制不同类型的曲线。

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

我想我没能正确解释我想要什么,所以我试着想另一个例子......

有这组点:

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

还有像这样的 DrawClosedCurve:

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

曲线从逆时针运动开始,然后它们在到下一个点的中途切换到顺时针运动。最后一个点也是如此,但它从倒数第二个点顺时针开始,到下一个点的中途切换到逆时针(这也可以在第一个示例中看到)。因此,在本例中,我希望曲线以顺时针运动开始,而不是在中途切换到下一个点,并以顺时针运动结束。

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

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

【问题讨论】:

    标签: c# graphics curve


    【解决方案1】:

    使用Graphics.DrawArc

    https://msdn.microsoft.com/en-us/library/ms142028(v=vs.110).aspx

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

    只需将 startAngle 设置为 0,并将 sweepAngle 设置为 180

    【讨论】:

    • 这对我不起作用,因为我需要张力,所以,如果用户使用 0.5f 作为张力,它仍然会显示为椭圆的一部分,而它不应该是这样的...
    • @Thunderbert 对不起,我误读了您的问题。 “不同类型的曲线”是什么意思?
    • 我的意思是一切都是用户定义的,也就是说点也是用户输入的,用户想要特定的一组点,它会标记它,也会通知张力以及它是闭合曲线还是开放曲线。
    • @Thunderbert 因为您提供的示例非常具体,并且您的定义很笼统,所以该特定问题的解决方案应由用户提供(例如,指定更多点、弧的类型等)跨度>
    • 我添加了另一个示例并更好地解释了我想要实现的目标。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2011-07-18
      相关资源
      最近更新 更多