zoukankan      html  css  js  c++  java
  • 空间直线与平面的交点

    这内容属于计算几何,在 3D游戏开发编程基础 或者在游戏开发中的数学和物理算法 这种资料上也可以找到相关的内容和代码。或者更广泛点称为是计算机图形学,

          接下来我们进入正题,如果直线不与平面平行,将存在交点。如下图所示,已知直线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)。定义一个求直线与平面交点坐标的函数CalPlaneLineIntersectPoint(),

    其代码如下:

     1 /// <summary>
     2 /// 求一条直线与平面的交点
     3 /// </summary>
     4 /// <param name="planeVector">平面的法线向量,长度为3</param>
     5 /// <param name="planePoint">平面经过的一点坐标,长度为3</param>
     6 /// <param name="lineVector">直线的方向向量,长度为3</param>
     7 /// <param name="linePoint">直线经过的一点坐标,长度为3</param>
     8 /// <returns>返回交点坐标,长度为3</returns>
     9 
    10 private float[] CalPlaneLineIntersectPoint(float[] planeVector, float[] planePoint, float[] lineVector, float[] linePoint)
    11 {
    12     float[] returnResult = new float[3];
    13     float vp1, vp2, vp3, n1, n2, n3, v1, v2, v3, m1, m2, m3, t,vpt;
    14     vp1 = planeVector[0];
    15     vp2 = planeVector[1];
    16     vp3 = planeVector[2];
    17     n1 = planePoint[0];
    18     n2 = planePoint[1];
    19     n3 = planePoint[2];
    20     v1 = lineVector[0];
    21     v2 = lineVector[1];
    22     v3 = lineVector[2];
    23     m1 = linePoint[0];
    24     m2 = linePoint[1];
    25     m3 = linePoint[2];
    26     vpt = v1 * vp1 + v2 * vp2 + v3 * vp3;
    27     //首先判断直线是否与平面平行
    28     if (vpt == 0)
    29     {
    30         returnResult = null;
    31     }
    32     else
    33     {
    34         t = ((n1 - m1) * vp1 + (n2 - m2) * vp2 + (n3 - m3) * vp3) / vpt;
    35         returnResult[0] = m1 + v1 * t;
    36         returnResult[1] = m2 + v2 * t;
    37         returnResult[2] = m3 + v3 * t;
    38     }
    39     return returnResult;
    40 }
    41                     

    参考了:http://m.blog.csdn.net/article/details?id=6688080

  • 相关阅读:
    Android——Activity去除标题栏和状态栏
    Android——程序员的情怀——优化BaseAdapter
    Android——Android Sutido:[2]导入eclipse项目篇
    【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
    学佛略要
    Keystone, Start, Failed to Load Bson
    又梦见了你
    伦敦之旅
    无题
    Multiverse in Doctor Strange // Multiverse在《神秘博士》
  • 原文地址:https://www.cnblogs.com/www-caiyin-com/p/6758548.html
Copyright © 2011-2022 走看看