




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
题 目:逐边法裁剪多边形 姓 名: 董志刚 学 号: 200911629 班 级: 116 专 业: 计算机 日 期: 2011,10,20 实验三:多边形裁剪之逐边裁剪法1)原理:窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧。多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种:1)都在可见一侧,则输出P。2)都在不可见一侧,输出0个点。3)S在可见一侧,P在不可见一侧,输出交点I。4)S在不可见一侧,P在可见一侧,则输出交点I和端点P。 2)实现方法:先画出裁剪窗口(矩形)鼠标左键按下的点确定矩形的左上端点(point1),弹起的点确定矩形右下端点(point2)。 再画待裁剪的多边形,第一次鼠标按下和弹起画多边形的第一条边,以后每次按下就画一条从上一个点到这个点的直线。用裁剪窗口的每一边去裁剪多边形,得到一个新的的多边形,将多边形的各个端点存放于数组m_strpo 中,再用其他边裁剪刚得到的多边形,依次类推。在CVIEW类中添加几个变量如下:Int cnt;构造函数中赋值0,用于存储数组元素个数Bool m_pDraw;构造函数中赋值FALSE,用以判断是否鼠标是否已被按下Bool m_pDrawRet;用以判断是否已经画出了多边形CPoint point1,point2;用以存放裁剪矩形窗口的两个顶点CPoint m_strpo10;存放待裁剪的多变形的有序端点CPoint m_strcut20;存放裁剪后的多边形的有序端点CPoint m_pOrigin;画多边形的起始点,捕捉第一次鼠标按下和以后每次鼠标谈起的坐标,以实现第一次鼠标按下和弹起画第一条线,以后每次按下就画一条从上次弹起至此点的线。在CVIEW类中添加两个消息处理LButtonDown和LButtonUp,具体代码如下:void CPolyAlignView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_pDrawRet=TRUE) /矩形已画后出执行以下代码,画多边形CClientDC dc(this);dc.MoveTo(point);if(m_pDraw=FALSE) /鼠标未按下执行m_pOrigin=point;m_strpocnt+=point; /最后一个点和起点重合(相近)elsedc.MoveTo(m_pOrigin); /以后每次按下则画一条从上一点到此点的线dc.LineTo(point);m_strpocnt+=point;else /未画矩形则将鼠标按下的点标示为待画矩形的左上顶点 point1=point;CView:OnLButtonDown(nFlags, point);void CPolyAlignView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this);if(m_pDrawRet=TRUE) /矩形已被画出,执行以下代码画多边形if(m_pDraw=FALSE) /鼠标第一次按下画一条从按下到弹起的直线dc.MoveTo(m_pOrigin);dc.LineTo(point); /画出的多变形的起点和终点临近,默认重合m_strpocnt+=point;m_pOrigin=point;m_pDraw=TRUE; /标示鼠标已经按下else /矩形未画则画一个左上顶点为point1,右下顶点为point2的矩形point2=point;dc.Rectangle(point1.x,point1.y,point2.x,point2.y); m_pDrawRet=TRUE; /标示矩形已画出CView:OnLButtonUp(nFlags, point);在菜单栏中添加一个选项,去掉popup,ID改为IDC_CUT1,caption”为裁剪”,进入classwizard,在CVIEW中添加响应函数,编辑代码void CPolyAlignView:OnCut1() / TODO: Add your command handler code here/*起始多边形第一个端点和最后一个端点重合,故而不用考虑漏掉m_strpo 的第一个端点的情况。i=cnt-1时,m_strpoi+1相当于其他情况的最后一个顶点到起始端点的情况。若要增加通用性,可以先cnt-,然后m_strpoi+1改为m_strpo(i+1)%cnt*/int i=0,j=0;for(i=0,j=0;ipoint1.x&m_strpoi+1.xpoint1.x)/都在可见一侧m_strcutj=m_strpoi+1;else if(m_strpoi.xpoint1.x&m_strpoi+1.xpoint1.x&m_strpoi+1.xpoint1.x) /S在可见侧 P不可见侧float dx=m_strpoi.x-m_strpoi+1.x;float dy=m_strpoi.y-m_strpoi+1.y;float k=dy/dx;int y=k*(point1.x-m_strpoi.x)+m_strpoi.y;m_strcutj.x=point1.x;m_strcutj.y=y;elseif(m_strpoi.xpoint1.x) /S在不可见侧P在可检测float dx=m_strpoi.x-m_strpoi+1.x;float dy=m_strpoi.y-m_strpoi+1.y;float k=dy/dx;int y=k*(point1.x-m_strpoi.x)+m_strpoi.y;/交点m_strcutj.x=point1.x;m_strcutj.y=y;m_strcut+j=m_strpoi+1;/for cnt=j; /cnt存放m_strpo 的个数for(i=0;icnt;i+) /将裁剪后的多变形变为待裁剪的多边形m_strpoi=m_strcuti;for(i=0,j=0;icnt;i+,j+) /右边框/当S为多边形的未端点 ,P则应该为起始端点。即i=cnt-1,则m_strpoi+1 /应该为m_strpo0,用(i+1)%cnt以实现if(m_strpoi.xpoint2.x&m_strpo(i+1)%cnt.xpoint2.x&m_strpo(i+1)%cnt.xpoint2.x)j-;elseif(m_strpoi.xpoint2.x)float dx=m_strpoi.x-m_strpo(i+1)%cnt.x;float dy=m_strpoi.y-m_strpo(i+1)%cnt.y;float k=dy/dx;int y=k*(point2.x-m_strpoi.x)+m_strpoi.y;m_strcutj.x=point2.x;m_strcutj.y=y;elseif(m_strpoi.xpoint2.x&m_strpo(i+1)%cnt.xpoint2.x)float dx=m_strpoi.x-m_strpo(i+1)%cnt.x;float dy=m_strpoi.y-m_strpo(i+1)%cnt.y;float k=dy/dx;int y=k*(point2.x-m_strpoi.x)+m_strpoi.y;m_strcutj.x=point2.x;m_strcutj.y=y;m_strcut+j=m_strpo(i+1)%cnt;/for cnt=j; /cnt存放m_strpo 的个数for(i=0;icnt;i+) /将裁剪后的多变形变为待裁剪的多边形m_strpoi=m_strcuti;for(i=0,j=0;i=point1.y&m_strpo(i+1)%cnt.y=point1.y)m_strcutj=m_strpo(i+1)%cnt;elseif(m_strpoi.ypoint1.y&m_strpo(i+1)%cnt.ypoint1.y&m_strpo(i+1)%cnt.ypoint1.y)float dx=m_strpoi.x-m_strpo(i+1)%cnt.x;float dy=m_strpoi.y-m_strpo(i+1)%cnt.y;int x=(point1.y-m_strpoi.y)*dx/dy+m_strpoi.x;m_strcutj.x=x;m_strcutj.y=point1.y;elseif(m_strpoi.ypoint1.y)float dx=m_strpoi.x-m_strpo(i+1)%cnt.x;float dy=m_strpoi.y-m_strpo(i+1)%cnt.y;int x=(point1.y-m_strpoi.y)*dx/dy+m_strpoi.x;m_strcutj.x=x;m_strcutj.y=point1.y;m_strcut+j=m_strpo(i+1)%cnt;/forcnt=j;for(i=0;icnt;i+) /将裁剪后的多变形变为待裁剪的多边形m_strpoi=m_strcuti;for(i=0,j=0;icnt;i+,j+) /下边框if(m_strpoi.y=point2.y&m_strpo(i+1)%cnt.ypoint2.y&m_strpo(i+1)%cnt.ypoint2.y)j-;elseif(m_strpoi.ypoint2.y)float dx=m_strpoi.x-m_strpo(i+1)%cnt.x;float dy=m_strpoi.y-m_strpo(i+1)%cnt.y;int x=(point2.y-m_strpoi.y)*dx/dy+m_strpoi.x;m_strcutj.x=x;m_strcutj.y=point2.y;elseif(m_strpoi.ypoint2.y&m_strpo(i+1)%cnt.ypoint2.y)float dx=m_strpoi.x-m_strpo(i+1)%cnt.x;float dy=m_strpoi.y-m_strpo(i+1)%cnt.y;int x=(point2.y-m_strpoi.y)*dx/dy+m_strpoi.x;m_strcutj.x=x;m_strcutj.y=point2.y;m_strcut
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防拐防骗培训知识课件
- 男性输精管结扎术后附睾淤积症护理查房
- 基于数字孪生的交流软起动装置故障预测与动态参数自校正技术路径探索
- 可降解环保材料在烟机配件中的产业化应用瓶颈突破
- 反光黄背心在跨国物流场景中的标准适配性冲突实证研究
- 双碳目标下电力切轨机电磁能回收装置与电网接入技术瓶颈
- 2024年工业噪声控制设备项目项目投资需求报告代可行性研究报告
- 历年医院临床招聘笔试题及答案2025年版
- 口腔临床护士试题及答案2025年版
- 临床成人本科试题答案2025年版
- 工业企业现场监测工况 核查表( 废 气)
- 埃菲尔铁塔精品课件
- DB51∕T 2571-2019 林下黄精种植技术规程
- 大班语言《我喜欢我》课件
- (公开课)26个英文字母书写笔顺动态演示(基础教育)
- 不一样的卡梅拉2-我想有颗星星幼儿绘本
- 安全生产费用投入台账模报表
- 希望杯数学竞赛小学三年级试题
- 高分子化学6离子聚合阳离子
- NB_T 10337-2019《水电工程预可行性研究报告编制规程》_(高清最新)
- 环保节能供热锅炉项目建议书范文
评论
0/150
提交评论