我正在尝试绘制一条简单的线路序列。没有什么花哨。但不是线条,而是楔子。最初我对此很好,因为楔形看起来像箭头,总是面向第二点。但现在我想改善外观,楔子正成为一个大问题。
我的怀疑是由于图形变换引起的某种浮点问题(lat / lons被输入并且变换将它们转换为位图上的x / y [假设lat / lon是euclidean对于我的目的来说足够准确],所以缩放是几个数量级。)
截图:
实际上看起来这条线被分成两个三角形,但只绘制了其中一个。
相关代码(注意:绘图是异步完成的,这就是我创建位图的原因):
'-- 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)}
注释和发现:
答案 0 :(得分:3)
我遇到了同样的问题,偶然发现了这个问题。与OP不同,我发现DrawLines没有解决问题,并且遇到了与DrawLine相同的问题。
Gabe是正确的,因为问题在于内部绘图算法的精确度。
我通过将纬度/经度值放大10倍来解决问题(尽管如果要进行更多放大,可能需要按比例放大),然后再将它们传递给任何绘图算法。
答案 1 :(得分:2)
自答案:
使用DrawLines而不是DrawLine解决问题。无论出于何种原因,DrawLines都没有这个问题。