
图形学基础知识
Magic_Conch_Shell
菠萝屋会有的~
展开
-
几何检测
概述几何检测主要相交性检测,这里的内容大体上是根据《3D数学基础-图形与游戏开发》这本书来的,对于这本书来说,这一部分看完了后面内容就不看了,因为后面讲的太空泛了,有点像一本绝世武功的目录一样,看似很强,其实没什么卵用。1.2D隐式直线上的最近点问题描述:直线p * n = d,对于任意点q,找出直线上距离q最短的点q’同高中解析几何简单粗暴的公式不同,这里面的算法都是基于向量来计算的...原创 2019-11-03 09:05:39 · 851 阅读 · 0 评论 -
四元数的差、对数、指数、幂以及差值
概要对于四元数的学习基本上都是参照《3D数学基础-图形与游戏开发这本书的内容的》对于这本书前面的部分还是很好理解的,但是从四元数的差这里开始,就过于抽象了,不配合实例很难去理解。因此,这一段被我单独提取出来,在实践中进一步去理解。差,对数,指数等是定义式,不要试图在四元数的这些操作中找到这些数学符号的本身含义,它只是被定义成这样子的,没有为什么。。四元数的差四元数的差表示四元数的两个四元...原创 2019-11-01 10:25:14 · 7425 阅读 · 0 评论 -
欧拉角、四元数、旋转矩阵的互相转换
概述方法来自于《3D数学基础,图形与游戏开发》这本书。学习这些转换可以加深自己对这些知识点的理解~两两转换一共有六种情况,下面就依次列举一下这六种情况。1.从欧拉角转换到矩阵这种情况的转换不难,还记得我们的旋转矩阵长啥样吗,欧拉角的三个值就是坐标系绕着特定轴旋转的值,注意是坐标系旋转哦,点的旋转值是和坐标系的旋转值相反的,需要把旋转矩阵的角度取反。比如下面就是绕y轴的旋转矩阵,角度h取反...原创 2019-10-31 21:19:08 · 778 阅读 · 0 评论 -
万向锁的理解
万向锁万向锁这个概念其实还是不大好理解的,看了很多的博客,虽然看起来他们讲的很有道理,可还是想不通。希望我这篇文章能讲清楚。。。万向锁产生的根本原因是绕三个轴的旋转不是同时进行的,想象一下我们旋转矩阵的推导是不是绕三个轴的旋转矩阵乘起来得到的,这三个旋转矩阵的摆放顺序不同,最后得到的旋转矩阵也是不相同的,因此,一般的系统都会有一个规定,比如unity来说,先绕y轴旋转,然后绕x轴旋转,最后是...原创 2019-10-31 19:19:04 · 4320 阅读 · 5 评论 -
向任意平面的投影矩阵的推导
概述方法来自于《3D数学基础,图形与游戏开发》这本书。基本原理这个方法其实有点思维跳跃,原理是首先推导出一个任意方向n缩放比例为k的缩放矩阵,然后将k变成0,这就变成了向垂直于n的投影平面的投影矩阵缩放矩阵的推导对于坐标轴上的缩放,我们很容易就能获得缩放矩阵:[kx000ky000kz] \begin{bmatrix}kx&0&0\\0&ky&0\\...原创 2019-10-30 22:01:31 · 1267 阅读 · 0 评论 -
绕坐标轴以及任意轴的旋转矩阵的推导
概述本文主要是针对《3D数学基础-图形与游戏开发》这本书的读书笔记,这本书前面部分还是讲得挺好的,有时间还是建议读一下。旋转矩阵的推导旋转矩阵怎么来的我倒一直都没有概念,这本书里面对旋转矩阵的来历倒是给了我一些启发。首先从二维的旋转矩阵开始[cosθsinθ−sinθcosθ] \begin{bmatrix}cos\theta & sin\theta \\ -sin\theta...原创 2019-10-30 19:54:19 · 8796 阅读 · 3 评论 -
计算机图形学常用算法实现11 扫描线z-buffer算法
图形学作业要到deadline了,赶紧写一个这个算法比之前的算法的工作量都要大,但是只要思路清晰,也不是很难。1.创建各种需要的数据结构类//点的类class Point{public: float x; float y; float z; Point(); ~Point();};//y表class YTable{public: int m_IndexOfPoly...原创 2019-01-10 10:36:04 · 5106 阅读 · 1 评论 -
计算机图形学常用算法实现8 中点分割裁剪算法
这种方法使用了二分法查找边界,优化了Cohen-Sutherland方法,减小了讨论的数量。代码如下:int encode(Point p){ int code = 0; if (p.Y > 400) code += 8; if (p.Y < 200) code += 4; if (p.X > 400) ...原创 2018-11-28 17:58:48 · 2373 阅读 · 0 评论 -
计算机图形学常用算法实现7 Cohen-Sutherland裁剪算法
在winform下运行算法本身的实现不算很难,但是这个算法的思路很秀,反正我是想不出来。代码中的区域为(200,200)~(400,400)的区域int encode(Point p){ int code = 0; if (p.Y > 400) code += 8; if (p.Y < 200) code += 4; ...原创 2018-11-28 15:42:24 · 2413 阅读 · 0 评论 -
计算机图形学常用算法实现6 区域填充算法-非递归形式(扫描线优化)
运行环境winform这个算法基本上是书上的思路,没有很大的变动,感觉代码写的很秀,很有水平。不断把所有待填充的区间添加到stack,然后一个个填充,效率比之前写的都要高一些。主要代码如下(多边形的构建,map函数的初始化等需要自行添加):void ScanLineFill4(int x,int y){ int xl, xr, i; bool spanNeedFill;...原创 2018-11-28 13:47:57 · 1272 阅读 · 0 评论 -
计算机图形学常用算法实现5 区域填充算法-递归形式
递归形式的区域填充算法的效率实在是太低了(就是裸的dfs),导致图形大一点就会爆栈,没有很大的实用性。但可以通过扫描线进行优化,具体的优化代码可以参考下一节。如果有时间,之后我也会在后面补上优化后的算法。代码如下:void floodFill4(int x,int y,int i){ if (map[x, y] == false) { g.Fill...原创 2018-11-27 23:34:22 · 1192 阅读 · 0 评论 -
计算机图形学常用算法实现4 多边形扫描转换算法-边界标志算法
代码是在winform中运行的。看书上这个算法写起来轻描淡写的,实际上实现起来还是有很多难点的,难点如下:1.无法判断经过某个点的时候是不是应该变号。2.扫描算法画直线的时候,可能同一行有多个点相邻的情况,如果遇到这样的点就变号结果会出现错误。3.两条相邻边的路径可能经过同一个点,尤其是dy&amp;gt;&amp;gt;dx的时候,不加以判断还是会出错。解决方法如下:1.借用扫描线算法的思路,如果经...原创 2018-11-27 21:14:29 · 1559 阅读 · 0 评论 -
计算机图形学常用算法实现3 多边形扫描转换算法-扫描线算法
这个算法其实很复杂的,实现起来需要有耐心,一步一步按照算法思路来写代码。在算法中,我使用的是静态链表(c#没有指针-_-||)下面的AET为活性边表,NET存储新边表1.定义数组,变量 class AET//定义AET表,不论是AET还是NET表用的都是这个AET类,因为里面的内容都是一样的 { public float x; public floa...原创 2018-11-27 13:19:17 · 6908 阅读 · 3 评论 -
计算机图形学常用算法实现2 中点画圆法
在winform下实现,如果在其他环境,思路完全一样,只需替换画图的函数即可。中点画圆法算是中点画线法思路的一种实际应用,本质是一样的。1.对称画图,只需要画1/8部分的圆(我们的函数里面取45~90度部分),其他部分对称画过去即可,对称画图的代码如下: void drawCirclePoints(Point p1,Point p2) { ...原创 2018-11-27 12:44:05 · 1615 阅读 · 0 评论 -
计算机图形学常用算法实现1 DDA,中点画线法,bresenham算法
打算手动实现图形学中的绝大部分算法。运行环境winform+c#我们的函数默认是按x坐标顺序递增传入的,因此在调用下面函数之前,需要保证p1.x&amp;amp;amp;amp;lt;p2.x(可以减少讨论数量) Point pp = new Point(); if (p1.X &amp;amp;amp;amp;gt; p2.X) { ...原创 2018-11-27 12:09:25 · 5299 阅读 · 1 评论 -
计算机图形学常用算法实现10 多边形裁剪Sutherland-Hodgman算法
算法原理比较简单,用裁剪区域的四条边分别去分割多边形。假设边p1,p2,用区域某条边进行裁剪。方向为p1-&amp;amp;gt;p21.p1在边外,p2在边外无操作2.p1外,p2内保存交点p和p23.p1内,p2内保存p24.p1内,p2外保存交点分割完之后更新多边形的点集代码裁剪区域为(200,200)到(400,400) private void SutherlandHodgm...原创 2018-11-30 12:24:49 · 4934 阅读 · 14 评论 -
计算机图形学常用算法实现9 梁友栋-Barskey裁剪算法
这个算法的效率比前面提到的Cohen-Sutherland要高思路是把直线表示为参数方程形式,x= x1+udxy = y1+udy由xmin<x<xmaxymin<y<ymax可以得到四个不等式,简化成同一个形式up<q 当p不等于0的时候,可以算出来u与边界的交点,p等于0的时候,左边等于0,只需简单的判断q的正负。然后求直线和边界以及边界延长线的四...原创 2018-11-30 10:42:04 · 3295 阅读 · 1 评论