C++求点和平面的关系

本文介绍如何使用三个点来确定一个三维空间中的平面,并通过平面的法向量来判断一个点相对于该平面的位置。包括创建平面、计算点到平面的距离及点和平面相对位置的具体实现。

一个平面通常是由一个平面法线向量,如v1(1,2,3),和点到原点(0,0,0)到平面的距离确定的。

当然数学中还有其他定义方法,但是DirectX和OpenGL都是使用这种定义方法的。这样定义的平面叫一般平面,其实是由点法式平面变形来的。

点我们可以使用Vector3类来确定,这个类既可以确定点,也可以确定向量。

Vector3这个类定义:http://blog.youkuaiyun.com/kenden23/article/details/16901331

下面定义一个平面:

class Plane
{
public:
	float a, b, c, d;
	enum PLAN_STATES
	{
		PLANT_FRONT,
		PLANT_BACK,
		PLANT_ON_PLANE
	};

	Plane():a(0), b(0), c(0), d(0){}
	Plane(float a1, float b1, float c1, float d1):a(a1), b(b1), c(c1), d(d1){}

	void createPlane(Vector3 v1, Vector3 v2, Vector3 v3);
	float distance(float x, float y, float z);
	float distance(Vector3 v);
	PLAN_STATES classifyPoint(float x, float y, float z, float &dist);
};


CreatePlane函数是用三个点确定一个平面,并计算成一般平面,存储好。 classfyPoint这个函数就是用来计算点和平面的关系的。

实现代码:

void Plane::createPlane(Vector3 v1, Vector3 v2, Vector3 v3)
{
	Vector3 t1, t2, n;
	t1 = v2 - v1;
	t2 = v3 - v1;
	n = t1.crossProduct(t2);
	n.normalize();
	a = n.x;
	b = n.y;
	c = n.z;
	d = -(a*v1.x + b*v1.y + c*v1.z);
}

float Plane::distance(float x, float y, float z)
{
	return a*x+b*y+c*z+d;
}

float Plane::distance(Vector3 v)
{
	return a*v.x+b*v.y+c*v.z+d;
}

//Claaisyf a point's position about the plane
Plane::PLAN_STATES Plane::classifyPoint(float x, float y, float z, float &dist)
{
	dist = distance(x,y,z);
	if (dist > uZero)
	{
		return PLANT_FRONT;
	}
	if (dist < -uZero)
	{
		return PLANT_BACK;
	}
	return PLANT_ON_PLANE;
}


以平面的法向量为标准,如果在法向量正方向,那么就是在平面前面,如果在法向量反方向就是在平面后面,在Vector3文件中定义了个uZero = 1e-6 (=0.000001);如果距离少于uZero,那么就是在平面上。因为浮点数是有误差的,所以最好不用0作为比较。

测试代码:

#include<iostream>
#include"Plane.h"

using namespace std;

int main() 
{
	Plane p1;
	Vector3 v1(1.0f, 0.0f, 0.0f);
	Vector3 v2(0.0f, 1.0f, 0.0f);
	Vector3 v3(0.0f, 0.0f, 1.0f);
	p1.createPlane(v1, v2, v3);
	cout<<"We have create a plane:\n";
	cout<<"Plane's a = "<<p1.a<<endl;
	cout<<"Plane's b = "<<p1.b<<endl;
	cout<<"Plane's c = "<<p1.c<<endl;
	cout<<"Plane's d = "<<p1.d<<endl;
	cout<<"v1 to Plane's distance is: "<<p1.distance(v1)<<endl;

	Vector3 v4(8.0f, 8.0f, 8.0f);
	cout<<"Vector3 v4 is: ";
	v4.printVec3();
	cout<<"v4's relationship with plane is: ";
	float dist = 0;
	switch (p1.classifyPoint(v4.x, v4.y, v4.z, dist))
	{
	case Plane::PLANT_BACK:
		cout<<"on the back of the plane.\n";
		break;
	case Plane::PLANT_FRONT:
		cout<<"on the front of the plane.\n";
		break;
	case Plane::PLANT_ON_PLANE:
		cout<<"right on the plane\n";
		break;
	default:
		break;
	}
	cout<<"v4 to plane's distance is: "<<dist<<endl;
	system("pause");
 	return 0;
}


