如何检查一个点是否在两个其他点之间,但不限于在一条直线上对齐?

时间:2015-10-15 17:49:55

标签: math geometry coordinates

我需要检查一个lat-lon坐标(A)是否在两个其他lat-lon坐标(BC之间)。但是,A点不必位于B->C行 请参阅此图片,其中A应计为“BC之间:

enter image description here

我该怎么做这个计算?

PS: 这些位置可以转换为SWEREF99TM,这是一个网格系统,如果更适合计算。我已经有了转换的公式。

2 个答案:

答案 0 :(得分:4)

假设我们在飞机而不是球体上,即使你提到了弧度/经度......

如果角度∠ABC和角度∠ACB都小于或等于90度,则A在“B”和“C之间”。

当然,我们甚至不需要三角测量来检测这一点;如果PQ ^ 2 + QR ^ 2 <1,则角度∠PQR大于90度。 QR ^ 2

def lies_between(A,B,C):
    a = distance(B,C)
    b = distance(C,A)
    c = distance(A,B)
    return a**2 + b**2 >= c**2 and a**2 + c**2 >= b**2

def distance(A,B):
    return math.sqrt((A.x - B.x)**2 + (A.y - B.y)**2)

(其中**是指数运算符。)

答案 1 :(得分:0)

你想要做的是基本上把A投射到BC上。它是不直观但简单的,是点产品最明显的应用。

你可以在这里阅读数学... http://math.oregonstate.edu/home/programs/undergrad/CalculusQuestStudyGuides/vcalc/dotprod/dotprod.html

dot(x, y)成为两个元组的点积,vec(x, y)是从x到y的向量。那么你的答案就是......

// Dot product
dot = lambda d1,d2: sum(a*b for a,b in zip(d1,d2))

// Vector between two points
vec = lambda d1,d2: tuple(b-a for a,b in zip(d1,d2))

BA=vec(b,a)
BC=vec(b,c)

BA_scalar = dot(BA, BC) / dot(BC, BC) # BA * BC / |BC|
# BA_scalar = 0 means A is co-planar with B
# BA_scalar = 1 means A is co-planar with C

is_between = 0 < BA_scalar and BA_scalar < 1

这适用于3d和2d坐标。它在3d中导致有趣的结果,例如,所有赤道点位于10°N,0°和10°S,0°之间,包括在地球的另一端的那些。但这并不一定是错的。