作者:非妃是公主
专栏:《计算机图形学》
博客地址:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩

文章目录

  • 专栏推荐
  • 专栏系列文章
  • 一、多边形的裁剪算法原理
    • 1. 多边形裁剪的目标
    • 2. Sutherland-Hodgeman多边形裁剪
  • 二、代码实现
  • 三、效果展示
  • the end……

专栏推荐

专栏名称 专栏地址
软件工程 专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统 专栏——操作系统
软件测试 专栏——软件测试
机器学习 专栏——机器学习
数据库 专栏——数据库
算法 专栏——算法

专栏系列文章

文章名称 文章地址
直线生成算法(DDA算法) 计算机图形学01——DDA算法
中点BH算法绘制直线 计算机图形学02——中点BH算法
改进的中点BH算法 计算机图形学03——改进的中点BH算法
中点Bresenham画椭圆 计算机图形学04——中点BH绘制椭圆
中点BH算法绘制任意斜率直线 计算机图形学05——中点BH算法绘制任意斜率的直线
中点Bresenham画圆 计算机图形学06——中点BH算法画圆
有效边表法的多边形扫描转换 计算机图形学07——有效边表法绘制填充多边形
中点BH算法绘制抛物线 100 x = y 2 100x = y^2 100x=y2 计算机图形学08——中点BH绘制抛物线
二维观察之点的裁剪 计算机图形学09——二维观察之点裁剪
二维观察之线的裁剪 计算机图形学10——二维观察之线裁剪
二维观察之多边形的裁剪 计算机图形学11——二维观察之多边形裁剪
二维图形的几何变换 计算机图形学12——二维图形几何变换
三维图形的几何变换 计算机图形学13——三维图形几何变换
三维图形的投影变换 计算机图形学14——三维图形投影变换

计算机图形学(英语:computer graphics,缩写为CG)是研究计算机在硬件和软件的帮助下创建计算机图形的科学学科,是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。虽然这个词通常被认为是指三维图形,事实上同时包括了二维图形以及影像处理。


一、多边形的裁剪算法原理

1. 多边形裁剪的目标

裁剪前:

正确裁剪后:


2. Sutherland-Hodgeman多边形裁剪

逐边裁剪算法基本思想:每次用窗口的一条边对多边形进行裁剪。
算法实施策略:

  • 为窗口各边界裁剪的多边形存储输入与输出顶点表。在窗口的一条裁剪边界处理完所有顶点后,其输出顶点表将用窗口的下一条边界继续裁剪。
  • 窗口的一条边以及延长线构成的裁剪线把平面分为两个区域,包含有窗口区域的一个域称为可见侧;不包含窗口区域的域为不可见侧。


二、代码实现

