已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多边形裁剪的SutherlandHodgman算法 1. SutherlandHodgman多边形裁剪算法思想该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。当多边形一个顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则):1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列;2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列;3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点序列;4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。 2. SutherlandHodgman多边形裁剪算法步骤考虑多边形相对于一条边界及其延长线进行裁剪的算法:1从主函数得到待裁剪多边形的顶点序列P2、顶点序列数n、窗口一条边界参数xl(假如为矩形窗口的左边界);2赋初值:将顶点序列中的最后一个顶点赋给前一顶点S;设置初始标志flag:if(S在边界内侧)flag=0;else flag=1;设新的顶点序列数j=0;3对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列Q2中:for(对第一个顶点直到最后一个顶点,逐一处理)if(Pi在边界内侧)if(flag!=0)flag=0;求交点并放入新的多边形顶点序列Qj中;j+;将当前顶点放入新的多边形顶点序列Qj中:Qj=Pi;j+;elseif(flag=0)flag=1;求交点并放入新的多边形顶点序列Qj中;j+;将当前顶点赋给S:S=Pi;4做返回准备:将新的多边形顶点序列Q又逐一放回原多边形顶点序列P中:P=Q;将新的多边形顶点数j放回原多边形顶点数n中:n=j;/-多边形裁剪的SutherlandHodgman算法-/void CMyClip_AView:ClipedgeL(CPoint polypoint, CPoint clipwindow, UINT polynum)/*其中参数polypoint为多边形顶点,clipwindow为裁剪窗口顶点,polynum为多边形顶点数目*/ /找出裁剪窗口边界 long xl,xr,yt,yb; UINT i; xl=clipwindow0.x; xr=clipwindow0.x; yt=clipwindow0.y; yb=clipwindow0.y; for(i=1;iclipwindowi.x) xl=clipwindowi.x; if(xrclipwindowi.y) yb=clipwindowi.y; if(ytclipwindowi.y) yt=clipwindowi.y; / CPoint BPolygon_Num,CPolygon_Num; UINT m_nA,m_nB; int x,y; long tem1,tem2; m_nA=polynum;/*记载原始多边形顶点顶点个数*/ m_nB=0;/*记载新生成多边形顶点顶点个数*/ for(i=0;im_nA;i+) if(polypointi.xxl & polypointi+1.x=xl & polypointi+1.x=xl) /*边两个端点都在内部,保留*/ /*因为每个保留的点在数组中只出现一次,且下一次判断时第二个端点一定会要取到,因此只保留的两个点中的第一个*/ Bm_nB.x =polypointi.x ; Bm_nB.y =polypointi.y ; m_nB=m_nB+1; continue; if(polypointi.x=xl)/*边两个端点起点在外部,终点在内部,求交点,然后交点,终点都应该送入临时数组*/ /*保留交点*/ x=xl; tem1=(xl-polypointi.x); /tem2=(xl-x1)*dy/dx+y1; /y/x=dy/dx-y=x*dy/dx tem2=tem1*(polypointi+1.y-polypointi.y)/(polypointi+1.x-polypointi.x)+polypointi.y; y=tem2; Bm_nB.x =x; Bm_nB.y =y; m_nB=m_nB+1; continue; if(polypointi.x=xl & polypointi+1.xxl)/*起点在内部,终点在外,求交点,然后起点,交点送入临时数组*/ /*保留内部点*/ Bm_nB.x =polypointi.x ; Bm_nB.y =polypointi.y ; m_nB=m_nB+1; /*保留交点*/ x=xl; tem1=(xl-polypointi.x); tem2=tem1*(polypointi+1.y-polypointi.y)/(polypointi+1.x-polypointi.x)+polypointi.y; y=tem2; Bm_nB.x =x; Bm_nB.y =y; m_nB=m_nB+1; continue; /把第一个点的数据拷贝到最后 /形成裁剪后的多边形 if(i=m_nA) Bm_nB=B0; /下- m_nA=0; for(i=0;im_nB;i+) if(Bi.yyb & Bi+1.y=yb & Bi+1.y=yb) /p1,p2都在yb上方 Cm_nA.x =Bi.x; Cm_nA.y =Bi.y; m_nA+; continue; if(Bi.y=yb) /p1在下,P2在上,留交点,外内 y=yb; tem1=yb-Bi.y; /tem2=x1+(yb-y1)*dx/dy tem2=tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y) + Bi.x; x=tem2; Cm_nA.x =x; Cm_nA.y =y; m_nA+; continue; if(Bi.y=yb & Bi+1.yyb) /p1在上方,P2在下方,留P1和交点,内外 /save p1 Cm_nA.x=Bi.x; Cm_nA.y=Bi.y; m_nA+; /留交点 y=yb; tem1=yb-Bi.y; /tem2=x1+(yb-y1)*dx/dy tem2=tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y)+Bi.x; x=tem2; Cm_nA.x =x; Cm_nA.y =y; m_nA+; continue; /形成第二次裁剪多边形 if(i=m_nB) Cm_nA=C0; /右- m_nB=0; for(i=0;ixr & Ci+1.xxr) /P1,P2都在右方-go next continue; if(Ci.x=xr & Ci+1.xxr & Ci+1.x=xr) /P1在右方,P2在左方,留交点 x=xr; tem1=Ci.x-xr; tem2=Ci.y-tem1*(Ci+1.y-Ci.y)/(Ci+1.x-Ci.x); y=tem2; Bm_nB.x =x; Bm_nB.y =y; m_nB+; continue; if(Ci.xxr) /P1在内,P2在外,留P1和交点 /save p1 Bm_nB.x =Ci.x; Bm_nB.y =Ci.y; m_nB+; /save 交点 x=xr; tem1=Ci.x-xr; tem2=Ci.y-tem1*(Ci+1.y-Ci.y)/(Ci+1.x-Ci.x); y=tem2; Bm_nB.x =x; Bm_nB.y =y; m_nB+; continue; /三次裁剪后的新多边形 if(i=m_nA) Bm_nB=B0; /上- m_nA=0; for(i=0;iyt & Bi+1.yyt) /p1,p2都在上方,next continue; if(Bi.y=yt & Bi+1.yyt & Bi+1.y=yt) /P1在上方,P2在下方外内,留交点 y=yt; tem1=Bi.y-yt; /tem2=x1+(yb-y1)*dx/dy tem2=Bi.x-tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y); x=tem2; Cm_nA.x =x; Cm_nA.y =y; m_nA+; continue; if(Bi.yyt) /P1在下方,P2在上方,内外,留P1和交点 /save p1, Cm_nA.x =Bi.x; Cm_nA.y =Bi.y; m_nA+; /save 交点 y=yt; tem1=Bi.y-yt; /tem2=x1+(yb-y1)*dx/dy tem2=Bi.x-tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y); x=tem2; Cm_nA.x =x; Cm_nA.y =y; m_nA+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年下半年四川乐山职业技术学院考核招聘1人备考题库及答案详解(新)
- 2026广西百色城市产业发展集团有限公司招聘19人备考题库及答案详解(考点梳理)
- 2026安徽皖信人力安庆分公司招聘客户经理岗位2人备考题库及参考答案详解1套
- 2026新疆阿克苏人才发展集团有限责任公司面向社会招聘合同制专任教师260人备考题库参考答案详解
- 安阳2025年安阳市卫生事业单位招聘(引进)992名工作人员(第二批)笔试历年参考题库附带答案详解
- 大兴安岭2025年大兴安岭地区“黑龙江人才周”校园引才135人笔试历年参考题库附带答案详解
- 2026广东深圳市德勤建工集团招聘备考题库及答案详解(考点梳理)
- 2025年西安未央区辛家庙社区卫生服务中心招聘备考题库(8人)有完整答案详解
- 2026山东重工集团有限公司社会招聘1人备考题库及完整答案详解一套
- 南通南通市通州区图书馆公开招聘劳务派遣人员笔试历年参考题库附带答案详解
- DB23∕T 3314-2022 黑龙江省土壤污染防治风险筛选指导值(试行)
- 2025年福建省年省直遴选笔试真题及答案
- 脚手架安全培训
- 2025年检验检测机构内部质量控制标准模拟考试试题试卷
- 江苏省南京市建邺区2026届物理九上期末复习检测模拟试题含解析
- 2025云南昆明元朔建设发展有限公司第一批收费员招聘20人考试参考试题及答案解析
- 2025年格力安装考试试题及答案
- 教育教学创新大赛课件
- 储能材料与器件课件
- 2025房屋买卖合同范本(下载)
- 质检员班组级安全培训课件
评论
0/150
提交评论