Cohen-Sutherland直线段裁减算法实验报告实验现象:核心代码:Cohen-Sutherland直线段裁减算法:voidCLineClippingView::OnSutherlandID()////////版权所有赵才{//TODO:AddyourcommandhandlercodehereCDC*pDC=GetDC();CPennewpen(PS_SOLID,1,RGB(255,255,0));CPen*old=pDC-SelectObject(&newpen);//RedrawWindow();//绘制N条直线段;//pDC-MoveTo(ptset[i]);//pDC-LineTo(ptset[i+1]);inti=0;while(iN){intcode1=encode(ptset[i].x,ptset[i].y);intcode2=encode(ptset[i+1].x,ptset[i+1].y);if((code1|code2)==0)//简取{pDC-MoveTo(ptset[i]);pDC-LineTo(ptset[i+1]);i+=2;continue;}else{if((code1&code2)!=0)//简弃{i+=2;continue;}else{if(code1==0){inttx,ty,ct;ct=code1;code1=code2;code2=ct;tx=ptset[i].x;ty=ptset[i].y;ptset[i].x=ptset[i+1].x;ptset[i].y=ptset[i+1].y;ptset[i+1].x=tx;ptset[i+1].y=ty;//pDC-MoveTo(ptset[i]);//pDC-LineTo(ptset[i+1]);}floatk=float(ptset[i+1].y-ptset[i].y)/float(ptset[i+1].x-ptset[i].x);if(code1&LEFT){//ptset[i].y=int(k*(XL-ptset[i].x)+ptset[i].y+0.5);ptset[i].x=XL;continue;}if(code1&RIGHT){//ptset[i].y=int(k*(XR-ptset[i].x)+ptset[i].y+0.5);ptset[i].x=XR;continue;}if(code1&TOP)///////特别注意if语句中的表达式越简单越好,否则很容易出现误差///这个与编译器有关,她没有很好的实现c++的功能{//ptset[i].x=int(1.0/k*(YT-ptset[i].y)+ptset[i].x+0.5);ptset[i].y=YT;continue;}if(code1&BOTTOM){//ptset[i].x=int(1.0/k*(YB-ptset[i].y)+ptset[i].x+0.5);ptset[i].y=YB;continue;}}}}}intencode(intx,inty)//确定端点编码{intc=0;if(xXL)c|=LEFT;if(xXR)c|=RIGHT;if(yYB)c|=BOTTOM;if(yYT)c|=TOP;returnc;}实验心得:注意运算符的优先级,勤加括号