/// <summary>
/// 计算交点——X方向上的直线(垂直的直线)
/// </summary>
/// <param name="p1">第一个端点</param>
/// <param name="p2">第二个端点</param>
/// <param name="wxLorR">wxl或者wyr,分别求对应边的交点</param>
/// <returns>交点</returns>
VERTEX calIntersectionPointX(VERTEX p1, VERTEX p2, int wxLorR) {double k = (double)(wxLorR - p2.x) / (p1.x - p2.x);VERTEX res;res.x = wxLorR;res.y = k * p1.y + (1 - k) * p2.y;return res;
}/// <summary>
/// 计算交点——Y方向上的直线(水平的直线)
/// </summary>
/// <param name="p1">第一个端点</param>
/// <param name="p2">第二个端点</param>
/// <param name="wyBorT">wxb或者wyt,分别求对应边的交点</param>
/// <returns>交点</returns>
VERTEX calIntersectionPointY(VERTEX p1, VERTEX p2, int wyBorT) {double k = (double)(wyBorT - p2.y) / (p1.y - p2.y);VERTEX res;res.y = wyBorT;res.x = k * p1.x + (1 - k) * p2.x; return res;
}/// <summary>
/// 多边形裁剪
/// </summary>
/// <param name="polygon">多边形顶点的数组</param>
/// <param name="wxl">窗口的左边缘</param>
/// <param name="wxr">窗口的右边缘</param>
/// <param name="wyb">窗口的下边缘</param>
/// <param name="wyt">窗口的上边缘</param>
/// <returns>裁剪后的多边形顶点</returns>
vector<VERTEX> cropPolygon(vector<VERTEX> polygon, int wxl, int wxr, int wyb, int wyt) {vector<VERTEX> res;// 对边 wxl 进行裁剪for (int i = 0; i < polygon.size(); i++) {VERTEX p1 = polygon[i];VERTEX p2 = polygon[(i + 1) % polygon.size()];if (p1.x < wxl && p2.x >= wxl) {      // 不可见侧到可见侧VERTEX intersectionPoint = calIntersectionPointX(p1, p2, wxl);res.push_back(intersectionPoint);res.push_back(p2);}      else if (p1.x >= wxl && p2.x >= wxl) {  // 可见侧到可见侧res.push_back(p2);}else if (p1.x >= wxl && p2.x < wxl) {   // 可见侧到不可见侧VERTEX intersectionPoint = calIntersectionPointX(p1, p2, wxl);res.push_back(intersectionPoint);}else if (p1.x < wxl && p2.x < wxl) {  // 不可见侧到不可见侧continue;}}polygon = res; // 更新顶点res.clear();// 对边 wxr 进行裁剪for (int i = 0; i < polygon.size(); i++) {VERTEX p1 = polygon[i];VERTEX p2 = polygon[(i + 1) % polygon.size()];if (p1.x > wxr && p2.x <= wxr) {     // 不可见侧到可见侧VERTEX intersectionPoint = calIntersectionPointX(p1, p2, wxr);res.push_back(intersectionPoint);res.push_back(p2);}else if (p1.x <= wxr && p2.x <= wxr) {    // 可见侧到可见侧res.push_back(p2);}else if (p1.x <= wxr && p2.x > wxr) {   // 可见侧到不可见侧VERTEX intersectionPoint = calIntersectionPointX(p1, p2, wxr);res.push_back(intersectionPoint);}else if (p1.x > wxr && p2.x > wxr) {  // 不可见侧到不可见侧continue;}}polygon = res; // 更新顶点res.clear();// 对边 wyb 进行裁剪for (int i = 0; i < polygon.size(); i++) {VERTEX p1 = polygon[i];VERTEX p2 = polygon[(i + 1) % polygon.size()];if (p1.y < wyb && p2.y >= wyb) {     // 不可见侧到可见侧VERTEX intersectionPoint = calIntersectionPointY(p1, p2, wyb);res.push_back(intersectionPoint);res.push_back(p2);}else if (p1.y >= wyb && p2.y >= wyb) {    // 可见侧到可见侧res.push_back(p2);}else if (p1.y >= wyb && p2.y < wyb) {   // 可见侧到不可见侧VERTEX intersectionPoint = calIntersectionPointY(p1, p2, wyb);res.push_back(intersectionPoint);}else if (p1.y < wyb && p2.y > wyb) {  // 不可见侧到不可见侧continue;}}polygon = res; // 更新顶点res.clear();// 对边 wyt 进行裁剪for (int i = 0; i < polygon.size(); i++) {VERTEX p1 = polygon[i];VERTEX p2 = polygon[(i + 1) % polygon.size()];if (p1.y > wyt && p2.y <= wyt) {     // 不可见侧到可见侧VERTEX intersectionPoint = calIntersectionPointY(p1, p2, wyt);res.push_back(intersectionPoint);res.push_back(p2);}else if (p1.y <= wyt && p2.y <= wyt) {    // 可见侧到可见侧res.push_back(p2);}else if (p1.y <= wyt && p2.y > wyt) {   // 可见侧到不可见侧VERTEX intersectionPoint = calIntersectionPointY(p1, p2, wyt);res.push_back(intersectionPoint);}else if (p1.y > wyt && p2.y > wyt) {  // 不可见侧到不可见侧continue;}}// 返回最终的 vector<Polygon>return res;
}

三、效果展示

测试代码如下:

// 显示图形
void Display(void) {glClear(GL_COLOR_BUFFER_BIT);       //用当前背景色填充窗口glColor3f(0.0f, 0.0f, 0.0f);// 此处需增加调用基本图形生成函数Bhline(20, 30, 200, 30);Bhline(200, 30, 200, 200);Bhline(200, 200, 20, 200);Bhline(20, 200, 20, 30);ScanTransferX(_polygon, RGB(255, 0, 0));glFlush();
}// 第2个窗口中的图形绘制
void Displayw(void)
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0f, 0.0f, 0.0f);// 此处进行裁剪Bhline(20, 30, 200, 30);Bhline(200, 30, 200, 200);Bhline(200, 200, 20, 200);Bhline(20, 200, 20, 30);vector<VERTEX> polygon = cropPolygon(_polygon, 20, 200, 30, 200);ScanTransferX(polygon, RGB(255, 0, 0));glFlush();
}

