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);