java+标签定位_折线标签定位算法

灵感来自Petar Ivanov的评论:

//

// 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值