Давая толщину полиции LAT/LON
-
19-09-2019 - |
Вопрос
Это скорее вопрос алгоритмов, но, надеюсь, кто -то поможет мне с этим. У меня есть линия из точек широты/долготы, и я хочу создать из нее многоугольник с некоторой предопределенной толщиной. Таким образом, в основном у полигона были бы края, которые будут параллельно исходной полилине с обеих сторон. Есть мысли о лучшем подходе для этого?
РЕДАКТИРОВАТЬ: Мой текущий план состоит в том, чтобы итерация над каждой из точек, найдите наклон в следующую точку, затем найдите параллельные линии с любой стороны, а те, которые составляют стороны многоугольников. Просто не знал, был ли более простой способ сделать это.
Решение
То, что вы хотите сделать, это создать пару новых линий, которые немного смещены влево и справа от исходной линии. Так:
var polygon = [
{x:0, y:0},
{x:10, y:0},
{x:10, y:10},
{x:0, y:10}
];
var outerPolygon = [];
var innerPolygon = [];
for(var i=1; i<polygon.length; i++){
var ret = newLines(polygon[i-1], polygon[i]);
outerPolygon.push(ret[0]);
innerPolygon.push(ret[1]);
}
function newLines(start, stop){
var dx = start.x - stop.x;
var dy = start.y - stop.y;
var d = Math.sqrt(dx*dx + dy*dy);
dx /= d;
dy /= d;
var rNormal = {dx: dy, dy:-dx};
var lNormal = {dx: -dy, dy:dx};
return [
{start:{
x:start.x+rNormal.dx,
y:start.y+rNormal.dy},
stop:{
x:stop.x+rNormal.dx,
y:stop.y+rNormal.dy}
},
{start:{
x:start.x+lNormal.dx,
y:start.y+lNormal.dy},
stop:{
x:stop.x+lNormal.dx,
y:stop.y+lNormal.dy}
},
];
}
Другие советы
Если я понимаю ваш вопрос, он такой же, как это Один, который уже имеет очень подробные ответы.