判断点在三角形区域内;求空间直线与平面的交点;

A  求空间直线与平面的交点

  

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z):

                                                                                  

将直线方程写成参数方程形式,即有:

     x = m1+ v1 * t

     y = m2+ v2 * t                                                    (1)

     z = m3+ v3 * t

 

将平面方程写成点法式方程形式,即有:

vp1 * (x – n1) + vp2 * (y – n2) + vp3 * (z – n3) = 0           (2)

 

则直线与平面的交点一定满足式(1)和(2),联立两式,求得:

       t = ((n1 – m1)*vp1+(n2 – m2)*vp2+(n3 – m3)*vp3) / (vp1* v1+ vp2* v2+ vp3* v3)                                       (3)

 

    如果(3)式中分母(vp1* v1+ vp2* v2+ vp3* v3)为0,则表示直线与平面平行,即直线与平面没有交点。

否则求解出t后,然后将t代入式(1)即可求得交点O的坐标(x,y,z)。

B   求空间中直线与一个与一个平面的交点并判断交点是否在某个三角形区域内部

  
解决判断交点是否在某个三角形区域内部的问题

设三角形的三个顶点分别为ABC,需要判断的点为P。这里有几种方法来进行判断:

方法1:用面积来判断。

    点P与三角形三边的组成个了三个三角形:PAB,PAC,PBC。判断它们的面积之和是否与ABC的面积相等。如果相等则需要判断的点在三角形区域内部,否则就在三角形区域外部。

方法2:用角度来判断。

     角APB,BPC,CPA之和是否等于360度,如果等于则需要判断的点在三角形区域内部,否则就在三角形区域外部。

方法3:用向量积来判断。

     沿 △ABC 各有向边按一定方向走(顺时针或逆时针),判断点 P 是否在该边的某侧(右侧或左侧),若点 P 在三条边的同侧,则点 P 在 △ABC 内。沿 △ABC 各有向边按一定方向走(顺时针或逆时针),判断点 P 是否在该边的某侧(右侧或左侧),若点 P 在三条边的同侧,则点 P 在 △ABC 内。 

    方法1较直观,实现起来也比较容易,其中核心问题就是求三角形的面积。最简单的方法就是直接利用空间三角形三点的坐标利用向量的方法求解。三角形面积解决了 判断交点是否在某个三角形区域内部的问题 也就迎刃而解了。

   

          用方法1来求三角形面积如下:

    我们设三角形的三个顶点为A(x0,y0,z0),B(x1,y1,z1),C(x2,y2,z2)。我们将三角形的两条边AB和AC看成是向量。然后,我们以A为原点,进行坐标平移,得到向量AB(x1-x0,y1-y0,z1-z0),向量AC(x2-x0,y2-y0,z2-z0)。

在三维的情况下,直接代入公式,可得向量B和向量C叉乘结果为:

 
                                                  |
          B x C  =  |  x1-x0    y1-y0      z1-z0 |
                  |  x2-x0    y2-y0      z2-z0 |

                        =  ((y1-y0)*(z2-z0) - (y2-y0)*z1- z0),   (x2-x0)*(z1-z0) - (x1-x0)*(z2-z0),    (x1-x0)*(y2-y0) - (x2-x0)*(y1-y0))

它的模一半即为所要求的三角形面积S。

 

计算三角形面积代码实现如下:

float triangleArea(Point * PointA,  Point  PointB,  Point  PointC)

{

    //已知三角形三点坐标ABC, 可求的向量AB 和向量AC

    //向量AB 叉乘向量AC 得到向量AP

    //则向量AP的模的一半即为三角形ABC的面积

 

    Point  AB; //向量AB

    Point  AC; //向量AC

    Point  AP; //向量AP

    float m = 0.0; //向量AP的模

    float area = 0.0; //三角形的面积

 

    //计算向量AB

    AB.x =  PointB->x -  PointA->x;

    AB.y =  PointB->y -  PointA->y;

    AB.z =  PointB->z -  PointA->z;

    //计算向量AC

    AC.x =  PointC->x -  PointA->x;

    AC.y =  PointC->y -  PointA->y;

   AC.z =  PointC->z -  PointA->z;

 

    //计算向量AP

    //         i, j, k

    // AB      x1, y1, z1

    // AC      x2, y2, z2

    // AP     y1*z2 - y2*z1, x2*z1 - x1*z2, x1*y2 - x2*y1

    AP.x = AB.y*AC.z - AC.y*AB.z;

    AP.y = AC.x*AB.z - AB.x*AC.z;

    AP.z = AB.x*AC.y - AC.x*AB.y;

 

    //计算向量AP的模

    m = sqrt(AP.x*AP.x + AP.y*AP.y + AP.x*AP.z);

   //计算三角形的面积

    area = m / 2;


    return area;

}

 

判断空间中一个点是否在一个三角形区域内部 :      tA, tB, tC为三角形三个顶点  tP为欲判断点

 bool isInTriangle(Point *tA, Point *tB, Point *tC, Point *tP)

{

    float area1 = triangleArea(tA,tB,tC);

 

    float area2 = triangleArea(tP, tB,tC);

                        

    float area3 = triangleArea(tA, tP, tC);

 

    float area4 = triangleArea(tA, tB, tP);

 

    //外点分别与三角形两点组成三角形面积和

    float areaAll = area2 + area3 + area4;

    //如果面积相差小于设定的阀值 则认为相等 面积相等则外点在三角形区域内

    if(fabs(areaAll - area1) < area1 / 100.0)  

    {

       //如果在三角形区域内则为有效点

       return true;

    }

 

    return false;

}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值