2011-12-17 50 views
0

我正在尋找能夠幫助自動定位多段線上的標籤的算法指針。Polyline標籤定位算法

在這種特定情況下,折線被定義爲一系列[x,y]點。第一點是起點,最後一點是目的地。兩點之間的直線總是直的(即不是曲線/弧/貝塞爾)。

目前我正在選擇「中間」線段並將該標籤放置在該段的中間。

這可能會導致奇數標籤展示位置,除非每個線段的長度大致相同。如果一條線段長得多,那麼標籤「看起來很奇怪」。

那麼...我應該用Google搜索什麼想法?

謝謝!

回答

1

通過佩塔爾·伊萬諾夫的評論的啓發:

// 
// Calculate the distance between two points 
// 
function distance(a, b) { 
    var dx = a.x - b.x; 
    var dy = a.y - b.y; 
    return Math.sqrt(dx * dx + dy * dy); 
} 

// 
// Given a line between point1 and point2 return a point that 
// is distance away from point1 
// 
function lineInterpolate(point1, point2, distance) { 
    var xabs = Math.abs(point1.x - point2.x); 
    var yabs = Math.abs(point1.y - point2.y); 
    var xdiff = point2.x - point1.x; 
    var ydiff = point2.y - point1.y; 

    var length = Math.sqrt((Math.pow(xabs, 2) + Math.pow(yabs, 2))); 
    var steps = length/distance; 
    var xstep = xdiff/steps; 
    var ystep = ydiff/steps; 

    return { x: point1.x + xstep, y: point1.y + ystep }; 
} 

// 
// Return the point that is the midpoint for the line 
// 
function lineMidpoint(lineSegments) { 
    // 
    // Sum up the total distance of the line 
    // 
    var TotalDistance = 0; 
    for (var i = 0; i < lineSegments.length - 1; i += 1) { 
     TotalDistance += distance(lineSegments[i], lineSegments[i + 1]); 
    } 

    // 
    // Find the middle segemnt of the line 
    // 
    var DistanceSoFar = 0; 
    for (var i = 0; i < lineSegments.length - 1; i += 1) { 
     // 
     // If this linesegment puts us past the middle then this 
     // is the segment in which the midpoint appears 
     // 
     if (DistanceSoFar + distance(lineSegments[i], lineSegments[i + 1]) > TotalDistance/2) { 
      // 
      // Figure out how far to the midpoint 
      // 
      var DistanceToMidpoint = TotalDistance/2 - DistanceSoFar; 

      // 
      // Given the start/end of a line and a distance return the point 
      // on the line the specified distance away 
      // 
      return lineInterpolate(lineSegments[i], lineSegments[i + 1], DistanceToMidpoint); 
     } 

     DistanceSoFar += distance(lineSegments[i], lineSegments[i + 1]); 
    } 

    // 
    // Can happen when the line is of zero length... so just return the first segment 
    // 
    return lineSegments[0]; 
} 
0

爲什麼不把標籤放在中間。這是計算線段的總長度,然後取其一半,並將標籤放置在該距離(跟隨路徑)。