OpenGL Cyrus-Beck 凸多边形截取射线

                                           OpenGL  Cyrus-Beck  凸多边形截取射线

 

你可以点此下载完整的实例:

http://rorger.download.csdn.net

 

 

Cyrus-Beck方法截取射线方式基本和线段方式一样;

 

首先是chopCIRadial函数:

int chopCIRadial(double&tIn,double&tOut,double number,double denom) { double tHit ; if(denom < 0) //射线是射入 { tHit = number / denom ; if(tHit>tIn) { tIn = tHit; } } else if(denom > 0) //射线射出 { tHit = number / denom; if (tHit<tIn) { return 0 ; } if (tOut==-1.0) //这是第一次初始化使用的 { tOut = tHit; } else if (tHit<tOut) { tOut = tHit; } } else if(number<=0) //denom为0,射线与直线平行 { return 0 ; //在外半空间 } return 1; }

 

然后是:

int CyrusBeckClipRadial(Point2 S,Vector2 c,Line2List& L,Point2& pIn,Point2& pOut) { double number,denom; double tIn = 0.0,tOut=-1.0; Vector2 tmp ; for (int i=0;i<L.num();i++) { //利用公式 tHit=n*(B-A)/(n*c) 其中A和c是目的直线参数表示,B和n是另一条直线点法向量 tmp = L.line[i].pt - S; number = L.line[i].norm * tmp ; denom = L.line[i].norm * c ; if (!chopCIRadial(tIn,tOut,number,denom)) { return 0 ; //提前结束 } } if (tIn >= 0.0) { pIn=S+c*tIn; } if (tOut > tIn) { pOut=S+c*tOut; } return 1; }

 

 

看看实例结果吧:

 

OpenGL Cyrus-Beck 凸多边形截取射线_第1张图片

 

射线从内往外,被截取的区域是蓝色的。射线端点紫色。

 

你可能感兴趣的:(c,list,vector)