如何从 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]
我想创建一个允许用户从 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]