好文档 - 专业文书写作范文服务资料分享网站

计算机图形学 二维裁剪算法Cohen_Sutherland的实现

天下 分享 时间: 加入收藏 我要投稿 点赞

nCode = nCode | 0x02; if(y > BOTTOM) nCode = nCode | 0x04; if(y < TOP) nCode = nCode | 0x08; return nCode; }

剪裁部分:

void CClipView::CLIP_Line_Cohen_Sutherland(CPoint &P1, CPoint &P2) { int nCode1 = 0; int nCode2 = 0; nCode1 = Encode(P1.x, P1.y); nCode2 = Encode(P2.x, P2.y); if(nCode1 ==0 && nCode2 ==0) return; //直线在裁剪窗口内,直接返回 else if((nCode1 & nCode2) != 0) { P1 = CPoint(0,0); P2 = CPoint(0,0); return; //直线在裁剪窗口外,将直线的两个端点赋为0,返回 } double wx = P2.x - P1.x; double wy = P2.y - P1.y; double dX = 0; double dY = 0; while(nCode1 != 0 || nCode2 != 0) { int nCode = nCode1; if(nCode1 == 0) nCode = nCode2; if((nCode & 0x01) == 0x01) //说明左边与边界有交点 { dX = LEFT; dY = P1.y + wy * (LEFT-P1.x)/wx; } else if((nCode & 0x02) == 0x02) //说明右边与边界有交点 { dX = RIGHT; dY = P1.y + wy * (RIGHT-P1.x)/wx; }

else if((nCode & 0x04) == 0x04) //说明下边与边界有交点 { dX = (BOTTOM-P1.y) * wx / wy + P1.x; dY = BOTTOM; } else if((nCode & 0x08) == 0x08) //说明上边与边界有交点 { dX = (TOP-P1.y) * wx / wy + P1.x; dY = TOP; } if(nCode == nCode1) { P1 = CPoint((int)(dX+0.4),(int)(dY+0.4)); nCode1 = Encode(P1.x,P1.y); } else { P2 = CPoint((int)(dX+0.4),(int)(dY+0.4)); nCode2 = Encode(P2.x,P2.y); } } }

void CClipView::OnClipLineCohenSutherland() { CPoint P1 = CPoint(80,400); CPoint P2 = CPoint(200,80); CDC *pDC = this->GetDC(); CPen newPen(PS_SOLID,2,RGB(225,0,0)); //用红色2个线宽绘制被裁剪初始直线 CPen *pOldPen=pDC->SelectObject(&newPen); pDC->MoveTo(P1); pDC->LineTo(P2); pDC->SelectObject(pOldPen); CLIP_Line_Cohen_Sutherland(P1,P2); //用窗口裁剪P1P2直线,裁剪后的顶点保存在P1P2中 CPen clipPen(PS_SOLID,2,RGB(0,145,146)); //用蓝色2个线宽绘制窗口内裁剪之后的线段 pOldPen=pDC->SelectObject(&clipPen); pDC->MoveTo(P1); pDC->LineTo(P2); pDC->SelectObject(pOldPen); this->ReleaseDC(pDC);

}

六、屏幕显示结果:

这里将绘出的图形界面拷贝下来;

穿过裁剪窗口

完全在裁剪窗口内 改变线段坐标 CPoint P1 = CPoint(150,160); CPoint P2 = CPoint(200,280);

完全在裁剪窗口外 CPoint P1 = CPoint(400,460); CPoint P2 = CPoint(450,380);

599tw0wabz9x6b74310b
领取福利

微信扫码领取福利

微信扫码分享