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

Math 如何检查一个点是否位于其他两个点之间,但不限于在直线上对齐?,math,geometry,coordinates,Math,Geometry,Coordinates,我需要检查横向坐标(a)是否位于其他两个横向坐标(B和C)之间。但是,点A不必在B->C线上 参考此图,其中A应计为“介于B和C之间”: 我怎样计算呢 PS:如果更适合使用SWEREF99TM进行计算,则可以将位置转换为SWEREF99TM,这是一种网格系统。我已经有了转换的公式。假设我们在一个平面上,而不是一个球体上,即使你提到了晶格度/经度 A在B和C之间,如果角度∠ABC与角度∠ACB均小于或等于90度 简单地说,我们甚至不需要三角学来检测这一点;角度∠当PQ^2+QR^2

我需要检查横向坐标(
a
)是否位于其他两个横向坐标(
B
C
)之间。但是,点
A
不必在
B->C
线上
参考此图,其中
A
应计为“介于
B
C
之间”:

我怎样计算呢


PS:如果更适合使用SWEREF99TM进行计算,则可以将位置转换为SWEREF99TM,这是一种网格系统。我已经有了转换的公式。

假设我们在一个平面上,而不是一个球体上,即使你提到了晶格度/经度

A在B和C之间,如果角度∠ABC与角度∠ACB均小于或等于90度

简单地说,我们甚至不需要三角学来检测这一点;角度∠当PQ^2+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)

(其中,
**
是求幂运算符。)

假设我们在一个平面而不是一个球体上,即使你提到了晶格度/经度

A在B和C之间,如果角度∠ABC与角度∠ACB均小于或等于90度

简单地说,我们甚至不需要三角学来检测这一点;角度∠当PQ^2+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)

(其中,
**
是求幂运算符。)

您要做的基本上是将A投影到BC上。它不直观但简单,是dot产品最明显的应用

你可以在这里读数学。。。

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
//点积
点=λd1,d2:总和(a*b表示a,b表示压缩(d1,d2))
//两点间的向量
vec=lambda d1,d2:tuple(b-a表示a,b表示zip中的b(d1,d2))
BA=vec(b,a)
BC=vec(b,c)
BA_标量=点(BA,BC)/点(BC,BC)#BA*BC/| BC|
#BA_标量=0表示A与B共面
#BA_标量=1表示A与C共面
_是否介于=0

这适用于三维和二维坐标。然而,它在3d中产生了有趣的结果,例如,所有赤道点位于10°N、0°和10°S、0°之间,包括地球另一端的点。但这并不一定是错的。

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

你可以在这里读数学。。。

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
//点积
点=λd1,d2:总和(a*b表示a,b表示压缩(d1,d2))
//两点间的向量
vec=lambda d1,d2:tuple(b-a表示a,b表示zip中的b(d1,d2))
BA=vec(b,a)
BC=vec(b,c)
BA_标量=点(BA,BC)/点(BC,BC)#BA*BC/| BC|
#BA_标量=0表示A与B共面
#BA_标量=1表示A与C共面
_是否介于=0

这适用于三维和二维坐标。然而,它在3d中产生了有趣的结果,例如,所有赤道点位于10°N、0°和10°S、0°之间,包括地球另一端的点。但这并不一定是错的。

再看一眼,这种方法可能也适用于球面几何体。。。不确定它在几乎相反的B点和C点上是否正常工作。这不符合要求。。。请看我在这里使用的代码:哦,我的道歉。我的
return
语句错误-它检查的是角度BAC,而不是角度ABC。已编辑。修改后,此功能完美无瑕!谢谢你的帮助!再看看,这种方法可能也适用于球面几何体。。。不确定它在几乎相反的B点和C点上是否正常工作。这不符合要求。。。请看我在这里使用的代码:哦,我的道歉。我的
return
语句错误-它检查的是角度BAC,而不是角度ABC。已编辑。修改后,此功能完美无瑕!谢谢你的帮助!请更清楚地定义“中间”。是否包括绘制线之间的所有点,包括距离B和C非常远的点?请更清楚地定义“中间点”。是否包括绘制线之间的所有点,包括距离B和C非常远的点?