主函数等其它框架部分与前面(点、线裁剪)相同,可通过开头链接进行跳转查看,在此不再冗余贴代码片。


the end……

二维观察之多边形的裁剪到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

计算机图形学11:二维观察之多边形的裁剪相关推荐

  1. 计算机图形学10:二维观察之线的裁剪

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  2. 计算机图形学实验——二维卡通人物交互

    计算机图形学实验1.2卡通人物交互 OpenGL卡通人物交互 基础"图元"绘制 OpenGL拾取物体 反走样 略提反走样问题 OpenGL实现二维反走样 放缩.旋转和拖动 小结 O ...

  3. 计算机图形学(二维、三维几何变换)

    一.几何变换的概念 几何变换又称建模变换,指只改变组成形体的几何元素的几何信息(大小.形状.相对位置),而不改变图形拓扑信息的变换. 图形变换模式: (1)坐标系不动,图形变动(以下内容采用这种模式) ...

  4. 【计算机图形学】-二维曲线绘制实验 (code included)

    1. 实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2. 实验内容: (1) 结合示范代码理解曲线生成原理与算法实现,尤其是Bezi ...

  5. 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    一.实现方案 对于一个二维图形作平移.旋转.放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移).绕一点旋转固定的角(旋转).在x,y轴方向分别放缩sx ...

  6. 安大计算机图形学实验——二维图形变换

    实验原理 1.本次实验着重学习以下常用函数,在实验报告中的实验原理部分对下列函数进行参数介绍和用法介绍. glLoadIdentity(): 变换矩阵: glRotatef(theta, vx, vy ...

  7. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解

    小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解 引言 如何画圆 基本思想 中点画圆法 中点画圆基本思路 中点画圆改进 Bresenham画圆算法 Bre ...

  8. 热传递物理模型matlab,简单传热学计算机分析MatlabPDE二维不稳态焊接热传导求解.PPT...

    简单传热学计算机分析MatlabPDE二维不稳态焊接热传导求解 计算机在材料科学与工程中的应用 叶卫平 本 章 要 点 4.1材料学主要物理场 4.1材料学主要物理场 4.2 传热学基本概念 4.2 ...

  9. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

最新文章

  1. Redis开发:发布/订阅消息示例
  2. js面向对象与PHP面向对象总结
  3. 火车头php接口制作,火车头接口
  4. 2019年前端开发10大战略性技术蓝图
  5. C#(数据结构):1.顺序表结构(3)
  6. 批处理 批量s扫1433_批处理批量字符替换
  7. My thoughts after NOIP 2018(2)
  8. Python3使用PIL
  9. 模式识别与机器学习第六章有监督学习方法
  10. python+django+mysql校园失物招领系统毕业设计毕设开题报告
  11. word里双横线怎么打_Word中下划线怎么打出来
  12. 如何把pdf转换成word文档
  13. Python Turtle绘图[难度2星]:横切的橙子(配色优化——邻近色/反差色)
  14. 公交车查询系统软件测试,公交APP评测:谁是最好用的公交线路查询软件?
  15. CAD中如何快速等分一条直线或曲线?教程详解
  16. c语言编程序按下列公式计算e的值,编写程序,利用公式 ,求出e的近似值
  17. 随机数的产生原理与实现
  18. cad的dwg如何转换成pdf?
  19. 苹果5s农历显示订阅服务器,苹果5s怎么显示农历,苹果5S怎样设置阴历呢?
  20. 腾讯云服务器维护中,服务器|腾讯云服务器的配置指南

热门文章

  1. ansible运维工具介绍
  2. LaTex入门教程-中文版-免费下载.pdf
  3. 上岸16K,薪资翻倍,在华为外包做测试是一种什么样的体验····
  4. 滚屏提词器软件叫什么?快把这些软件收好
  5. 飞利浦Zoom!正式进入中国市场;西门子医疗首台发热门诊“无人”CT落地;埃森哲意向收购法国领先云服务提供商 | 美通企业周刊...
  6. Certbot 安装Let’s Encrypt踩坑记录
  7. C语言第十次作业,第十五次c语言作业.doc
  8. 俄罗斯方块 基于C语言
  9. Smith + Nephew推出了Real Intelligence和新一代手持机器人平台CORI手术系统
  10. 信息安全-数据库系统安全