資源簡介
圖形學作業,用二維直線裁剪--區域編碼算法裁剪一直線段;
代碼片段和文件信息
#include?
#include?
//////////////////////////////////////////////////////////////////////////
//區域碼
const?GLint?leftBitCode=0x1;
const?GLint?rightBitCode=0x2;
const?GLint?buttonBitCode=0x4;
const?GLint?topBitCode=0x8;
GLint?winWidth=640winHeight=480;
class?screenPT
{
public:
GLfloat?xy;
};
inline?GLint?inside(GLint?code){return?GLint(!code);} //判斷點是否在裁剪區內
inline?GLint?reject(GLint?code1GLint?code2){return?GLint(code1&code2);} //判斷能否完全排除一條線段
inline?GLint?accept(GLint?code1GLint?code2){return?GLint(!(code1?|?code2));} //判斷能否完全接受一條線段
inline?void?swapPT(screenPT&?ascreenPT&?b){screenPT?t=a;a=b;b=t;} //交換兩個點
inline?void?swapCode(GLubyte&?aGLubyte&?b){GLubyte?t=a;a=b;b=t;} //交換兩個區域碼
//確定一個點所在位置的區域碼
GLubyte?encode(const?screenPT&?pconst?screenPT&?winMinconst?screenPT&?winMax)
{
GLubyte?code=0x00;
if(p.x code?|=?leftBitCode;
if(p.x>winMax.x)
code?|=?rightBitCode;
if(p.y code?|=?buttonBitCode;
if(p.y>winMax.y)
code?|=?topBitCode;
return?code;
}
//在屏幕上畫一條未裁剪的線,由裁剪函數調用
void?drawOneLine(const?screenPT&?aconst?screenPT&?b)
{
glBegin(GL_LINES);
glVertex2f(a.xa.y);
glVertex2f(b.xb.y);
glEnd();
}
//裁剪函數
void?lineClip(screenPT?winMinscreenPT?winMaxscreenPT?lineBeginscreenPT?lineEnd)
{
GLubyte?code1code2; //保存兩個端點的區域碼
GLboolean?done=falseplotLine=false; //判斷裁剪是否結束和是否要繪制直線
GLfloat?k; //斜率
while(!done)
{
code1?=?encode(lineBeginwinMinwinMax);
code2?=?encode(lineEndwinMinwinMax);
if(accept(code1code2)) //當前直線能完全繪制
{
done=true;
plotLine=true;
}
else
{
if(reject(code1code2)) //當前直線能完全排除
done?=?true;
else
{
if(inside(code1)) //若lineBegin端點在裁剪區內則交換兩個端點使它在裁剪區外
{
swapPT(lineBeginlineEnd);
swapCode(code1code2);
}
//計算斜率
if(lineBegin.x?!=?lineEnd.x)
k?=?(lineEnd.y-lineBegin.y)/(lineEnd.x-lineBegin.x);
//開始裁剪以下與運算若結果為真,
//則lineBegin在邊界外,此時將lineBegin移向直線與該邊界的交點
if(code1?&?leftBitCode)
{
- 上一篇:DDA、中點畫線法、Bresenham算法
- 下一篇:梁友棟-Barsky算法
評論
共有 條評論