mfc 直线的裁剪 Cohen-Sutherland裁剪算法

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 11:12   34   0

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相关直线,圆,椭圆,多边形,填充多边形,裁剪多边形可以关注我的博客

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP