Cohen-Sutherland裁剪算法
放在view文件头部
#ifdef _DEBUG
#define new DEBUG_NEW
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#endif
下面是具体代码
//cs编码
int CquhongjuanView::encode(int x,int y)
{
int c = 0;
if (x < cj_win1.x) c |= LEFT;
if (x > cj_win2.x) c |= RIGHT;
if (y < cj_win1.y) c |= BOTTOM;
if (y > cj_win2.y) c |= TOP;
return c;
}
//裁剪窗口坐标,分别为矩形的两个对角顶点(裁剪框)
//记得赋值,赋值之前要赋值为0,不然会报错
CPoint cj_win1;
CPoint cj_win2;
//Cohen-Sutherland裁剪算法 直线坐标(x1,y1)(x2,y2)
void CquhongjuanView::CS(int& x1,int& y1,int& x2,int& y2)
{
CDC* pDC=GetDC();
int x, y;
int code1, code2, code;
code1 = encode(x1, y1);
code2 = encode(x2, y2);
while (code1 != 0 || code2 != 0)
{
if ((code1 & code2)!=0)
return;
if (code1 != 0)
code = code1;
else
code = code2;
if ((LEFT & code)!=0)
{
x = cj_win1.x;
y = y1 + (y2 - y1)*(cj_win1.x - x1) / (x2 - x1);
}
else if ((RIGHT & code)!=0)
{
x = cj_win2.x;
y = y1 + (y2 - y1)*(cj_win2.x - x1) / (x2 - x1);
}
else if ((BOTTOM & code)!=0)
{
y = cj_win1.y;
x = x1 + (x2 - x1)*(cj_win1.y - y1) / (y2 - y1);
}
else if ((TOP & code)!=0)
{
y = cj_win2.y;
x = x1 + (x2 - x1)*(cj_win2.y - y1) / (y2 - y1);
}
if (code == code1)
{
x1 = x; y1 = y; code1 = encode(x1, y1);
}
else
{
x2 = x; y2 = y; code2 = encode(x2, y2);
}
}
pDC->MoveTo(x1,y1);pDC->LineTo(x2,y2);
}
ps:mfc相关直线,圆,椭圆,多边形,填充多边形,裁剪多边形可以关注我的博客