@@ -111,9 +111,9 @@ func (g *graph) drawArrow(from gridCoord, to gridCoord, e *edge) (*drawing, *dra
111111 }
112112 log .Debugf ("Drawing arrow from %v to %v with path %v" , from , to , e .path )
113113 dLabel := g .drawArrowLabel (e )
114- dPath , linesDrawn := g .drawPath (e .path )
114+ dPath , linesDrawn , lineDirs := g .drawPath (e .path )
115115 dBoxStart := g .drawBoxStart (e .path , linesDrawn [0 ])
116- dArrowHead := g .drawArrowHead (linesDrawn [len (linesDrawn )- 1 ])
116+ dArrowHead := g .drawArrowHead (linesDrawn [len (linesDrawn )- 1 ], lineDirs [ len ( lineDirs ) - 1 ] )
117117 dCorners := g .drawCorners (e .path )
118118 return dPath , dBoxStart , dArrowHead , dCorners , dLabel
119119}
@@ -145,27 +145,31 @@ func mergePath(path []gridCoord) []gridCoord {
145145 return newPath
146146}
147147
148- func (g * graph ) drawPath (path []gridCoord ) (* drawing , [][]drawingCoord ) {
148+ func (g * graph ) drawPath (path []gridCoord ) (* drawing , [][]drawingCoord , [] direction ) {
149149 d := copyCanvas (g .drawing )
150150 previousCoord := path [0 ]
151151 linesDrawn := make ([][]drawingCoord , 0 )
152+ lineDirs := make ([]direction , 0 )
152153 var previousDrawingCoord drawingCoord
153- for idx , nextCoord := range path [1 :] {
154+ for _ , nextCoord := range path [1 :] {
154155 previousDrawingCoord = g .gridToDrawingCoord (previousCoord , nil )
155156 nextDrawingCoord := g .gridToDrawingCoord (nextCoord , nil )
156157 if previousDrawingCoord .Equals (nextDrawingCoord ) {
157158 log .Debugf ("Skipping drawing identical line on %v" , nextCoord )
158159 continue
159160 }
160- if idx == 0 {
161- // Don't cross the node border
162- linesDrawn = append (linesDrawn , d .drawLine (previousDrawingCoord , nextDrawingCoord , 1 , - 1 ))
163- } else {
164- linesDrawn = append (linesDrawn , d .drawLine (previousDrawingCoord , nextDrawingCoord , 1 , - 1 ))
161+ dir := determineDirection (genericCoord (previousCoord ), genericCoord (nextCoord ))
162+ s := d .drawLine (previousDrawingCoord , nextDrawingCoord , 1 , - 1 )
163+ if len (s ) == 0 {
164+ // drawLine may return no coords if offsets collapse the line. Use at least one point so arrow and junction logic
165+ // can still infer a direction.
166+ s = append (s , previousDrawingCoord )
165167 }
168+ linesDrawn = append (linesDrawn , s )
169+ lineDirs = append (lineDirs , dir )
166170 previousCoord = nextCoord
167171 }
168- return d , linesDrawn
172+ return d , linesDrawn , lineDirs
169173}
170174
171175func (g * graph ) drawBoxStart (path []gridCoord , firstLine []drawingCoord ) * drawing {
@@ -191,11 +195,17 @@ func (g *graph) drawBoxStart(path []gridCoord, firstLine []drawingCoord) *drawin
191195 return & d
192196}
193197
194- func (g * graph ) drawArrowHead (line []drawingCoord ) * drawing {
198+ func (g * graph ) drawArrowHead (line []drawingCoord , fallback direction ) * drawing {
195199 d := * (copyCanvas (g .drawing ))
200+ if len (line ) == 0 {
201+ return & d
202+ }
196203 from := line [0 ]
197204 lastPos := line [len (line )- 1 ]
198205 dir := determineDirection (genericCoord (from ), genericCoord (lastPos ))
206+ if len (line ) == 1 || dir == Middle {
207+ dir = fallback
208+ }
199209
200210 var char string
201211 if ! useAscii {
@@ -217,7 +227,26 @@ func (g *graph) drawArrowHead(line []drawingCoord) *drawing {
217227 case LowerLeft :
218228 char = "◣"
219229 default :
220- char = "●"
230+ switch fallback {
231+ case Up :
232+ char = "▲"
233+ case Down :
234+ char = "▼"
235+ case Left :
236+ char = "◄"
237+ case Right :
238+ char = "►"
239+ case UpperRight :
240+ char = "◥"
241+ case UpperLeft :
242+ char = "◤"
243+ case LowerRight :
244+ char = "◢"
245+ case LowerLeft :
246+ char = "◣"
247+ default :
248+ char = "●"
249+ }
221250 }
222251 } else {
223252 switch dir {
@@ -230,7 +259,18 @@ func (g *graph) drawArrowHead(line []drawingCoord) *drawing {
230259 case Right :
231260 char = ">"
232261 default :
233- char = "*"
262+ switch fallback {
263+ case Up :
264+ char = "^"
265+ case Down :
266+ char = "v"
267+ case Left :
268+ char = "<"
269+ case Right :
270+ char = ">"
271+ default :
272+ char = "*"
273+ }
234274 }
235275 }
236276
0 commit comments