繁体   English   中英

如何找到一个点的坐标,使其与给定的线成 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具有可以在此处使用的rotatescale功能:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM