您的位置:首页 > 其它

介绍一个判断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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: