介绍一个判断3D中N个点共线的方法

  本文介绍一种判断3D中N个点共线的方法。算法基本思想是:以第一个点和最后一个点的向量为基准向量,分别计算中间N-2个点到该向量中的距离,如果该距离中的最大值小于某一给定的阈值则这些点共线,否则不共线。下面的代码给出了求N-2个点到基向量的最大距离,根据这个值与给定的阈值比较判断点是否共线。注意:代码中没有考虑特出情况,比如首末点重合的情况等,项目中使用时需要加以考虑。

 float Distance(point3f* P, int n) { int i; point3f* W = new point3f[n]; point3f Q; float a, d; a = sqrt((double)((P[3].x – P[0].x) * (P[3].x – P[0].x) + (P[3].y – P[0].y) * (P[3].y – P[0].y) + (P[3].z – P[0].z) * (P[3].z – P[0].z))); if (a < 0.1) { return 0.0; } // 平移控制多边形使p0点位于坐标原点,并将结果保存在W中 for (i = 1; i < n; i++) { W[i].x = P[i].x – P[0].x; W[i].y = P[i].y – P[0].y; W[i].z = P[i].z – P[0].z; } W[0].x = W[0].y = W[0].z = 0.0; // 单位化向量W0Wn a = sqrt((double)(W[n].x * W[n].x + W[n].y * W[n].y + W[n].z * W[n].z)); W[n].x /= a; W[n].y /= a; W[n].z /= a; // 求W[i], i = 1,2,…,n-1到向量W0Wn间的最大距离 d = 0.0; for (i = 1; i < n – 1; i++) { // 此处a为向量W[0]W[i]在向量W[0]W[n]上投影的长度 a = W[i].x * W[n].x + W[i].y * W[n].y + W[i].z * W[i].z; // Q为向量W[0]W[i]在向量W[0]W[n]上投影 Q.x = W[0].x + a * W[n].x; Q.y = W[0].y + a * W[n].y; Q.z = W[0].z + a * W[n].z; // 向量W[0]W[i]在向量W[0]W[n]上投影对应的垂直向量 Q.x = W[i].x – Q.x; Q.y = W[i].y – Q.y; Q.z = W[i].z – Q.z; a = sqrt( (double)(Q.x * Q.x + Q.y * Q.y + Q.z * Q.z)); if (d < a) { d = a; } } return d; }

    原文作者:rabbit729
    原文地址: https://blog.csdn.net/rabbit729/article/details/4426471
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