2011-11-04 74 views
6

我想繪製一條公交線路作爲簡單的線路序列。沒有什麼花哨。但不是線條,我得到了楔子。起初我對此很滿意,因爲這些楔子看起來像箭頭,總是面向第二點。但現在我想改善外觀,楔子正在成爲一個大問題。爲什麼Graphics.DrawLine繪製楔形?

我的懷疑是由於圖形轉換引起的某種浮點問題(lat/lons被引入並且轉換將它們轉換成位圖上的x/y [假設緯度/經度對於我來說足夠準確目的],所以縮放比例是幾個數量級)。

截圖:

'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的解決了這個問題(爲什麼?)
  • 增加筆厚使問題消失(但線太厚)
  • 縮小(增加緯度/經度視圖窗口)使問題消失,最終(但我想放大!)
+0

你應該發佈你的所有代碼,包括變換。我從來沒有見過一條線以前是楔形的,沒有發生異常。 – MusiGenesis

+0

我已經添加了更多的代碼。 –

+1

修補筆,特別是帽子。 –

回答

3

我有同樣的問題,和整個這個線程絆倒了。與OP不同的是,我發現DrawLines沒有解決問題,並且遇到了和DrawLine相同的問題。

加布是,這個問題是關於內部繪製算法的精度正確。

我由10倍擴大緯度/長值(但如果你正在做更多的放大您可能需要通過更多的擴展)將它們傳遞給任何繪圖算法之前解決了這個問題。

2

自我回答:

通過使用DrawLines而不是DrawLine解決了問題。 DrawLines,無論出於何種原因,都沒有這個問題。

相關問題