OpenGL 直线和直线 直线和平面求交点

    技术2022-05-19  50

                                  OpenGL 直线和直线   直线和平面求交点

    关于头文件myglbase.h 和 myglbase.cpp的链接

    http://blog.csdn.net/rorger/archive/2011/04/19/6334489.aspx

     

    或者点此下载:

    http://rorger.download.csdn.net/

     

    #include "myglbase.h" #include "iostream" using namespace std ; /* R(t)=A + c*tHit; //直线参数表示 B为另一条上一点,n是另一条直线法向量 PHit为交点 */ int GetLinesIntersect(Point2 A, Vector2 c,Point2 B,Vector2 n, double& tHit,Point2& PHit) { if (n*c==0) { //射线与直线平行 return 0 ; } else { tHit= (n*(B-A))/(n*c); PHit=A+c*tHit; if(n*c >0) { return 1; //射线沿着法向量方向 } else { return -1 ; //射线与法向量相反 } } } // R(t)=A + c*tHit; //直线参数表示 // B为面上一点,n是另一面法向量 // PHit为交点 int GetLinePanelIntersec(Point3 A, Vector3 c,Point3 B,Vector3 n, double& tHit,Point3& PHit) { if (n*c==0) { //射线与直线平行 return 0 ; } else { tHit= (n*(B-A))/(n*c); PHit=A+c*tHit; if(n*c >0) { return 1; //射线沿着法向量方向 } else { return -1 ; //射线与法向量相反 } } } template<class TPoint,class TVector> int TGetLinesOrPanel(TPoint A, TVector c,TPoint B,TVector n, double& tHit,TPoint& PHit) { if (n*c==0) { //射线与直线平行 return 0 ; } else { tHit= (n*(B-A))/(n*c); PHit=A+c*tHit; if(n*c >0) { return 1; //射线沿着法向量方向 } else { return -1 ; //射线与法向量相反 } } } void testLinesIntersect(Point2 A, Vector2 c,Point2 B,Vector2 n, double& tHit,Point2& PHit) { int result = GetLinesIntersect(A,c,B,n,tHit,PHit); if (result == 0) { cout << "射线和直线平行"<<endl ; } else { cout << "tHit="<<tHit<<endl ; cout << "PHit=(" << PHit.x<<","<<PHit.y<<")"<<endl ; if (result >0) { cout <<"射线沿着法向量方向"<<endl ; } else { cout<<"射线和法向量方向相反"<<endl ; } } } void testLinePanelIntersect(Point3 A, Vector3 c,Point3 B,Vector3 n, double& tHit,Point3& PHit) { int result = GetLinePanelIntersec(A,c,B,n,tHit,PHit); if (result == 0) { cout << "射线和直线平行"<<endl ; } else { cout << "tHit="<<tHit<<endl ; cout << "PHit=(" << PHit.x<<","<<PHit.y<<","<<PHit.z<<")"<<endl ; if (result >0) { cout <<"射线沿着法向量方向"<<endl ; } else { cout<<"射线和法向量方向相反"<<endl ; } } } template<class TPoint,class TVector> void testTGetLinesOrPanel(TPoint A, TVector c,TPoint B,TVector n, double& tHit,TPoint& PHit) { int result = TGetLinesOrPanel(A,c,B,n,tHit,PHit); if (result == 0) { cout << "射线与之平行"<<endl ; } else { cout << "tHit="<<tHit<<endl ; cout << PHit<<endl ; if (result >0) { cout <<"射线沿着法向量方向"<<endl ; } else { cout<<"射线和法向量方向相反"<<endl ; } } } int main(int argc,char ** argv) { { Point2 A; Vector2 c ; A.set(2,3); c.set(4,-4); Vector2 n ; Point2 B ; n.set(6,8); B.set(2,7); double tHit ; Point2 PHit ; testLinesIntersect(A,c,B,n,tHit,PHit); //接下来测试之前在两线段求交点中测试的数据 A.set(1,4); c.set(6,-7/2.0); B.set(7/2.0,5/2.0); n.set(-5/2.0,7/2.0); testLinesIntersect(A,c,B,n,tHit,PHit); //tHit = 46/109 ~=0.422018 cout << "接下来使用模板测试ing..."<<endl ; testTGetLinesOrPanel(A,c,B,n,tHit,PHit); } { Point3 A ; Vector3 c ; Vector3 n ; Point3 B ; double tHit ; Point3 PHit ; A.set(2,-4,3); c.set(4,0,-4); n.set(6,9,9); B.set(-7,2,7); testLinePanelIntersect(A,c,B,n,tHit,PHit); cout << "接下来使用模板测试ing..."<<endl ; testTGetLinesOrPanel(A,c,B,n,tHit,PHit); } return 0 ; } /*output: tHit=-4 PHit=(-14,19) 射线和法向量方向相反 tHit=0.422018 PHit=(3.53211,2.52294) 射线和法向量方向相反 接下来使用模板测试ing... tHit=0.422018 (3.53211,2.52294) 射线和法向量方向相反 tHit=-3 PHit=(-10,-4,15) 射线和法向量方向相反 接下来使用模板测试ing... tHit=-3 (-10,-4,15) 射线和法向量方向相反 Press any key to continue . . . */


    最新回复(0)