多边形的扫描转换算法——边界标志算法(计算机图形学)
边界标志算法基本思想:
帧缓冲器中对多边形的每条边进行直线扫描转换,也就是对多边形边界所经过的像素打上标志。然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着色。
使用一个布尔量inside来指示当前点是否在多边形内的状态。
边界标志算法与扫描线算法比较:
- 用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同
- 但由于边界标志算法不必建立维护边表以及对它进行排序,所以边界标志算法更适合硬件实现,这时它的执行速度比有序边表算法快一至两个数量级。
扫描转换如下三角形:顶点为:(80,120),(20,30),(150,50)。(边界标志算法)
代码来源:边界标志算法
#include <GL/glut.h>
#include <math.h>bool a[200][200] = { false };void Line(int x1, int y1, int x2, int y2) {int step;int dx = x2 - x1;int dy = y2 - y1;float xDelta, yDelta, x = x1, y = y1;if (abs(dx) > abs(dy))step = abs(dx);elsestep = abs(dy);xDelta = float(dx) / step;yDelta = float(dy) / step;float xPre, yPre;for (int i = 0; i < step; i++) {xPre = x; yPre = y;x += xDelta;y += yDelta;if (int(y + 0.5) != int(yPre + 0.5)) { //当此时的值与上一个值部同时,标记上a[int(x + 0.5)][int(y + 0.5)] = !(a[int(x + 0.5)][int(y + 0.5)]);glVertex2i(int(x + 0.5), int(y + 0.5));}}
}void edqemark_fill(int Xmin, int Xmax, int Ymin, int Ymax) {for (int i = Ymin + 1; i <= Ymax; i++) {bool inside = false;for (int j = Xmin; j <= Xmax; j++) {if (a[j][i] == true) {//遇到边界就取反inside = !(inside);}if (inside)glVertex2i(j, i);}}
};void init(void)
{glClearColor(1.0, 1.0, 1.0, 0.0); // 设置背景颜色glMatrixMode(GL_PROJECTION); // 设置投影参数gluOrtho2D(0.0, 600.0, 0.0, 400.0); // 设置场景的大小
}void draw(void)
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.8, 0.3, 0.1); // 设置画图颜色glLineWidth(3);glPushMatrix();glBegin(GL_POINTS);Line(20, 30, 80, 120);Line(150, 50, 20, 30);Line(150, 50, 80, 120);glEnd();glBegin(GL_POINTS);edqemark_fill(20, 150, 30, 120);glEnd();glPopMatrix();glFlush(); // 处理绘图pipeLine
}void main(int argc, char** argv)
{glutInit(&argc, argv); // 初始化GLUT环境glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // GLUT显示模式:单缓冲区、RGB颜色模型glutInitWindowPosition(50, 100); // 窗口左上角的位置glutInitWindowSize(800, 600); // 显示窗口的大小glutCreateWindow("An Example of OpenGL"); // 创建显示窗口,加上标题init();glutDisplayFunc(draw); // 调用绘图函数glutMainLoop(); // 进入事件处理循环
}
多边形的扫描转换算法——边界标志算法(计算机图形学)相关推荐
- (计算机图形学)多边形的扫描转换算法——边界标志算法
多边形的扫描转换算法--边界标志算法 边界标志算法基本思想 -帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志. –然后再采用和扫描线算法类似的方法将位于多边形内的各个 ...
- 计算机图形学常用算法实现4 多边形扫描转换算法-边界标志算法
代码是在winform中运行的. 看书上这个算法写起来轻描淡写的,实际上实现起来还是有很多难点的,难点如下: 1.无法判断经过某个点的时候是不是应该变号. 2.扫描算法画直线的时候,可能同一行有多个点 ...
- 计算机图形学多边形填充代码_零基础学计算机图形学太难?或许你缺的只是一本好书...
雷锋网 AI 科技评论按,计算机图形学是一个有趣的话题--如何利用算法和一些几何数据制作玩具总动员?这不仅对于普通的电影迷来说是一个神秘的话题,而且对于那些还没有接触过它的世界级工程师来说也非常有吸引 ...
- 活性边表算法c语言,《计算机图形学》有序边表填充算法.doc
PAGE PAGE 8 实 验 报 告 实验目的 掌握有序边表算法填充多边形区域: 理解多边形填充算法的意义: 增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点 ...
- Liang-Barsky直线段裁剪算法-C++实现(计算机图形学作业)
#include<graphics.h>//梁式直线裁剪算法的程序,由于该方法用编程实现非常简单,在介绍时稍微简略一些 void Liang_Barsky(const int& x ...
- 计算机图形学基础教程学习总结
目录 第一章 绪论 计算机图形学概念 图形和图像的区别 主要研究内容 第二章 光栅图形学 光栅.理想直线与图形扫描转换的含义 DDA方法 中点画线法 Bresenham算法 中点画圆法 多边形的扫描转 ...
- 图形学(5)多边形的扫描转换(下)
本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明.李振波两位老师,感谢他们录制该门课程供大家学习! X-扫描线改进算法 由于X-扫描线算法的效率问题,下面给出如何巧妙 ...
- 计算机图形学-X扫描线
什么是X扫描线算法 用一条扫描线穿过多边形 计算扫描线与多边形的相交区间 再用要求的颜色显示这些区间的像素 完成填充工作 解决共享顶点问题 原则: 若共享顶点的两条边分别落在扫描线的两边 交点只算一个 ...
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...
最新文章
- python安装包为什么这么小-python安装后为什么找不到包
- Anaconda安装tenserflow
- 【Java7】练习:选角色,挑苹果,员工类,换心脏,斗地主,发工资,客户信息管理软件,开发团队调度系统
- R语言任务视图:机器学习与统计学…
- iphone3G恢复到3.1.2遇到的问题
- 实时内核(Core)和实时操作系统(RTOS)有何不同?
- AI读懂两千年前文字,登上Nature封面,惊艳历史学家
- 错误诊断:索引数据错误导致ORA-00600 [kdsgrp1]处理
- Linux 基础命令3 shell
- 浮窗 动画特效 android,悬浮窗能实现自定Animation动画效果吗?
- windsns社交门户系统源码v1.0-掌上移动社交类SNS网站系统源码
- 翻转数组,将数组倒序输出
- Springboot 静态资源路径配置 实例介绍
- element-ui图标不显示问题(已解决)
- TypeError: xx takes 1 positional argument but 4 were given
- Proximity模块管理设备距离传感器,可获取当前设备的接近距离信息,通过plus.proximity可获取设备距离传感管理对象
- krpano php,krpano调试模式的开启
- C语言源代码系列-管理系统之电子英汉词典
- dpdk介绍系列之ring
- git(9)Git 内部原理,java入门视频百度网盘