Как получить 4 координаты прямоугольника из 3 координат? - PullRequest
0 голосов
/ 04 июня 2019

Я хочу создать функцию, которая позволит пользователю рисовать прямоугольник из 3 точек (синие точки):

  • Первые две точки образуют ребро (ширину).
  • Третья точка будет определять высоту.

Мне нужна эта пользовательская функция рисования в листовке, однако прямоугольник по умолчанию для листовки создается с двумя диагональными точками: https://leafletjs.com/reference-1.5.0.html#rectangle.

IМне нужно вычислить одну из зеленых точек, но мой маленький мозг, похоже, не может это понять: P

PS / EDIT: Прямоугольник может быть под углом, вот что делает его сложным

enter image description here

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Прямоугольник по умолчанию в 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.

0 голосов
/ 04 июня 2019

при условии, что edge1 = [x1, y1] , edge2 = [x2, y2]

def calculate_edges (edge1,edge2,height)
    edge3 [0] = edge1[0]          //x3
    edge3 [1] = edge1[1] + height //y3
    edge4 [0] = edge2[0]          //x4
    edge4 [1] = edge2[1] + height //y4
return edge3,edge4
0 голосов
/ 04 июня 2019

Предполагая координаты этих 3 точек, - 2, 5 (первая точка) - 5, 5 (второй балл) - х, 8 (третья точка)

первый зеленый будет брать х из одной из первых двух точек, скажем, из первой => 2, а у из третьей точки => 8 поэтому первая зеленая точка находится на 2,8

вторая будет брать x из второй точки => 5, а y из третьей точки => 8 поэтому вторая зеленая точка находится на 5,8

Я не уверен, правильно ли я понимаю ответ.

...