如何从 3 个坐标获取矩形的 4 个坐标?

How to get the 4 coordinates of a rectangle from 3 coordinates?

我想创建一个允许用户从 3 个点(蓝点)绘制矩形的函数:

我需要传单中的这个自定义绘图功能,但是传单的默认矩形是用 2 个对角点创建的:https://leafletjs.com/reference-1.5.0.html#rectangle

我需要计算其中一个绿点,但我的小脑袋似乎想不出来:P

PS/EDIT:矩形可能是有角度的,这就是它具有挑战性的原因

假设提供了这 3 个点的坐标, - 2, 5 (第一点) - 5, 5(第二点) - x, 8 (第三点)

第一个果岭将从前两个点中的一个点取 x,比方说从第一个点取 => 2,从第三个点取 y => 8 所以第一个绿点在 2,8

第二个将从第二点取 x => 5,从第三点取 y => 8 所以第二个绿点在 5,8

我不确定我是否理解正确答案。

假设 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

Leaflet's default rectangle is created with 2 diagonal points

[...]

The rectangle might be angled, this is what makes it challenging

请注意,Leaflet 的 L.Rectangle 是从 L.LatLngBounds、边界框 创建的,其中边缘与坐标网格 隐式对齐。不要使用边界框,而是依赖 L.Polygon,提供所有四个点。


设A和B为矩形底部的点,C为顶部的点。假设所有点都是 Javascript 形式的 {x: Number, y: Number} 结构,并假设您在欧几里德平面内工作(即不在大地水准面的表面上),

首先是calculate the distance from a point to a line defined by the other two points,即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的unit vector:

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 };

...并通过将 A 和 B 偏移矩形边的向量来创建新点 D 和 E:

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.

定义的直线中

对于Python:

#Given three points fit a rectangle

import math 
a,b,c=[1,4],[3,4],[3,10] #Sample numbers

#Distance from dot C to line AB (https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points)
distance= abs((b[1]-a[1])*c[0] - (b[0]-a[0])*c[1] + b[0]*a[1] - b[1]*a[0] ) / math.sqrt((b[1]-a[1])**2 + (b[0]-a[0])**2)
print(distance)
#let AB be the vector from A to B
ab=[b[0]-a[0],b[1]-a[1]]

#unit vector perpendicular to AB (https://en.wikipedia.org/wiki/Unit_vector)
perpendicularSize = math.sqrt(ab[0]**2+ab[1]**2)
unit = [-ab[1]/perpendicularSize ,ab[0]/perpendicularSize]

#Multiply that unit vector by the distance from C to AB to get the vectors for the "sides" of your rectangle
sideVector = [unit[0]*distance,unit[1]*distance]

#create new points D and E by offsetting A and B by the vector for the sides of the rectangle
d=[a[0]+sideVector[0],a[1]+sideVector[1]]
e=[b[0]+sideVector[0],b[1]+sideVector[1]]

print(e,d)  #[3.0, 10.0] [1.0, 10.0]