• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            cc

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              38 隨筆 :: 14 文章 :: 21 評(píng)論 :: 0 Trackbacks

            class CVector 
            {
            public:
             union
             {
              float vec[3];
              struct  { float x,y,z;};
             };
            }

            class CCommonTools 
            {
            public:
             CCommonTools();
             virtual ~CCommonTools();
            public:
             static bool ValidPoint(CVector &LinePoint, CVector &LineV,
                                              CVector &TrianglePoint1, CVector &TrianglePoint2, CVector &TrianglePoint3,CVector &result);
             static float Area(float a, float b, float c);
             static float Distance(CVector &p1, CVector &p2);
            };

            ///////////////////////////////

            CCommonTools::CCommonTools()
            {

            }

            CCommonTools::~CCommonTools()
            {

            }
            //計(jì)算p1到p2的距離的平方
            float CCommonTools::Distance(CVector &p1, CVector &p2)
            {
             float dist;
             dist = ((p2.x-p1.x)*(p2.x-p1.x)
              + (p2.y-p1.y)*(p2.y-p1.y)
              + (p2.z-p1.z)*(p2.z-p1.z));
             return (float)sqrt(dist);
            }
            //利用海倫公式求變成為a,b,c的三角形的面積
            float CCommonTools::Area(float a, float b, float c)
            {
             float s = (a+b+c)/2;
             return (float)sqrt(s*(s-a)*(s-b)*(s-c));
            }
            bool CCommonTools::ValidPoint(CVector &LinePoint1, CVector &LinePoint2, CVector &TrianglePoint1, CVector

            &TrianglePoint2,CVector &TrianglePoint3,CVector &result)
            {
              //三角形所在平面的法向量
              CVector TriangleV;
              //三角形的邊方向向量
              CVector VP12, VP13;
              //直線與平面的交點(diǎn)
              CVector CrossPoint;
              //平面方程常數(shù)項(xiàng)
              float TriD;
              CVector LineV = LinePoint2 - LinePoint1;
              /*-------計(jì)算平面的法向量及常數(shù)項(xiàng)-------*/
              //point1->point2
              VP12.x = TrianglePoint2.x - TrianglePoint1.x;
              VP12.y = TrianglePoint2.y - TrianglePoint1.y;
              VP12.z = TrianglePoint2.z - TrianglePoint1.z;
              //point1->point3
              VP13.x = TrianglePoint3.x - TrianglePoint1.x;
              VP13.y = TrianglePoint3.y - TrianglePoint1.y;
              VP13.z = TrianglePoint3.z - TrianglePoint1.z;
              //VP12xVP13
              TriangleV.x = VP12.y*VP13.z - VP12.z*VP13.y;
              TriangleV.y = -(VP12.x*VP13.z - VP12.z*VP13.x);
              TriangleV.z= VP12.x*VP13.y - VP12.y*VP13.x;
              //計(jì)算常數(shù)項(xiàng)
              TriD = -(TriangleV.x*TrianglePoint1.x
                + TriangleV.y*TrianglePoint1.y
                + TriangleV.z*TrianglePoint1.z);
              /*-------求解直線與平面的交點(diǎn)坐標(biāo)---------*/
              /* 思路:
               *     首先將直線方程轉(zhuǎn)換為參數(shù)方程形式,然后代入平面方程,求得參數(shù)t,
               * 將t代入直線的參數(shù)方程即可求出交點(diǎn)坐標(biāo)
              */
              float tempU, tempD;  //臨時(shí)變量
              tempU = TriangleV.x*LinePoint1.x + TriangleV.y*LinePoint1.y
                + TriangleV.z*LinePoint1.z + TriD;
              tempD = TriangleV.x*LineV.x + TriangleV.y*LineV.y + TriangleV.z*LineV.z;
              //直線與平面平行或在平面上
              if(tempD == 0.0)
              {
              // printf("The line is parallel with the plane.\n");
               return false;
              }
              //計(jì)算參數(shù)t
              float t = -tempU/tempD;
              //計(jì)算交點(diǎn)坐標(biāo)
              CrossPoint.x = LineV.x*t + LinePoint1.x;
              CrossPoint.y = LineV.y*t + LinePoint1.y;
              CrossPoint.z = LineV.z*t + LinePoint1.z;
              /*----------判斷交點(diǎn)是否在三角形內(nèi)部---------*/

              //計(jì)算三角形三條邊的長(zhǎng)度
              float d12 = Distance(TrianglePoint1, TrianglePoint2);
              float d13 = Distance(TrianglePoint1, TrianglePoint3);
              float d23 = Distance(TrianglePoint2, TrianglePoint3);
              //計(jì)算交點(diǎn)到三個(gè)頂點(diǎn)的長(zhǎng)度
              float c1 = Distance(CrossPoint, TrianglePoint1);
              float c2 = Distance(CrossPoint, TrianglePoint2);
              float c3 = Distance(CrossPoint, TrianglePoint3);
              //求三角形及子三角形的面積
              float areaD = Area(d12, d13, d23);  //三角形面積
              float area1 = Area(c1, c2, d12);    //子三角形1
              float area2 = Area(c1, c3, d13);    //子三角形2
              float area3 = Area(c2, c3, d23);    //子三角形3
              //根據(jù)面積判斷點(diǎn)是否在三角形內(nèi)部
              if(fabs(area1+area2+area3-areaD) > 0.001)
              {
              return false;
              }


              result = CrossPoint;
              return true;
            }

            這幾天同學(xué)問(wèn)我如何判斷空間中的線段和三角面片是否相交,我想這個(gè)也許對(duì)其他人也有點(diǎn)用處。

            上面的代碼是判斷兩點(diǎn)構(gòu)成的直線和三點(diǎn)構(gòu)成的面片是否相交,要判斷線段的話,需要再判斷交點(diǎn)是否在線段的兩個(gè)端點(diǎn)之間:  交點(diǎn)和兩個(gè)端點(diǎn)可以形成兩個(gè)向量,判斷這兩個(gè)向量的方向即可。

            posted on 2008-07-17 09:26 醒目西西 閱讀(2439) 評(píng)論(0)  編輯 收藏 引用
            亚洲国产精品无码久久久久久曰| 久久久久久久久久久久中文字幕 | 久久无码人妻精品一区二区三区 | 久久综合久久综合九色| 国产精品美女久久久久av爽| 久久强奷乱码老熟女网站| 一本久久a久久精品亚洲| 国产福利电影一区二区三区久久久久成人精品综合 | 99国内精品久久久久久久| 深夜久久AAAAA级毛片免费看| 无码国内精品久久人妻蜜桃| 91精品国产综合久久四虎久久无码一级 | 久久亚洲国产成人影院网站 | 青青青伊人色综合久久| 久久精品免费一区二区| 亚洲成人精品久久| 久久无码人妻一区二区三区午夜| 久久久久亚洲AV成人网人人软件| 色8久久人人97超碰香蕉987| 日韩亚洲国产综合久久久| 一本久久久久久久| 国产精品久久午夜夜伦鲁鲁| 人妻无码αv中文字幕久久琪琪布| 青青青国产成人久久111网站| 久久久久亚洲AV无码永不| 日韩精品久久久久久久电影| 久久AⅤ人妻少妇嫩草影院| 久久777国产线看观看精品| 国内精品伊人久久久久777| 亚洲精品午夜国产va久久| 久久午夜无码鲁丝片午夜精品| 免费观看成人久久网免费观看| 72种姿势欧美久久久久大黄蕉| 人妻无码αv中文字幕久久| 777午夜精品久久av蜜臀| 久久天天躁狠狠躁夜夜2020一 | 漂亮人妻被中出中文字幕久久| 久久综合一区二区无码| 色综合久久夜色精品国产| 久久天天躁狠狠躁夜夜不卡| 亚洲色婷婷综合久久|