mfc 多边形裁剪算法
多边形裁剪
效果截图:
1.头文件定义:
enum Boundary{Left, Right, Bottom, Top};
int cj_line_x1;//裁剪直线时原直线的坐标
int cj_line_x2;
int cj_line_y1;
int cj_line_y2;
CPoint cj_win1;//裁剪窗口坐标,矩形窗口的对角坐标
CPoint cj_win2;
//多边形裁剪
int dbx_count;
CPoint ps[5];//这里以画五个顶点的多变形为例,而且不必初始化
以上定义的一定要在构造函数里初始化,不然会报错
具体实现:
//判断点在裁剪框内外
int CquhongjuanView::Inside(POINT p, Boundary b, POINT wMin, POINT wMax){ switch (b){case Left:if (p.x<wMin.x) return (false);break;case Right:if (p.x>wMax.x) return (false);break;case Bottom:if (p.y<wMin.y) return (false);break;case Top:if (p.y>wMax.y) return (false);break;}return true;}/*Inside*//* 求相交的点 */POINT CquhongjuanView::Intersect(POINT p1, POINT p2, Boundary b, POINT wMin, POINT wMax){POINT iPt;float m;if (p1.x != p2.x) m = (p2.y - p1.y)*1.0 / (p2.x - p1.x);switch (b) {case Left:iPt.x = wMin.x;iPt.y = p2.y + (wMin.x - p2.x)*m;break;case Right:iPt.x = wMax.x;iPt.y = p2.y + (wMax.x - p2.x)*m;break;case Bottom:iPt.y = wMin.y;if (p1.x != p2.x)iPt.x = p2.x + (wMin.y - p2.y) / m;else iPt.x = p2.x;break;case Top:iPt.y = wMax.y;if (p1.x != p2.x) iPt.x = p2.x + (wMax.y - p2.y) / m;else iPt.x = p2.x;break;}return iPt;}/*Intersect*///按边裁剪int Cquhongjuaniew::edgeCliper(Boundary b, POINT wMin, POINT wMax, POINT *pIn, int cnt, POINT *pOut) {POINT s;int i, Outcnt = 0;s = pIn[0];for (i = 1; i <= cnt; i++){if (!Inside(s, b, wMin, wMax) && Inside(pIn[i], b, wMin, wMax)){pOut[Outcnt] = Intersect(s, pIn[i], b, wMin, wMax);Outcnt++;pOut[Outcnt] = pIn[i];Outcnt++;}else if (Inside(s, b, wMin, wMax) && Inside(pIn[i], b, wMin, wMax)){pOut[Outcnt] = pIn[i];Outcnt++;}else if (Inside(s, b, wMin, wMax) && (!Inside(pIn[i], b, wMin, wMax))){pOut[Outcnt] = Intersect(s, pIn[i], b, wMin, wMax);Outcnt++;}s = pIn[i];}return Outcnt;}/*edgeCliper*//* 多边形裁剪 */void CquhongjuanView::clipPolygon(CDC * pDC){int i, cnt, Outcnt, b;//多写了第一个点是为了使得最后一个点与第一个点连起来POINT points[6] = { { ps[0].x,ps[0].y },{ ps[1].x,ps[1].y },{ ps[2].x,ps[2].y },{ ps[3].x,ps[3].y },{ ps[4].x,ps[4].y },{ ps[0].x,ps[0].y} };cnt = 5;POINT pOut[20], pIn[20];POINT wMin = { 100,100 }, wMax = { 300,300 };for (i = 0; i < 4 * cnt; i++){pIn[i].x = 0;pIn[i].y = 0;pOut[i].x = 0;pOut[i].y = 0;}for (i = 0; i <= cnt; i++) pIn[i] = points[i];for (b = 0; b < 4; b++){Outcnt = edgeCliper(Boundary(b), wMin, wMax, pIn, cnt, pOut);for (i = 0; i < Outcnt; i++) pIn[i] = pOut[i];pIn[Outcnt] = pOut[0];cnt = Outcnt;}pDC->Rectangle(wMin.x, wMin.y, wMax.x, wMax.y);pDC->Polygon(pOut, cnt);return;}/* clipPolygon *//* 显示未裁剪的多边形和框 */void CquhongjuanView::showUnclipPolygon(CDC * pDC){POINT points[5] = { { ps[0].x,ps[0].y },{ ps[1].x,ps[1].y },{ ps[2].x,ps[2].y },{ ps[3].x,ps[3].y },{ ps[4].x,ps[4].y } };//POINT points[8];POINT wMin = { 100,100 }, wMax = { 300,300 };CBrush * pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);pDC->Rectangle(wMin.x, wMin.y, wMax.x, wMax.y);pDC->Polygon(points, 5);pDC->SelectObject(pOldBrush);}
可能有些定义不明确,可以根据上下文语境推测,主要是这个做起来有点烦,就懒得写了,体谅一下
ps:mfc相关直线、圆、椭圆、多边形、多边形填充、裁剪直线可以关注我的博客
mfc 多边形裁剪算法相关推荐
- 图形学基础笔记III:图形管线中的多边形裁剪算法、Sutherland-Hodgman、Guard Band Clipping
这个主要讲的是viewport 里的. 从 frustum (根据 fov 视场角 和 aspect ratio 纵横比决定 lrbt,front.near 是由摄像机距离和世界大小决定的)到 vie ...
- 【Weiler-Atherton算法】 计算机图形学多边形裁剪算法
目录 什么是多边形裁剪 前置知识 算法步骤 程序框图 代码实现 源代码: https://github.com/ricar0/Weiler-Atherton-Alogrithm/tree/master ...
- java实现线段裁剪算法,多边形裁剪算法java
Weiler-Atherton 任意多边形裁剪 Sutherland-Hodgeman 算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及 任意多边形窗口(含凹多边形窗口)的裁剪.Weiler ...
- 【20160924】GOCVHelper MFC增强算法(1)
//递归读取目录下全部文件(flag为r的时候递归) void getFiles(string path, vector<string>& files,string ...
- weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...
作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...
- Sutherland-Hodgeman 多边形裁剪算法
文章目录 说明 Sutherland-Hodgeman 代码 说明 在阅读此博客前,请访问2018级山东大学计算机学院图形学实验汇总. 原笔记通过latex编写,csdn只支持latex部分功能,所以 ...
- 【20160924】GOCVHelper MFC增强算法(2)
//创建或续写目录下的csv文件,填写"文件位置-分类"对 int writeCsv(const string& filename,const Vector< ...
- 多边形裁剪一:Sutherland-Hodgman算法
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的.这种算法采用了分割处理.逐边裁剪的方法.一,基本思 ...
- 3.qt-图解Weiler-Atherton任意多边形剪裁算法
1.Weiler-Atherton多边形剪裁算法 Weiler-Atherton剪裁算法是一个适用于凸的.凹的和带孔的多边形的裁剪算法. 裁剪窗口可以是矩形.任意凸多边形.任意凹多边形. 与 Suth ...
最新文章
- 一行代码搞定 R 语言模型输出!(使用 stargazer 包)
- 使用泛型 ,做计算器
- Tomcat安装及Eclipse配置教程
- ReportViewer教程(5)-将数据源字段放入报表
- WIN7清理C盘空间垃圾的BAT脚本
- Unity3D研究院之解决ttf繁体字体不显示问题
- 浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
- 自然语言处理技术发展简史
- Word2Vec模型配置参数
- HTML5和CSS3的一些小总结
- contiki之list头文件
- 阿里本地生活再出发:口碑入高德,备战美团、抖音
- 设置matlab图像线框,matlab在图像中画长方形(框)
- 阿里云凌晨回应故障:已全部恢复 将尽快赔偿
- 朵拉影像开发 又一个昫暖的午后
- 中医四季养生法 冬季补肾汤
- layout_weight 小白的理解之我的地盘听我的!(二)
- 【实用工具】技术人如何写好英文论文?
- UE4:安卓连线调试
- Linux--开发工具