【问题标题】:Infinity angles on sharp corners in graphics图形中锐角的无穷大角
【发布时间】:2017-06-22 23:16:31
【问题描述】:

我在正在处理的应用程序中进行一些绘图时遇到了一些问题。每当我用宽 1 像素的线画一个尖角时,我的线就会越过它应该结束的点。

我无法找到任何帮助。图纸是图形路径,主要是多边形和饼图。我已经仔细检查了我的数学,这是正确的。我的代码如下。

 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Dim g As Graphics = CreateGraphics()
    g.SmoothingMode = SmoothingMode.AntiAlias
    Dim pens As Pen = New Pen(Color.Black, 1)
    Dim pen As Pen = New Pen(Color.Red, 1)

    g.DrawLine(pens, 350, 0, 350, 800)
    g.DrawPie(pen, 100, 0, 500, 500, 0, 90)
    g.DrawPie(pen, 100, 300, 500, 500, 0, 10)


    pen = New Pen(Color.Red, 2)

    g.DrawLine(pens, 700, 0, 700, 800)

    g.DrawPie(pen, 450, 0, 500, 500, 0, 90)
    g.DrawPie(pen, 450, 300, 500, 500, 0, 10)


End Sub

【问题讨论】:

  • 笔在路径的外侧而不是内侧绘制。要么通过重新定义路径来弥补它,要么忽略它。
  • 您还有多个 GDI 资源泄漏。完成后,您需要在 GraphicsPen 对象上调用 Dispose()
  • 此外,如果表单被最小化或另一个表单在其前面经过,您在该按钮单击事件中所做的任何绘图都将丢失。 CreateGraphics 几乎不应该被使用。
  • 我了解资源泄漏,并且我需要在 OnPaint 子中进行绘制。这个应用程序是我为显示我遇到的问题而建立的。我不想过去所有的代码,所以我做了一个简单的应用程序来显示问题。

标签: vb.net graphics


【解决方案1】:

尝试使用笔的LineJoin 属性,看看是否对您有帮助。您还可以试验笔的AlignmentEndCapMitreLimit 属性。

例如

pen.LineJoin = LineJoin.Bevel 

似乎剪掉了那个角落:

正如其他评论员所指出的,您需要在您的 GraphicsPen 对象上调用 Dispose。对于Graphics 对象,最好在表单的OnPaint 覆盖中完成所有绘制。在创建笔时使用Using 语句,以便它会自动被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多