裁剪参考代码.doc

裁剪参考代码.doc

ID:59332682

大小:70.00 KB

页数:9页

时间:2020-09-04

裁剪参考代码.doc_第1页
裁剪参考代码.doc_第2页
裁剪参考代码.doc_第3页
裁剪参考代码.doc_第4页
裁剪参考代码.doc_第5页
资源描述:

《裁剪参考代码.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、参考代码:1、直线的裁剪üSutherland–Cohen算法Sutherland_Cohen(floatx0,floaty0,floatx2,floaty2){unsignedintc,c1,c2;floatx,y,wx,wy;boolaccept=false,done=false;c1=EnCode(x0,y0);c2=EnCode(x2,y2);do{if((c1

2、c2)==0){accept=true;done=true;}elseif((c1&c2)!=0)done=true;else{c=c1;if(c==0)c=c2;//求位于窗口外的点wx=x2-x0;w

3、y=y2-y0;if((c&8)==8){x=x0+wx*(wyt-y0)/wy;y=wyt;}elseif((c&4)==4){x=x0+wx*(wyb-y0)/wy;y=wyb;}elseif((c&1)==1){y=y0+wy*(wxl-x0)/wx;x=wxl;}else{y=y0+wy*(wxr-x0)/wx;x=wxr;}if(c==c1){//表明c1!=0,起始点不在窗口内,将交点作为新的起点重复判断步骤;x0=x;y0=y;c1=EnCode(x0,y0);}else{//终点不在窗口内,交点作为新的终点x2=x;y2=y;c2=EnCode(x2,y2

4、);}}}while(done==false);if(accept==true){drawLine(int(x0),int(y0),int(x2),int(y2)//绘制裁剪出的线段}}EnCode(floatLinePx,floatLinePy){unsignedintRC=0;if(LinePx

5、LEFT;}if(LinePx>wxr){RC=RC

6、RIGHT;}if(LinePy

7、BOTTOM;}if(LinePy>wyt){RC=RC

8、TOP;}returnRC;}ü中点分割算法MidPoint(floatxx0,flo

9、atyy0,floatxx2,floatyy2){intRC0,RC1,RC;floatx,y;boolaccept=false;RC0=EnCode(xx0,yy0);RC1=EnCode(xx2,yy2);if((RC0

10、RC1)==0){//简取之accept=true;}elseif((RC0&RC1)!=0){//简弃之accept=false;return;}else{if(RC0==0

11、

12、RC1==0)//一个顶点在窗口里面,一个顶点在窗口外面{if(RC0==0)//P0点在窗口内,P1点在窗口外{MidClip(xx0,yy0,&xx2,&yy2,tru

13、e);}else//P1点在窗口内,P0点在窗口外{MidClip(xx2,yy2,&xx0,&yy0,false);}}else//两个点都在窗口外面,将进行拆分,始终可以拆分成两段直线。离P0点近的为false,离P1点近的为true{x=(xx0+xx2)/2;y=(yy0+yy2)/2;RC=EnCode(x,y);while(RC!=0)//中点落在窗口外面{if((RC0&RC)==0)//中点P和P0点跨越窗口时,P点和P1点肯定位于窗口之外,舍去PP1{xx2=x,yy2=y;RC1=RC;}else//中点在P0侧,舍去PP0点{xx0=x,yy0=y;

14、RC0=RC;}x=(xx0+xx2)/2;y=(yy0+yy2)/2;RC=EnCode(x,y);}//RC=0,中点在窗口内,以中点分为两段可以裁剪了MidClip(x,y,&xx0,&yy0,false);MidClip(x,y,&xx2,&yy2,true);}accept=true;}if(accept==true){drawLine(int(x0),int(y0),int(x2),int(y2)//绘制裁剪出的线段}}MidClip(floatP0x,floatP0y,float*P1x,float*P1y,boolflag){floatx,y;//中点坐标

15、intRCT0,RCT1,RCT;RCT0=EnCode(P0x,P0y);RCT1=EnCode(*P1x,*P1y);x=(P0x+*P1x)/2;y=(P0y+*P1y)/2;RCT=EnCode(x,y);while(fabs(x-P0x)>1e-6

16、

17、fabs(y-P0y)>1e-6){if(RCT==0)//中点也在窗口内,则P=P0{P0x=x;P0y=y;RCT0=RCT;}else//否则舍弃P1点{*P1x=x;*P1y=y;RCT1=RCT;}x=(P0x+*P1x)/2;y=(P0y+*P1y)/2;R

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。