欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断空间中的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
            
相关标签: 几何学