三维空间——点线面关系

网友投稿 1068 2022-08-27

三维空间——点线面关系

三维空间——点线面关系

最基础最重要的概念——叉积,说到叉积就要聊聊行列式。

行列式的代数意义与Cramer法则联系密切,先来个简单的例子,

消除x2得到这样的结果:

.    行列式

正是那个分母,其计算和叉积一样。

行列式的几何意义更加丰富,面积,体积……如上面的那个行列式就是向量为

的叉积。也就是他们构成的平面的有向面积。

推广到三阶就是在x,y,z轴向量方向上的有向体积。

故在三维空间中,向量

的叉积应该是(参照上图)。几何意义是对应平面的垂直向量,于是乎很多的问题得到了解决:

#include #include #include using namespace std;const double eps=1e-7;struct point{ double x,y,z; point(){} point(double p1,double p2,double p3){ x=p1; y=p2; z=p3; }};// 叉积point xmulti(point p1,point p2){ return point(p1.y*p2.z-p1.z*p2.y,p1.z*p2.x-p1.x*p2.z,p1.x*p2.y-p1.y*p2.x);}// 点积double dmulti(point p1,point p2){ return p1.x*p2.x+p1.y*p2.y+p1.z*p2.z;}// 向量之差point sub(point p1,point p2){ return point(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z);}// 向量长度double len(point p){ return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);}// 四点共面bool Plane4(point p1,point p2,point p3,point p4){ point v=xmulti(sub(p2,p3),sub(p2,p4)); if(fabs(dmulti(sub(p1,p2),v))

线与面:

// ----判断线面相交----// 判断两点在平面同侧 点积等于0表示在平面上bool same_side(point p1,point p2,point s1,point s2,point s3){ point v=xmulti(sub(s1,s2),sub(s2,s3)); //平面法向量 return dmulti(v,sub(s1,p1))*dmulti(v,sub(s1,p2))>eps;}// 判断线和平面平行bool paral(point p1,point p2,point s1,point s2,point s3){ return dmulti(sub(p1,p2),xmulti(sub(s1,s2),sub(s2,s3)))

面与面:

// 判断两平面是否平行struct plane{ point s1,s2,s3; plane(point p1,point p2,point p3):s1(p1),s2(p2),s3(p3){} point getv(){ point v=xmulti(sub(s1,s2),sub(s2,s3)); return v; }};//判断面面平行bool Plane_paral(plane S1,plane S2){ point v1=S1.getv(),v2=S2.getv(); return len(xmulti(v1,v2))

//面面相交的交点struct line{ point p1,p2; line():p1(),p2(){}; line(point _p1,point _p2):p1(_p1),p2(_p2){}};bool same_side(point p1,point p2,plane S){ point v=xmulti(sub(S.s1,S.s2),sub(S.s2,S.s3)); //平面法向量 return dmulti(v,sub(S.s1,p1))*dmulti(v,sub(S.s1,p2))>eps;}bool paral(point p1,point p2,plane S){ return dmulti(sub(p1,p2),xmulti(sub(S.s1,S.s2),sub(S.s2,S.s3)))

点到线:

设直线是P1P2,线外的一个点P3,求点到直线投影点

关键的两个向量是p3-p,p2-p1,他们满足(p3-p)(p2-p1)=0 (点积) (1)

设相关比例u,满足p=p1+(p2-p1)u (2)

将(2)带入(1)有:

那么P的坐标用(2)即可求出

至于距离,用面积解决。

// 距离方double dis2(point p1,point p2){ return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z);}// 向量之差point sub(point p1,point p2){ return point(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z);}// 向量长度double len(point p){ return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);}// 投影点point toLineP(point p,line L){ point V31=sub(p,L.p1); point V21=sub(L.p2,L.p1); double u=dmulti(V31,V21)/dis2(L.p1,L.p2); point res(L.p1); res.x+=(L.p2.x-L.p1.x)*u; res.y+=(L.p2.y-L.p1.y)*u; res.z+=(L.p2.z-L.p1.z)*u; return res;}// 点到线的距离double toLineDis(point p,line L){ return len(xmulti(sub(L.p1,p),sub(L.p1,L.p2)))/sqrt(dis2(L.p1,L.p2));}

点到面的距离:

借助法向量可以发现,距离即是op'。op'的距离也即是

struct plane{ point s1,s2,s3; plane(point p1,point p2,point p3):s1(p1),s2(p2),s3(p3){} point getv(){ point v=xmulti(sub(s1,s2),sub(s2,s3)); return v; }};double pToPlane(point p,plane S){ point v=xmulti(sub(S.s1,S.s2),sub(S.s2,S.s3)); return fabs(dmulti(v,sub(S.s1,p))/len(v));}

-------------

先到这里。。。 在以后的时间里,还得继续查看它们有哪些错误。。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:矩形切割-面积求并
下一篇:四面体体积求法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~