如何找到与给定线成 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 负角度,因为默认情况下旋转是逆时针执行的,但我们需要它是顺时针的。