如何找到与给定线成 135 度角的点的坐标?
How to find the coordinates of a point such that it makes a 135 degree angle with a given line?
给定一条线段 uv
我想找到点 x
的坐标,使它们与给定距离 L
构成 135 度角,下面是插图:
我会用三角形来确定 x 的位置,你可以使用 45 45 90 的三角形,因为角度是 135 度。如果它不是 135 度,你可以使用 sin 和 cos 来找到 x
找到uv
向量作为
uv.x = v.x - u.x
uv.y = v.y - u.y
计算其长度
luv = sqrt(uv.x * uv.x + uv.y * uv.y)
在 uv
线的延续处找到与 v
的距离为 L
的点:
px = v.x + L * uv.x / luv
py = v.y + L * uv.y / luv
将此点围绕 v
旋转 45 度 (Pi/4
):
qx = v.x + (p.x - v.x) * cos(Pi/4) - (p.y - v.y) * sin(Pi/4)
qy = v.y + (p.x - v.x) * sin(Pi/4) + (p.y - v.y) * cos(Pi/4)
请注意,我们可以使用坐标差稍微简化最后的表达式
rx = L * uv.x / luv
ry = L * uv.y / luv
将此点围绕 v
旋转 45 度 (Pi/4
):
qx = v.x + rx * cos(Pi/4) - ry * sin(Pi/4)
qy = v.y + rx * sin(Pi/4) + ry * cos(Pi/4)
而且cos(Pi/4)
和sin(Pi/4)
都等于sqrt(2)/2
,所以如果你不需要不同的角度,你可以使用这个常量。
其实,你不必自己计算所有的数学。有几个用于几何计算的库提供的功能只需几行代码即可完成任务。
例如,Shapely has rotate
and scale
可以在这里使用的函数:
from shapely.geometry import LineString
from shapely.affinity import rotate, scale
uv = LineString([(0, 0), (1, 0)])
vx_length = 2
pivot_point = uv.boundary[1]
scale_factor = vx_length / uv.length
uv_rotated = rotate(uv, -135, origin=pivot_point)
vx = scale(uv_rotated,
xfact=scale_factor,
yfact=scale_factor,
origin=pivot_point)
print(vx)
# LINESTRING (2.414213562373095 1.414213562373095, 1 0)
print(vx.length)
# 2.0
请注意,我们应该给 rotate
负角度,因为默认情况下旋转是逆时针执行的,但我们需要它是顺时针的。
给定一条线段 uv
我想找到点 x
的坐标,使它们与给定距离 L
构成 135 度角,下面是插图:
我会用三角形来确定 x 的位置,你可以使用 45 45 90 的三角形,因为角度是 135 度。如果它不是 135 度,你可以使用 sin 和 cos 来找到 x
找到uv
向量作为
uv.x = v.x - u.x
uv.y = v.y - u.y
计算其长度
luv = sqrt(uv.x * uv.x + uv.y * uv.y)
在 uv
线的延续处找到与 v
的距离为 L
的点:
px = v.x + L * uv.x / luv
py = v.y + L * uv.y / luv
将此点围绕 v
旋转 45 度 (Pi/4
):
qx = v.x + (p.x - v.x) * cos(Pi/4) - (p.y - v.y) * sin(Pi/4)
qy = v.y + (p.x - v.x) * sin(Pi/4) + (p.y - v.y) * cos(Pi/4)
请注意,我们可以使用坐标差稍微简化最后的表达式
rx = L * uv.x / luv
ry = L * uv.y / luv
将此点围绕 v
旋转 45 度 (Pi/4
):
qx = v.x + rx * cos(Pi/4) - ry * sin(Pi/4)
qy = v.y + rx * sin(Pi/4) + ry * cos(Pi/4)
而且cos(Pi/4)
和sin(Pi/4)
都等于sqrt(2)/2
,所以如果你不需要不同的角度,你可以使用这个常量。
其实,你不必自己计算所有的数学。有几个用于几何计算的库提供的功能只需几行代码即可完成任务。
例如,Shapely has rotate
and scale
可以在这里使用的函数:
from shapely.geometry import LineString
from shapely.affinity import rotate, scale
uv = LineString([(0, 0), (1, 0)])
vx_length = 2
pivot_point = uv.boundary[1]
scale_factor = vx_length / uv.length
uv_rotated = rotate(uv, -135, origin=pivot_point)
vx = scale(uv_rotated,
xfact=scale_factor,
yfact=scale_factor,
origin=pivot_point)
print(vx)
# LINESTRING (2.414213562373095 1.414213562373095, 1 0)
print(vx.length)
# 2.0
请注意,我们应该给 rotate
负角度,因为默认情况下旋转是逆时针执行的,但我们需要它是顺时针的。