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

Cra*_*ney 6 .net vb.net drawing line

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

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

截图:

'Wedge'线覆盖在道路上

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

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

'-- 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
Run Code Online (Sandbox Code Playgroud)

示例值:

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)}
Run Code Online (Sandbox Code Playgroud)

笔记和发现:

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

小智 3

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

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

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