• 大小: 4KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: C/C++
  • 标签: Barsky裁剪  

资源简介

图形学,用二维直线裁剪--梁友栋-Barsky算法裁剪一直线段;

资源截图

代码片段和文件信息


#include 
#include 
#include 
class wcPt2D;
void myclip(void);

class wcPt2D
{
private:
GLfloat xy;
public:
wcPt2D(GLfloat xt=0.0GLfloat yt=0.0)
{
x=xt;
y=yt;
}
void setCoords(GLfloat xCoordGLfloat yCoord)
{
x=xCoord;
y=yCoord;
}
GLfloat getx() const
{
return x;
}
GLfloat gety() const
{
return y;
}
};
//clipTest函数,根据p、q来判断是舍弃线段还是改变交点的参数。。
//p<0时,参数r用于更新u1;当p>0时参数r用于更新u2。如果更新了u1或u2后使u1>u2则舍弃该线段
//否则,更新适当的u参数,使新值仅仅缩短了县城。
//当p=0且q<0时,舍弃该线程,因为该线段平行于边界并且位于边界之外。
//如果测试完p、q的四个值之后,结果并未舍弃该线段,则由u1、u2值决定裁减线段的端点。
GLint clipTest(GLfloat pGLfloat qGLfloat *u1GLfloat *u2)
{
GLfloat r;
GLint returnValue=true;                 //true:表示舍弃;faule:表示可见。
if(p<0.0)
{
r=q/p;
if(r>*u2)
returnValue=false;
else
if(r>*u1)
*u1=r;                       //u1取“进入“点的最大参数值

}
else
if(p>0.0)
{
r=q/p;
if(r<*u1)
returnValue=false;
else if(r<*u2)
*u2=r;                     //u2取“离开“ 点的最小参数值
}
else                               //p=0,且q<0。平行于边界,而且在界外的线
if(q<0.0)             
returnValue=false;
return (returnValue);
}
void lineClipLiangBarsk(wcPt2D winMinwcPt2D winMaxwcPt2D p1wcPt2D p2)
{
GLfloat u1=0.0u2=1.0dx=p2.getx()-p1.getx()dy;
if(clipTest(-dxp1.getx()-winMin.getx()&u1&u2))
if(clipTest(dxwinMax.getx()-p1.getx()&u1&u2))
{
dy=p2.gety()-p1.gety();
if(clipTest(-dyp1.gety()-winMin.gety()&u1&u2))
if(clipTest(dywinMax.gety()-p1.gety()&u1&u2))
{
if(u2<1.0)
{
p2.setCoords(p1.getx()+u2*dxp1.gety()+u2*dy);//通过u2求得裁剪后的p2端点

}
if(u1>0.0)
{
p1.setCoords(p1.getx()+u

评论

共有 条评论

相关资源