已知三点p1(x1,y1,z1),p2(x2,y2,z2),p3(x3,y3,z3),要求确定的平面方程
关键在于求出平面的一个法向量,为此做向量p1p2(x2-x1,y2-y1,z2-z1),p1p3(x3-x1,y3-y1,z3-z1),平面法线和这两个向量垂直,因此法向量n:
平面方程:a(x-x1)+b(y-y1)+c(z-z1)=0;
d=-a*x1-b*y1-c*z1。
平面平面方程为ax+by+cz+d=0。
[cpp]viewplaincopy- //已知3点坐标,求平面ax+by+cz+d=0;
- voidget_panel(Pointp1,Pointp2,Pointp3,double&a,double&b,double&c,double&d)
- {
- a=((p2.y-p1.y)*(p3.z-p1.z)-(p2.z-p1.z)*(p3.y-p1.y));
- b=((p2.z-p1.z)*(p3.x-p1.x)-(p2.x-p1.x)*(p3.z-p1.z));
- c=((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1. x));
- d=(0-(a*p1.x+b*p1.y+c*p1.z));
- }
- //已知三点坐标,求法向量
- Vec3get_Normal(Pointp1,Pointp2,Pointp3)
- {
- a=((p2.y-p1.y)*(p3.z-p1.z)-(p2.z-p1.z)*(p3.y-p1.y));
- b=((p2.z-p1.z)*(p3.x-p1.x)-(p2.x-p1.x)*(p3.z-p1.z));
- c=((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x));
- returnVec3(a,b,c);
- }
- //点到平面距离
- doubledis_pt2panel(Pointpt,doublea,doubleb,doublec,doubled){
- returnf_abs(a*pt.x+b*pt.y+c*pt.z+d)/sqrt(a*a+b*b+c*c);
- }
参考:http://blog.csdn.net/pvpishard/article/details/7912511
http://mathinsight.org/distance_point_plane
http://blog.csdn.net/threewind/article/details/5980613
http://blog.sina.com.cn/s/blog_648868460100o5ll.html