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

7 篇文章 9 订阅

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

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值