[英]Draw perpendicular line of fixed length at a point of another line
如果slope
是AB的斜率,则CD的斜率是-1/slope
。 这等于垂直变化与水平变化: dy/dx = -1/slope
。 得出dx = -slope*dx
。 根据毕达哥拉斯定理,您有3**2 = dy**2+dx**2
。 代替dx
,您会得到
3**2 = (-slope*dy)**2+dy**2
3**2 = (slope**2 + 1)*dy**2
dy**2 = 3**2/(slope**2+1)
dy = math.sqrt(3**2/(slope**2+1))
然后可以得到dx = -slope*dy
。 最后,您可以使用dx
和dy
获得C和D。因此代码如下:
import math
dy = math.sqrt(3**2/(slope**2+1))
dx = -slope*dy
C[0] = B[0] + dx
C[1] = B[1] + dy
D[0] = B[0] - dx
D[1] = B[1] - dy
(请注意,尽管math.sqrt
仅返回一个数字,但通常会有一个正负平方根。C对应正平方根,D对应负数)。
您可能应该使用向量来计算点的位置。
vector AB
normalized perpendicular
B
在一个简单的,可重复使用的Vector class
的帮助下,该计算是微不足道的,并且读起来像英语:
在距B
点3
处找到垂直于AB
点:
P1 = B + (BA).perp().normalized() * 3
P2 = B + (BA).perp().normalized() * 3
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def dot(self, other):
return self.x * other.x + self.y * other.y
def norm(self):
return self.dot(self)**0.5
def normalized(self):
norm = self.norm()
return Vector(self.x / norm, self.y / norm)
def perp(self):
return Vector(1, -self.x / self.y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
def __str__(self):
return f'({self.x}, {self.y})'
A = Vector(10, 20)
B = Vector(15, 30)
AB = B - A
AB_perp_normed = AB.perp().normalized()
P1 = B + AB_perp_normed * 3
P2 = B - AB_perp_normed * 3
print(f'Point{P1}, and Point{P2}')
输出:
Point(17.683281572999746, 28.658359213500127), and Point(12.316718427000252, 31.341640786499873)
因为您对使用Shapely感兴趣,所以获得我能想到的垂直线的最简单方法是使用parallel_offset
方法将两条平行线连接到AB,并将它们的端点连接起来:
from shapely.geometry import LineString
a = (10, 20)
b = (15, 30)
cd_length = 6
ab = LineString([a, b])
left = ab.parallel_offset(cd_length / 2, 'left')
right = ab.parallel_offset(cd_length / 2, 'right')
c = left.boundary[1]
d = right.boundary[0] # note the different orientation for right offset
cd = LineString([c, d])
和CD的坐标:
>>> c.x, c.y
(12.316718427000252, 31.341640786499873)
>>> d.x, d.y
(17.683281572999746, 28.658359213500127)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.