Прямоугольник по умолчанию в Leaflet создается с 2 диагональными точками
[...]
Прямоугольник может быть угловым, что делает его сложным
Помните, что Leaflet L.Rectangle
создан из L.LatLngBounds
, ограничивающего прямоугольника , в котором края неявно выровнены по координатной сетке .Не используйте ограничивающие рамки, и вместо этого используйте L.Polygon
, предоставляя все четыре точки.
Пусть A и B - точки основания прямоугольника, а C - точка наТоп.Предполагая, что все точки являются структурами Javascript вида {x: Number, y: Number}
, и предполагая, что вы работаете в евклидовой плоскости (т.е. не на поверхности геоида),
Сначала вычислите расстояние отточка на линии, определяемой двумя другими точками , т. е. расстояние от C до линии, определяемой AB.Пусть это будет distance
(обратите внимание, что оно равно «высоте» на вашей диаграмме):
var distance = Math.abs(
(A.y - B.y) * C.x - (A.x - B-x) * C.y + B.x * A.y - B.y * A.x )
) / Math.sqrt(
Math.pow(B.y - A.y, 2) + Math.pow(B.x - A.x, 2)
);
Тогда пусть AB будет вектором от A до B
var AB = { x: B.x - A.x, y: B.y - A.y };
(Обратите внимание, что длина AB равна «ширине» на вашей диаграмме)
Рассчитать единичный вектор перпендикулярно AB:
var perpendicular = {x: -AB.y, y: AB.x}
var perpendicularSize = Math.sqrt(AB.x * AB.x + AB.y * AB.y);
var unit = {x: perpendicular.x / perpendicularSize, y: perpendicular.y / perpendicularSize};
Умножить этот единичный вектор нарасстояние от C до AB, чтобы получить векторы для «сторон» вашего прямоугольника:
var sideVector = { x: unit.x * distance, y: unit.y * distance };
... и создать новые точки D и E, смещая A и B на вектор для сторонпрямоугольник:
var D = { x: A.x + sideVector.x, y: A.y + sideVector.y };
var E = { x: B.x + sideVector.x, y: B.y + sideVector.y };
... И ваш прямоугольник теперь определяется точками ABDE.Обратите внимание, что C находится на линии, определяемой точками DE.