图形学基础笔记I:直线和圆的光栅算法、中点线算法、中点圆算法
实际现代显卡支持的图元就只有点、线、三角形。这是基于这样的事实:
实际对于 3D 来说肯定全是基于三角形的 geometry - OpenGL: Is it more efficient to use GL_QUADS or GL_TRIANGLES? - Stack Overflow,显卡也全部用重心坐标和 AABB 来填充三角形的。
三角形线框模式和非三角形线框模式(GUI、CAD),也很容易实现,使用 bresenham 中点算法就行了。
点就更简单了,如果没有涉及抗锯齿直接取整写显存就行了。
整理一下就是说:
- 线框模式各种形状:应用的话比如 CAD,GUI,不管什么多边形,什么样子都能用 bresenham 画线给你画出来。对于圆的话也是用 bresenham(midpoint)。
- 实体填充各种形状:由于屏幕像素是离散的,所以三角形足够拟合各种形状,只需要 AABB 重心填充算法。
所以直线算法还是必要的。对于圆的画,如果搞 GUI 的话可能需要。
DDA digital differential analyzer
- 一个很自然的算法
- 描述:把直线和网格线的交点找出来,然后浮点转成整数就确定落在网格上的点了。
- 要点:在于要么 x 方向总是整数要么 y 方向总是整数。保证方式通过让变化最大方向上的增量为 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <stdlib.h> #include <math.h> inline int round(const float a) { return int(a + 0.5); } void lineDDA(int x0, int y0, int xEnd, int yEnd) { int dx = xEnd - x0, dy = yEnd - y0, steps, k; float xIncrement, yIncrement, x = x0, y = y0; if (fabs(dx) > fabs(dy)) steps = fabs(dx); else steps = fabs(dy); xIncrement = float(dx) / float(steps); yIncrement = float(dy) / float(steps); setPixel(round(x), round(y)); for (k = 0; k < steps; k++) { x += xIncrement; y += yIncrement; setPixel(round(x), round(y)); } } |
中点线算法 Mid Point
- 改进点:浮点运算
- 整数判别表达式:由于网格线中点是可以直接表达的,构建一个表达式来判断中点是否在直线上。
- 应付考试为什么不能理解现场推公式:因为他有不显然的推导过程。。。
- 增量表达式:通过在公式时域上构建递推公式实现增量计算。
- 要点:由于横轴网格中点和纵轴网格中点的表达式不一样,导致不同斜率的增量表达式不一样,必须用 if else 写两套代码。
Bresenham 算法
- 这个和中点算法是同构的,画出来的点也是一目一样的。
- 不过他相对于中点线多了个 2倍避免小数。但是根据一些参考资料好像根本不会出现普通的中点线也不会出现小数?存疑,实际一般都用 bresenham 就行了。
- 四种情况,考虑斜率正的时候 x++ y++,表达式 d 两种,斜率负的时候 x++,y-- 表达式同样两种。不过至于 y 是+还是-其实可以算出来。为了统一,分为 x++,y?? 和 x??,y++ 的情况比较好写(表达式基本对称)。
- 代码是 cv wikipedia 的,现场推可以推出来,做不到。
中点圆算法
下面以第二个八分圆进行分析,最后再利用对称完成画圆。
然后进行一些取整操作,比如 0.25 有没有都一样,所以可以去掉的。改写成代码就是这样:
第一个八分圆的
第二个八分圆的
这里比较基础。就这么简略了,起码有代码是完备的内容,足够实现参考了。
图形学基础笔记I:直线和圆的光栅算法、中点线算法、中点圆算法相关推荐
- 计算机图形学第一次上机——中点线算法和中点圆算法
计算机图形学第一次上机实验 课程实验报告 目录 计算机图形学第一次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 1.中点线算法 2.中点圆算法 四.实验心得 附录:程序源代码 一. ...
- 计算机图形学基础笔记(1)
本文用来记录<计算机图形学基础>的学习笔记,陆枫.何云峰著. 第一章 绪论 1.1 相关概念 计算机图形学的研究对象是图形 图形要素包括几何要素和非几何要素 表示图形的方法主要有点阵法和参 ...
- 【图形学】Vol.2 - 直线和圆
直线和圆 DDA //只考虑k的绝对值小于等于1 int x; float dx, dy, k, y; dy = ey - sy; dx = ex - sx; k = dy / dx; y = sy; ...
- 图形学基础笔记II:多边形光栅化算法和显卡三角形光栅算法
为什么三角形就够了 实际对于 3D 来说肯定全是基于三角形的 geometry - OpenGL: Is it more efficient to use GL_QUADS or GL_TRIANGL ...
- 图形学基础笔记III:图形管线中的多边形裁剪算法、Sutherland-Hodgman、Guard Band Clipping
这个主要讲的是viewport 里的. 从 frustum (根据 fov 视场角 和 aspect ratio 纵横比决定 lrbt,front.near 是由摄像机距离和世界大小决定的)到 vie ...
- 计算机图形学基础(OpenGL版)实验四 直线裁剪
计算机图形学基础 实验四 直线裁剪 1.实验目的: 了解二维图形裁剪的原理(点的裁剪.直线的裁剪.多边形的裁剪),利用VC+OpenGL实现直线的裁剪算法. 2.实验内容: (1) 理解直线裁剪的原理 ...
- 直线与圆的位置关系怎么判断
<直线与圆的位置关系>这个知识点应用比较广泛,是几何知识的一个综合运用,在今后的解题及几何证明中,将起到重要的作用,所以就必须熟练掌握它们之间有哪些位置关系.为了更好地理解,我们可以借助数 ...
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...
- 图形学基础 | 计算机图形学MOOC学习笔记
计算机图形学 学习笔记 视频链接 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 补充一下一些图形学基 ...
最新文章
- 基于Dijkstra算法的武汉地铁路径规划!
- 计算几何常用算法的理论基础【转】
- Anchor free Detector:FCOS
- Codeforces Round #645 (Div. 2)(AB)
- 程序员特有的9个坏习惯
- mysql何时会走索引
- (王道408考研数据结构)第八章排序-第五节:归并排序
- 一分钟了解react
- 【神经网络与深度学习】CIFAR-10数据集介绍
- bootstrap 3.0 LESS源代码浅析(一)
- iReport 中使用 Chart 图
- 获取b站某个up的视频aid、cid
- ubuntu设置开机启动图形应用程序,替换默认图形桌面
- 兆芯国产电脑如何安装Windows+麒麟kylin双系统
- 微信公众号之渲染静态模板
- MobaXterm 详细安装使用教程 官网
- 常见硬件术语手册!绝对权威!(转!)六、声卡术语解释
- 分享给有缘人——给明年依旧年轻的我们:欲望、外界、标签、天才、时间、人生目标、现实、懊悔、和经历...
- 微软气坏了!Windows 惨遭抄袭,这款系统简直超越正品
- 联合国曝光,杀手机器人来了,这可能是你见过最恐怖的视频...
热门文章
- [c语言]c语言中a++ ++a在加法运算中和printf函数中的运算顺序(初学者版)
- 前 Twitter CEO 炮轰 Web 3,马斯克也来“掺和一脚”
- 关于一个字节占几位的问题
- Ubuntu20.04修复网络不显示问题
- 蹦起来!Python 用物理引擎Pymunk写一个解压小游戏
- 团队作业2——《需求规格说明书》
- hdu 2013 蟠桃记(c语言)
- HTML中的 nbsp; ensp; emsp;等6种空格标记
- 设置双卡不同的来电默认铃声
- 黄金入门时如何培养良好的交易习惯?