判断空间中的3个点是否在同一直线上,Python实现

	#判断空间中的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
            

ps: 判断三个点是否在同一直线上的这个函数其实还是有点问题的:只考虑相同方向,没有考虑相反方向。但是这个项目已经结束了,软件也没有因为这个问题出过问题,我也就不准备再修复这个问题了。

猜你喜欢

转载自blog.csdn.net/wangeil007/article/details/107769991