Python计算点到直线距离、直线间交点夹角是比较基础的数学计算,基于向量点积和叉积的概念。
计算点到直线距离
假设有直线L,过点P,直线上有一点A,我们需要计算点P到直线L的距离。假设向量AP和向量AB的点积(dot product)为cosθ:
$$AP·AB = |AP||AB|cosθ$$
则可以得到垂线段的长度:
$$PS = |AP|sinθ = \frac{AP·AB}{|AB|}sinθ$$
因此,点P到直线L的距离为PS。
以下是一条示例:
import math
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
class Line:
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
def point2line(point, line):
A = point.x - line.p1.x
B = point.y - line.p1.y
C = line.p2.x - line.p1.x
D = line.p2.y - line.p1.y
dot = A * C + B * D
len_sq = C * C + D * D
param = -1
if len_sq != 0:
param = dot / len_sq
xx = 0
yy = 0
if param < 0:
xx = line.p1.x
yy = line.p1.y
elif param > 1:
xx = line.p2.x
yy = line.p2.y
else:
xx = line.p1.x + param * C
yy = line.p1.y + param * D
dx = point.x - xx
dy = point.y - yy
return math.sqrt(dx * dx + dy * dy)
计算直线间交点夹角
假设有两条直线L1和L2,它们的法向量分别为n1和n2,则它们的夹角θ可以通过点积计算:
$$\cos(θ) =n_1·n_2$$
如果你需要计算实际的角度值,需要使用反余弦函数acos()。
以下是一条示例:
def vector_angle(v1, v2):
cos_theta = v1.dot(v2) / math.sqrt(v1.norm() * v2.norm())
return math.degrees(math.acos(cos_theta))
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def dot(self, v2):
return self.x * v2.x + self.y * v2.y
def cross(self, v2):
return self.x * v2.y - self.y * v2.x
def norm(self):
return self.dot(self)
def line2line_angle(line1, line2):
v1 = Vector(line1.p2.x - line1.p1.x, line1.p2.y - line1.p1.y)
v2 = Vector(line2.p2.x - line2.p1.x, line2.p2.y - line2.p1.y)
cross = v1.cross(v2)
if cross == 0:
return 0
sign = cross / abs(cross)
return sign * vector_angle(v1, v2)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python计算点到直线距离、直线间交点夹角 - Python技术站