为什么Graphics.DrawLine绘制一个楔形?

时间:2011-11-04 16:13:06

标签: .net vb.net drawing line

我正在尝试绘制一条简单的线路序列。没有什么花哨。但不是线条,而是楔子。最初我对此很好,因为楔形看起来像箭头,总是面向第二点。但现在我想改善外观,楔子正成为一个大问题。

我的怀疑是由于图形变换引起的某种浮点问题(lat / lons被输入并且变换将它们转换为位图上的x / y [假设lat / lon是euclidean对于我的目的来说足够准确],所以缩放是几个数量级。)

截图:

'Wedge' line overlayed over a road

实际上看起来这条线被分成两个三角形,但只绘制了其中一个。

相关代码(注意:绘图是异步完成的,这就是我创建位图的原因):

'-- Creating the transform --'
Dim bitmap = New Bitmap(Math.Max(1, PictureBox1.Width), Math.Max(1, PictureBox1.Height))

Dim g = Graphics.FromImage(bitmap)
g.TranslateTransform(0, bitmap.Height)
g.ScaleTransform(1, -1)
g.ScaleTransform(CSng(bitmap.Width) / (maxLon - minLon), CSng(bitmap.Height) / (maxLat - minLat))
g.TranslateTransform(-minLon, -minLat)

'-- Drawing the lines (in a method called asynchronously) --'
using pen = New Pen(Brushes.Black, 0.0001)
Dim shapes = busData.TripsInGroup(tripGroup.Value).
             Select(Function(e) e.Shape).
             Distinct()
For Each shape In shapes
    For i = 0 To shape.Points.Count - 2
        Dim e1 = shape.Points(i)
        Dim e2 = shape.Points(i + 1)
        Dim p1 = New PointF(CSng(e1.Longitude), CSng(e1.Latitude))
        Dim p2 = New PointF(CSng(e2.Longitude), CSng(e2.Latitude))
        g.DrawLine(pen, p1, p2)
    Next
Next

示例值:

cenLat = 44.657176
cenLon = -63.549471
spnLat = 0.071921
spnLon = 0.179729
minLat = cenLat - spnLat / 2
maxLat = cenLat + spnLat / 2
minLon = cenLon - spnLon / 2
maxLon = cenLon + spnLon / 2
shpts = {(Lat: 44.6518683235, Lon: -63.5930836628), 
         (Lat: 44.6512537117, Lon: -63.5927528307), 
         (Lat: 44.6508013753, Lon: -63.5924572976), 
         (Lat: 44.6503312812, Lon: -63.5921923044), 
         (Lat: 44.6503312812, Lon: -63.5921923044), 
         (Lat: 44.6502137576, Lon: -63.5921260568), 
         (Lat: 44.6495810455, Lon: -63.5917829189), 
         (Lat: 44.648893839, Lon: -63.5913776026), 
         (Lat: 44.6485468163, Lon: -63.5911976944), 
         (Lat: 44.6485468163, Lon: -63.5911976944), 
         (Lat: 44.6475084762, Lon: -63.5906617219), 
         (Lat: 44.6475084762, Lon: -63.5906617219)}

注释和发现:

  • 使用DrawLines而不是DrawLine解决了问题(但为什么?)
  • 增加笔的厚度会使问题消失(但线条太粗)
  • 缩小(增加lat / lon视图窗口)会使问题消失,最终(但我想放大!)

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,偶然发现了这个问题。与OP不同,我发现DrawLines没有解决问题,并且遇到了与DrawLine相同的问题。

Gabe是正确的,因为问题在于内部绘图算法的精确度。

我通过将纬度/经度值放大10倍来解决问题(尽管如果要进行更多放大,可能需要按比例放大),然后再将它们传递给任何绘图算法。

答案 1 :(得分:2)

自答案:

使用DrawLines而不是DrawLine解决问题。无论出于何种原因,DrawLines都没有这个问题。