多边形裁剪

效果截图:

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 多边形裁剪算法相关推荐

  1. 图形学基础笔记III:图形管线中的多边形裁剪算法、Sutherland-Hodgman、Guard Band Clipping

    这个主要讲的是viewport 里的. 从 frustum (根据 fov 视场角 和 aspect ratio 纵横比决定 lrbt,front.near 是由摄像机距离和世界大小决定的)到 vie ...

  2. 【Weiler-Atherton算法】 计算机图形学多边形裁剪算法

    目录 什么是多边形裁剪 前置知识 算法步骤 程序框图 代码实现 源代码: https://github.com/ricar0/Weiler-Atherton-Alogrithm/tree/master ...

  3. java实现线段裁剪算法,多边形裁剪算法java

    Weiler-Atherton 任意多边形裁剪 Sutherland-Hodgeman 算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及 任意多边形窗口(含凹多边形窗口)的裁剪.Weiler ...

  4. 【20160924】GOCVHelper MFC增强算法(1)

        //递归读取目录下全部文件(flag为r的时候递归)     void getFiles(string path, vector<string>& files,string ...

  5. weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...

    作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...

  6. Sutherland-Hodgeman 多边形裁剪算法

    文章目录 说明 Sutherland-Hodgeman 代码 说明 在阅读此博客前,请访问2018级山东大学计算机学院图形学实验汇总. 原笔记通过latex编写,csdn只支持latex部分功能,所以 ...

  7. 【20160924】GOCVHelper MFC增强算法(2)

    //创建或续写目录下的csv文件,填写"文件位置-分类"对     int writeCsv(const string& filename,const Vector< ...

  8. 多边形裁剪一:Sutherland-Hodgman算法

    Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的.这种算法采用了分割处理.逐边裁剪的方法.一,基本思 ...

  9. 3.qt-图解Weiler-Atherton任意多边形剪裁算法

    1.Weiler-Atherton多边形剪裁算法 Weiler-Atherton剪裁算法是一个适用于凸的.凹的和带孔的多边形的裁剪算法. 裁剪窗口可以是矩形.任意凸多边形.任意凹多边形. 与 Suth ...

最新文章

  1. 一行代码搞定 R 语言模型输出!(使用 stargazer 包)
  2. 使用泛型 ,做计算器
  3. Tomcat安装及Eclipse配置教程
  4. ReportViewer教程(5)-将数据源字段放入报表
  5. WIN7清理C盘空间垃圾的BAT脚本
  6. Unity3D研究院之解决ttf繁体字体不显示问题
  7. 浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
  8. 自然语言处理技术发展简史
  9. Word2Vec模型配置参数
  10. HTML5和CSS3的一些小总结
  11. contiki之list头文件
  12. 阿里本地生活再出发:口碑入高德,备战美团、抖音
  13. 设置matlab图像线框,matlab在图像中画长方形(框)
  14. 阿里云凌晨回应故障:已全部恢复 将尽快赔偿
  15. 朵拉影像开发 又一个昫暖的午后
  16. 中医四季养生法 冬季补肾汤
  17. layout_weight 小白的理解之我的地盘听我的!(二)
  18. 【实用工具】技术人如何写好英文论文?
  19. UE4:安卓连线调试
  20. Linux--开发工具

热门文章

  1. notepad++插件
  2. Service id not legal hostname (service_cmn)
  3. 同事关系再好也别表现,学做曾国藩和左宗棠,多数人不懂三规矩
  4. 队列实现杨辉三角(附详细图解)
  5. Android OpenCV(四十五):图像修复
  6. 笔试题-跳格子游戏,Java代码
  7. setserial - 取得/设置 Linux 串行口的信息
  8. linux启动流程及自定义gurb
  9. 上万条个性签名与个性网名ACCESS数据库
  10. 亲亲亲亲兄弟们必学成为首富第一步学习Linux基础命令