fix tracing edge to label with multiple intersections
This commit is contained in:
parent
2c5c395315
commit
e52f0bb8ba
1 changed files with 35 additions and 4 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
package d2graph
|
package d2graph
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"oss.terrastruct.com/d2/d2target"
|
"oss.terrastruct.com/d2/d2target"
|
||||||
|
|
@ -337,9 +338,13 @@ func (edge *Edge) TraceToShape(points []*geo.Point, startIndex, endIndex int) (n
|
||||||
labelBox.Width += 2 * label.PADDING
|
labelBox.Width += 2 * label.PADDING
|
||||||
if intersections := labelBox.Intersections(startingSegment); len(intersections) > 0 {
|
if intersections := labelBox.Intersections(startingSegment); len(intersections) > 0 {
|
||||||
overlapsOutsideLabel = true
|
overlapsOutsideLabel = true
|
||||||
|
p := intersections[0]
|
||||||
|
if len(intersections) > 1 {
|
||||||
|
p = findOuterIntersection(labelPosition, intersections)
|
||||||
|
}
|
||||||
// move starting segment to label intersection point
|
// move starting segment to label intersection point
|
||||||
points[startIndex] = intersections[0]
|
points[startIndex] = p
|
||||||
startingSegment.End = intersections[0]
|
startingSegment.End = p
|
||||||
// if the segment becomes too short, just merge it with the next segment
|
// if the segment becomes too short, just merge it with the next segment
|
||||||
if startIndex+1 < len(points)-1 && startingSegment.Length() < MIN_SEGMENT_LEN {
|
if startIndex+1 < len(points)-1 && startingSegment.Length() < MIN_SEGMENT_LEN {
|
||||||
points[startIndex+1] = points[startIndex]
|
points[startIndex+1] = points[startIndex]
|
||||||
|
|
@ -378,9 +383,13 @@ func (edge *Edge) TraceToShape(points []*geo.Point, startIndex, endIndex int) (n
|
||||||
labelBox.Width += 2 * label.PADDING
|
labelBox.Width += 2 * label.PADDING
|
||||||
if intersections := labelBox.Intersections(endingSegment); len(intersections) > 0 {
|
if intersections := labelBox.Intersections(endingSegment); len(intersections) > 0 {
|
||||||
overlapsOutsideLabel = true
|
overlapsOutsideLabel = true
|
||||||
|
p := intersections[0]
|
||||||
|
if len(intersections) > 1 {
|
||||||
|
p = findOuterIntersection(labelPosition, intersections)
|
||||||
|
}
|
||||||
// move ending segment to label intersection point
|
// move ending segment to label intersection point
|
||||||
points[endIndex] = intersections[0]
|
points[endIndex] = p
|
||||||
endingSegment.End = intersections[0]
|
endingSegment.End = p
|
||||||
// if the segment becomes too short, just merge it with the previous segment
|
// if the segment becomes too short, just merge it with the previous segment
|
||||||
if endIndex-1 > 0 && endingSegment.Length() < MIN_SEGMENT_LEN {
|
if endIndex-1 > 0 && endingSegment.Length() < MIN_SEGMENT_LEN {
|
||||||
points[endIndex-1] = points[endIndex]
|
points[endIndex-1] = points[endIndex]
|
||||||
|
|
@ -404,3 +413,25 @@ func (edge *Edge) TraceToShape(points []*geo.Point, startIndex, endIndex int) (n
|
||||||
}
|
}
|
||||||
return startIndex, endIndex
|
return startIndex, endIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func findOuterIntersection(labelPosition label.Position, intersections []*geo.Point) *geo.Point {
|
||||||
|
switch labelPosition {
|
||||||
|
case label.OutsideTopLeft, label.OutsideTopRight, label.OutsideTopCenter:
|
||||||
|
sort.Slice(intersections, func(i, j int) bool {
|
||||||
|
return intersections[i].Y < intersections[j].Y
|
||||||
|
})
|
||||||
|
case label.OutsideBottomLeft, label.OutsideBottomRight, label.OutsideBottomCenter:
|
||||||
|
sort.Slice(intersections, func(i, j int) bool {
|
||||||
|
return intersections[i].Y > intersections[j].Y
|
||||||
|
})
|
||||||
|
case label.OutsideLeftTop, label.OutsideLeftMiddle, label.OutsideLeftBottom:
|
||||||
|
sort.Slice(intersections, func(i, j int) bool {
|
||||||
|
return intersections[i].X < intersections[j].X
|
||||||
|
})
|
||||||
|
case label.OutsideRightTop, label.OutsideRightMiddle, label.OutsideRightBottom:
|
||||||
|
sort.Slice(intersections, func(i, j int) bool {
|
||||||
|
return intersections[i].X > intersections[j].X
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return intersections[0]
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue