比较2条线方向

Compare 2 lines direction

我有线点为

line1 = (13.010815620422363, 6.765378475189209), (-9.916780471801758, 12.464008331298828)
line2 = (-28.914321899414062, 2.4057865142822266),(13.973191261291504, -8.306382179260254)

有没有办法从一些公式或代码(python)中获取线的方向?

首先计算两条直线的向量。然后,您可以使用点积计算两个向量之间夹角的余弦值。如果结果接近 1,则两条线指向同一方向。如果结果接近-1,则第二条线指向相反的方向。

import math

line1 = (13.010815620422363, 6.765378475189209), (-9.916780471801758, 12.464008331298828)
line2 = (-28.914321899414062, 2.4057865142822266),(13.973191261291504, -8.306382179260254)

vec1 = (line1[1][0] - line1[0][0], line1[1][1] - line1[0][1])
vec2 = (line2[1][0] - line2[0][0], line2[1][1] - line2[0][1])

cos_angle = (vec1[0] * vec2[0] + vec1[1] * vec2[1]) / math.sqrt((vec1[0]**2 + vec1[1]**2) * (vec2[0]**2 + vec2[1]**2))

在这种情况下,结果是 -0.9999993352122917

你的两条“线”中的每一条都有一个起点和一个终点。这里定义了一个向量,其坐标可以用终点坐标减去起点坐标得到。

要判断两个向量是否同向,可以看它们之间的方向角;或者更好的是,以该角度的余弦值。如果它们正好指向同一方向,则余弦将为 +1;如果它们完全正交则为 0;如果它们指向完全相反的方向,则为 -1。如果不准确,则介于 -1 和 +1 之间。

另请参阅:

考虑到所有这些:

def vector_of_segment(start, end):
  a, b = start
  c, d = end
  return (c - a, d - b)

def scalar_product(u, v):
  a, b = u
  c, d = v
  return a * c + b * d

import math
def norm(u):
  return math.sqrt(scalar_product(u,u))

# python>=3.8: use math.hypot instead of defining your own norm

def cosine_similarity(u,v):
  return scalar_product(u,v) / (norm(u) * norm(v))

def cosine_similarity_of_roads(line1, line2):
  u = vector_of_segment(*line1)
  v = vector_of_segment(*line2)
  return cosine_similarity(u, v)

如果您安装了 numpy 和 scipy 这两个很棒的库之一,您还可以使用这些库中已经实现的余弦相似度版本,而不是自己实现。参考我上面链接的问题的答案。

测试:

>>> line1 = (13.010815620422363, 6.765378475189209), (-9.916780471801758, 12.464008331298828)
>>> line2 = (-28.914321899414062, 2.4057865142822266),(13.973191261291504, -8.306382179260254)
>>> cosine_similarity_of_roads(line1, line2)
-0.9999993352122917

你的线条正好相反。