介绍一个判断3D中N个点共线的方法
2009-08-08 22:01
176 查看
本文介绍一种判断3D中N个点共线的方法。算法基本思想是:以第一个点和最后一个点的向量为基准向量,分别计算中间N-2个点到该向量中的距离,如果该距离中的最大值小于某一给定的阈值则这些点共线,否则不共线。下面的代码给出了求N-2个点到基向量的最大距离,根据这个值与给定的阈值比较判断点是否共线。注意:代码中没有考虑特出情况,比如首末点重合的情况等,项目中使用时需要加以考虑。
float Distance(point3f* P, int n) { int i; point3f* W = new point3f ; 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 .x * W .x + W .y * W .y + W .z * W .z)); W .x /= a; W .y /= a; W .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 上投影的长度 a = W[i].x * W .x + W[i].y * W .y + W[i].z * W[i].z; // Q为向量W[0]W[i]在向量W[0]W 上投影 Q.x = W[0].x + a * W .x; Q.y = W[0].y + a * W .y; Q.z = W[0].z + a * W .z; // 向量W[0]W[i]在向量W[0]W 上投影对应的垂直向量 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; }
相关文章推荐
- python判断一个集合是否包含了另外一个集合中所有项的方法
- WPF 3D模型的一个扩展方法
- 求大于整数m且紧靠m的k个素数 及 判断一个数是否为素数的方法
- Delphi判断一个字符是否为汉字的最佳方法
- python判断一个集合是否包含了另外一个集合中所有项的方法
- 如何判断一个网页是刷新还是关闭的方法。
- 介绍一个新推出的免费的用于点云的2D/3D的处理的开源项目Point Clouds Library (PCL)
- jquery判断至少有一个checkbox被选中的方法
- 提供一个“多线程(或进程)同时退出时判断是哪些线程退出”的方法
- 一个判断点是否在三角形内的简单方法
- php判断一个数组是否为有序的方法
- 几种判断一个整数是否是2的n次方幂的方法
- 判断一个对象是否可迭代 的方法
- iOS开发Xcode崩溃在main函数入口时如何定位Bug的一个小方法以及一个恶心的bug介绍
- 判断一个变量是数组Array类型的方法
- Linux下如何结束一个应用程序(比如死循环的程序)?两种方法介绍给大家
- 判断一个access数据库中某个表是否存在的方法
- 在 Delphi 中判断一个字符是中文的方法
- JS判断一个数组中是否有重复值的三种方法
- java 判断一个url是否可以访问的方法