计算机图形学
作者:互联网
计算机图形学期末复习
第一章 绪论
- 计算机图形学定义:计算机图形学是研究通过计算机将数据转换成图形,并在专门显示设备上显示的原理、方法和技术
第二章 计算机设备及硬件系统
知识点
-
阴极射线管(CRT)
-
光栅扫描图形显示器:垂直回扫、水平回扫
-
液晶显示器:
-
工作原理:利用液晶的光电显示效应,通过施加电压改变液晶的光学特性,从而造成对入射光的调制,使通过液晶的透射光或反射光受所加电压的控制,达到显示的目的。
(通过对液晶电场的控制可以实现光线的明暗变化,从而达到信息显示的目的)
-
-
光栅扫描图形显示子系统的结构(p35)
- 重要部件:帧缓冲存储器、显示控制器
- 帧缓冲存储器(显存):存储像素的颜色(灰度)的存储器,可由显示控制器直接访问
- 显示控制器:依据设定的显示工作方式,读取显存里的数据,并转换成三原色并配以同步信号给显示器
注意事项
- 液晶显示器的亮度没有CRT的高
- 扫描转换过程:像素信息从应用程序转化并放入帧缓冲区的过程
第四章 图形的表示与数据结构
- 基本元素:
- 定义:指可以用一定的几何参数和属性参数描述的最基本的图形元素
- 组成:点、线、面、环、体等
- 几何信息与拓扑信息:
- 几何信息:一般指形体在欧氏空间的位置和大小
- 拓扑信息:形体各分量(点、线、面)的数目及相互间的连接关系(9中拓扑关系)
第五章 基本图形生成算法
-
直线扫描转换:
数值微分法(DDA) 中点Bresenham算法 Bresenham算法 判别式 无 有,取中点,判别d 有,判别误差e 取舍 四舍五入,有误差 不做四舍五入 不作除法、无四舍五入 -
多边形的扫描转换/多边形填充:
- 定义:从多边形顶点表示到点阵表示
- x扫描线算法:左闭右开的原则
- 改进的有效边表算法(y连贯性算法):
-
边缘填充算法
-
区域填充算法
-
反走样:
- 走样(图形失真):离散量表示连续量而引起的失真
- 反走样(图形保真技术):用于减少或消除走样的现象的技术
- 造成走样的原因:直线段或曲线段的数学描述是连续的,而光栅显示器上显示的直线段或曲线段是由一些离散的、面积不为0的像素点组成的
- 避免走样的方法:
- 过取样(后滤波):在高于显示分辨率的较高分辨率下用点取样方法计算,然后对几个像素的属性进行平均,得到较低分辨率下的像素属性
- 区域取样(前滤波):根据图形对象在每个像素点上的覆盖率来确定像素点的亮度,这种计算覆盖率的方法
第六章 二维变换级二维观察
二维变换
- 基本几何变换都是相对于坐标原点和坐标轴进行的
裁剪
-
直线段裁剪:编码裁剪、中点分割裁剪、梁友栋算法
-
多边形裁剪:
第七章 三维变换及三维观察
三维变换
- 注意:三维变换中,绕y轴的旋转变换的特殊
三维观察
(规定以逆时针旋转方向为正向;三视图:以Z轴正向朝上)
-
平面几何投影:
- 透视投影:投影中心到投影面的距离有限
- 平行投影:投影中心到投影面的距离无限
- 正投影:三视图、正轴侧投影(对任意平面做投影)
- 斜投影:投影方向不垂直于投影面;投影方向和投影面成45°
投影在x0y平面
-
正轴测投影变换矩阵:
-
斜轴测投影变换矩阵:
- α=45°,β=30°或者45°
透视投影
- 投影矩阵:(中间的为透视变换矩阵)
-
主灭点:坐标轴方向的平行线在投影面上形成的灭点
-
根据主灭点个数分为:一点透视、二点透视、三点透视
-
观察坐标系:
-
OpenGL中的变换
-
OpenGL视点变换函数:OpenGL视点变换函数用于确定观察参考坐标系,即确定视点的位置和观察方向,默认情况视点位于原点,观察方向为Z轴负向。
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz,GLdouble upx, GLdouble upy, GLdouble upz);
-
OpenGL投影函数:
-
平行投影:
-
透视投影:
-
-
第八章 曲线与曲面
-
样条曲线中的边界条件:自由端、夹持端、抛物端
-
样条曲线:
- 定义:指由多项式曲线段连接而成的曲线,在每段的边界处满足特定的连续条件
-
hermite插值样条:
- 可以局部调整,因为每个曲线段仅依赖于端点约束
- 当曲线的端点及端点的切线方向确定时,若给定不同的切线长度,将有不同形状的Hermite曲线。
-
Bezier曲线/曲面:
- 是一个阶数比控制点少一的多项式
- 只有第一个点和最后一个点在曲线上
- 不能对曲线形状进行局部控制,任意改变一控制点,整条曲线受影响
- Bezier曲线的性质:
- 端点:曲线总是通过起点和终点
- 一阶导数:起点的切线位于前两个控制点的连线上,终点的切线位于最后两个的连线上
- 二阶导数:曲线在起始点和终止点处的r阶导数由起点或终止点和它们的r个相邻的控制点决定
- 对称性
- 凸包性:
- 几何不变性:曲线形状只与控制多边形各顶点的相对位置有关,与坐标系的选择无关
- 变差减少性:曲线比控制多边形更加光滑
- 控制顶点变化对曲线形状的影响
-
B样条曲线/曲面:
-
性质:
-
第九、十章 消隐、真实感图形绘制
消隐
- 物体空间的消隐算法:是将物体表面上的k个多边形中的每一个面与其余的k-1个面进行比较,精确地求出物体上每条棱边或每个面的遮挡关系(多 边形的区域排序算法)
- 图像空间的消隐算法:对屏幕的每一像素进行判断,以决定物体上哪个多边形在该像素点上是可见的(如深度缓存算法)
简单光照模型
入射光=反射光+透射光+散射光+吸收光
简单光反射模型=漫反射光+环境光+镜面反射光
-
环境光:是光在物体和周围环境之间多次反射的结果,即是来自周围的环境对光的反射。环境光的特点是:它不是直接自光源,而是照射在物体上的光来自周围各个方向,且又均匀地向各个方向反射
Ie=Ia·Ka
-
漫反射光:漫反射光是在光的照射下,物体表面发射的反射光均匀地射向各个方向
Id=Ip·Kd·cos(a)
-
镜面反射光:镜面反射是点光源照射在一个与物体光泽的表面(如镜子、光亮的金属等)有关的反射光。它的特点是光源来自一个光方向,并沿某特定方向(反射方向)离开
-
OpenGL绘制函数:
-
OpenGL消隐处理:
-
OpenGL光照与材质:
-
OpenGL纹理贴图:
-
程序设计
编码裁剪
//编码定义
char clipCode(const GPoint2d &pt, const GRect2d &rc)
{
char code = 0;
if(pt.y() > rc.y1()) code |= 0x01;
else if(pt.y() < rc.y0()) code |= 0x02;
if(pt.x() > rc.x1()) code |= 0x04;
else if(pt.x() < rc.x0()) code |= 0x08;
return code;
}
//裁剪
bool gltLineClip2d(GPoint2d &pt0, GPoint2d &pt1, const GRect2d &rc)
{
char c0, c1;
while(true)
{
c0 = clipCode(pt0, rc);
c1 = clipCode(pt1, rc);
if((c0 & c1) != 0) return false;//按位与,两点在同一个测
if(c0 == 0 && c1 == 0) return true;//两点在窗口内
if(c0 == 0)
{
swap(pt0, pt1);
swap(c0, c1);
}
if(c0 & 0x01) // 在 Yt 之上
{
pt0.setX(pt0.x()-(pt0.y()-rc.y1())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
pt0.setY(rc.y1());
}
else if(c0 & 0x02) // 在 Yb 之下
{
pt0.setX(pt0.x()-(pt0.y()-rc.y0())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
pt0.setY(rc.y0());
}
else if(c0 & 0x04) // 在 Xr 之右
{
pt0.setY(pt0.y()-(pt0.x()-rc.x1())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
pt0.setX(rc.x1());
}
else if(c0 & 0x08) // 在 Xl 之左
{
pt0.setY(pt0.y()-(pt0.x()-rc.x0())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
pt0.setX(rc.x0());
}
}
}
Bezier曲线
//bezier的Castel推分算法
double bezierCastel(double x[],int n,double t){
for(int r=1;r<n;r++){
for(int i=0;i<n-r;i++){
x[i] = (1-t)*x[i]+t*x[i+1];
}
}
return x[0];
}
void gltBezier2d(const GPoint2dArray &points){
if(points.count<2)
return;
double x0,y0,x1,y1;
double t,dt;
GPoint2d pt;
int n = points.count();
dt = 1.0f/(n*20);
double *x = new double[n];
double *y = new double[n];
pt = points.at(0);
x0 = pt.x();
y0 = pt.y();
for(int i = 0;i<n;i++){
pt = points.at(i);
x[i] = pt.x();
y[i] = pt.y();
}
for(t=dt;t<1;t+=dt){
x1 = bezierCastel(x,n,t);
y1 = bezierCastel(y,n,t);
gltLine2d(x0,y0,x1,y1);
x0 = x1;
y0 = y1;
}
pt = points.at(n-1);
gltLine2d(x0,y0,pt.x().pt.y());
delete []x;
delete []y;
}
B样条曲线
//b样条基函数
void cubicBSplineBase(int begin,const GPoint2dArray &points,double t,GPoint &pt){
float fh1 = (-t*t*t+3*t*t-3*t+1)/6;
float fh2 = (3*t*t*t-6*t*t+4)/6;
float fh3 = (-3*t*t*t+3*t*t+3*t+1)/6;
float fh4 = (t*t*t)/6;
GPoint pt0 = points.at(begin);
GPoint pt1 = points.at(begin+1);
GPoint pt2 = points.at(begin+2);
Gpoint pt3 = points.at(begin+3);
pt.setX(fh1 * pt0.x() + fh2 * pt1.x() +fh3 * pt2.x() + fh4 * pt3.x());
pt.setY(fh1 * pt0.y() + fh2 * pt1.y() +fh3 * pt2.y() + fh4 * pt3.y());
}
void gltBSpline2d(const GPoint2dArray &points){
if(points.count()<4)
return ;
double x0,y0;
double t,dt;
GPoint pt;
int n = points.count();
dt = 0.05;
for(int i=0;i<n-3;i++){
cubicBSplineBase(i,points,0,pt);
x0 = pt.x();
y0 = pt.y();
for(t=dt;t<1;t+=dt){
cubicBsplineBase(i,points,t,pt);
gltLine2d(x0,y0,pt.x(),pt.y());
x0 = pt.x();
y0 = pt.y();
}
cubicBSplineBase(i,points,t,pt);
gltLine2d(x0,y0,pt.x(),pt.y());
}
}
标签:计算机,曲线,图形学,算法,rc,c0,pt1,pt0 来源: https://www.cnblogs.com/Christal-pyy/p/14099418.html