2011-11-04 9 views
6

Estoy tratando de dibujar una ruta de autobús como una secuencia simple de líneas. Nada sofisticado. Pero en vez de líneas, me están dando cuñas. Inicialmente estaba bien con esto, porque las cuñas se ven como flechas y siempre miran hacia el segundo punto. Pero ahora quiero mejorar el aspecto, y las cuñas se están convirtiendo en un gran problema.¿Por qué Graphics.DrawLine dibuja una forma de cuña?

Mi sospecha es algún tipo de problema de coma flotante debido a la transformación de gráficos (lat/lons son alimentados y la transformación los convierte en x/y en el mapa de bits [asumiendo que lat/lon es euclidiano es lo suficientemente preciso para mi fines], por lo que la escala es de varios órdenes de magnitud).

Captura de pantalla:

'Wedge' line overlayed over a road

En realidad parece un poco a la línea se dividió en dos triángulos, pero sólo uno de ellos se ha elaborado.

código relevante (nota: el dibujo se realiza de forma asíncrona, por lo que estoy creando un mapa de bits):

'-- 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 

Valores de ejemplo:

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)} 

Notas y descubrimientos:

  • El uso de DrawLines en lugar de DrawLine resuelve el problema (pero ¿por qué?)
  • El aumento del grosor del lápiz hace que el problema desaparezca (pero las líneas son demasiado gruesas)
  • Alejar (aumentando lat ventana de la vista/lon) hace que el problema desaparezca, con el tiempo (pero quiero hacer un zoom!)
+0

Debe publicar todo su código, incluidas las transformaciones. Nunca antes había visto una línea renderizada como una cuña, sin que sucediera algo inusual. – MusiGenesis

+0

He agregado algo más del código. –

+1

Tinker con el bolígrafo, especialmente las tapas. –

Respuesta

3

Tuve el mismo problema y tropecé con este hilo. A diferencia del OP, encontré que DrawLines no resolvió el problema y sufría del mismo problema que DrawLine.

Gabe tiene razón en que el problema es con respecto a la precisión de los algoritmos internos de dibujo.

Resolví el problema escalando los valores de latitud/longitud en un factor de 10 (aunque si está haciendo más acercamiento puede necesitar escalar más) antes de pasarlos a cualquier algoritmo de dibujo.

2

Respuesta propia:

Solución al problema al utilizar DrawLines en lugar de DrawLine. DrawLines, por cualquier razón, no tiene este problema.

Cuestiones relacionadas