运行结果:

### 回答1: 点到平面距离是指从点到平面上的最短距离。在三维空间中,可以通过以下公式来P(x,y,z)到平面Ax+By+Cz+D=0的距离: d = |Ax + By + Cz + D| / √(A² + B² + C²) 其中,“| |”表示绝对值符号,“√”表示平方根符号。 具体来说,首先需要平面的法向量N(A,B,C),然后用P到平面上任意一Q的向量PQ与法向量N的积作为分子,再出N的模长作为分母即可。 需要注意的是,如果P在平面上,则点到平面距离为0;如果法向量N为零向量,则平面不存在,无法计算点到平面距离。此外,如果平面方程不是标准式,比如写成一般式或法式,需要先转化为标准式才能应用上述公式。 ### 回答2: 点到平面距离是指从该向垂直于平面的方向所作的线段的长度,这一长度可以用向量的内积模长得。 假设的坐标为P(x1,y1,z1),平面的方程为Ax+By+Cz+D = 0。首先,将平面的方程变形为法向量N=(A, B, C)O(任意一,假设坐标为(x0,y0,z0))的内积形式,如下所示: N·(P-O) + D = 0 其中·表示向量的内积。 那么P到平面距离h可以表示为: h = |N·(P-O)| / |N| 其中|N|表示向量N的长度。因此,我们只需要得向量N的长度向量N·(P-O)的长度,就可以P到平面距离h。 具体计算过程如下: 1. 向量N的长度 |N| = sqrt(A^2 + B^2 + C^2) 2. 向量N·(P-O)的长度 N·(P-O) = N·P - N·O = Ax1 + By1 + Cz1 - (Ax0 + By0 + Cz0) 3. 由上述公式计算P到平面距离h h = |N·(P-O)| / |N| 需要注意的是,当向量N为单位向量时,上式中的分母|N|可以省略,计算起来会更加简便。 以上就是点到平面距离的计算方法。这一方法可以用于各种情况下,比如在三维空间中研究平面关系解问题时可以根据具体需要灵活应用。 ### 回答3: 首先,我们需要明确平面的概念。 是几何中没有大小、无限小的一个对象,在空间中被表示为一组坐标。 平面是指没有厚度的无限大平面,可以用两个垂直的轴表示,在三维空间中是一个二维的图形。 平面之间的距离,指的是点到平面上最近的距离。计算点到平面距离的方法如下: 假设的坐标为P(x1,y1,z1),平面的方程为Ax+By+Cz+D=0。 - 平面内一Q的坐标:假设平面上垂直于z轴的直线与该平面的交为Q,则Q的坐标为(x1,y1,-(A*x1+B*y1+D)/C)。 - 出向量PQ:向量PQ的坐标为(PQx,PQy,PQz),其中PQx=x1-x2、PQy=y1-y2、PQz=z1-z2。 - 平面的法向量:平面的法向量为N(A,B,C)。 - 计算点到平面距离点到平面距离为其在法向量方向上的分量,即点到平面距离d=|PQ·N|/|N|。 其中,|PQ·N|表示向量PQ与平面法向量N的积,|N|表示平面法向量N的模长。 举个例子,在三维空间中,P(2,3,4)到平面2x+3y+4z-5=0的距离该如何解呢? 首先,按照上述方法,平面内一Q的坐标:Q(x1,y1,z1)= (2,3,(5-2*2-3*3)/4) = (2,3,-1/2)。 然后,出向量PQ: PQ=(PQx,PQy,PQz)=(2-2,3-3,4-(-1/2))=(0,0,9/2)。 接着,计算平面的法向量N=(2,3,4)。 最后,根据上述公式,P到平面距离:d=|PQ·N|/|N|=|(0,0,9/2)·(2,3,4)|/sqrt(2^2+3^2+4^2)=9/sqrt(29/2)≈5.212。因此,P到平面2x+3y+4z-5=0的距离为约5.212。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值