判断空间中的3个点是否在同一直线上,Python实现
程序员文章站
2021-12-23 19:42:42
...
#判断空间中的3个点是否在同一直线上: 用向量计算时,需要确定两个向量的长度和角度(角度由x、y、z轴的值确定)都相等,才能确保在同一直线上
@staticmethod
def isThreePointsInSameLine(p1, p2, p3):
distance12 = MathTool.getDistanceBetweenTwoPoints(p1, p2)
distance23 = MathTool.getDistanceBetweenTwoPoints(p2, p3)
distance13 = MathTool.getDistanceBetweenTwoPoints(p1, p3)
#p1->p2的单位向量。
p12X = math.fabs((p1.x - p2.x) / distance12)
p12Y = math.fabs((p1.y - p2.y) / distance12)
p12Z = math.fabs((p1.z - p2.z) / distance12)
#p2->p3的单位向量
p23X = math.fabs((p2.x - p3.x) / distance23)
p23Y = math.fabs((p2.y - p3.y) / distance23)
p23Z = math.fabs((p2.z - p3.z) / distance23)
#p1->p3的单位向量。
p13X = math.fabs((p1.x - p3.x) / distance13)
p13Y = math.fabs((p1.y - p3.y) / distance13)
p13Z = math.fabs((p1.z - p3.z) / distance13)
err = R2.lineError #自定义的一个误差范围
#如果p1->p2的单位向量与p2->p3的单位向量相等则表示在同一直线上。
#由于向量是带方向的,但是相反方向的两个向量仍然在同一直线上
#由于不是点的坐标不完全精确,所以要容忍一定的误差
if MathTool.isInRange(p12X, p23X, err) and MathTool.isInRange(p12Y, p23Y, err) and MathTool.isInRange(p12Z, p23Z, err):
if MathTool.isInRange(p12X, p13X, err) and MathTool.isInRange(p12Y, p13Y, err) and MathTool.isInRange(p12Z, p13Z, err):
return True
return False
#计算空间上两个点的距离。
#点在空间的坐标类似于p (x, y, z)
@staticmethod
def getDistanceBetweenTwoPoints(p1, p2):
return math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2 + (p1.z - p2.z) ** 2)
#是否在误差范围内:这里的error是在Resource中定义的键长、键角等误差
#如果A - error <= B <= A + error,则认为A在B的误差范围内
#通过数学证明,参数A和B等价,也就是将A和B互换后不影响结果
@staticmethod
def isInRange(A, B, error):
if A - error <= B <= A + error:
return True
else:
return False
上一篇: 1010: 平行四边形
下一篇: javascript倒计时