第一章 绪论
计算机图形学:
国际标准化组织(ISO)的定义:计算机图形学是研究通过计算机将数据转换为图形,并在专门显示设备上显示的原理,方法和技术的学科。
IEEE:计算机图形学是借助计算机产生图形,图像的技术或科学。
Computer graphics is the art or science of producing graphical images with the aid of computer.
计算机图形学:数据模型变为数字图像
计算机视觉,模式识别:数字图像变为数据模型
图像处理:数字图像变为数字图像
计算机辅助几何设计:数据模型变为数据模型
一
C语言常用图形函数:
#include
显示器有两种模式:
文本模式:默认模式,只能显示文本,图形函数不能工作
图形模式:图形函数可以工作,能够显示图形,并且有专门的文本输出函数
图形模式的初始化函数:
void initgraph(int *gdriver, int *gmode, char *path)
其中:gdriver用来指定要装入的图形驱动程序,gmode用来设置图形显示模式
path用来指定图形驱动程序所在的目录路径,默认为“C:/Win-TC/projects”,若为空,则到程序所在的当前目录下寻找。
图形模式的初始化方法:
用户指定图形模式
自动检测图形模式
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“C:/Win-TC/projects”);
图形模式的关闭:
显示器退出图形模式回到文本模式:void closegraph();
二
绘制一个矩形
void main()
{
int gdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,“C:/Win-TC/projects”);
rectangle(100,100,300,250);
getch();
closegraph();
}
三
设置背景色:void setbkcolor(int color);
设置前景色:void setcolor(int color);
清除图形屏幕内容:void cleardevice();
四
画点函数
将点(x,y)置成color色:void putpixel(int x,int y,int color);
获得当前点(x,y)的颜色值:int getpixel(int x,int y);
有关坐标位置的函数
返回x轴的最大值:int getmaxx();
返回y轴的最大值:int getmaxy();
返回游标在x轴的位置:int getx();
返回游标在y轴的位置:int gety();
移动游标到(x,y)点:void moveto(int x,int y);
将游标从现行位置(x,y)移动到(x+dx,y+dy)的位置,移动过程中不画点:void moverel(int dx,int dy);
画线函数
画一条从点(x0,y0)到(x1,y1)的直线
void line(int x0,int y0,int x1,int y1);
画一条从现行游标到点(x,y)的直线
void lineto(int x,int y);
画一条从现行游标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线
void linerel(int dx,int dy);
画圆弧类
以(x,y)为圆心,radius为半径,画一个圆
void circle(int x,int y,int radius);
以(x,y)为圆心,radius为半径,从stangle开始到endangle,画一段圆弧线,逆时针
void arc(int x,int y,int stangle,int endangle,int radius);
以(x,y)为圆心,xradius,yradius为x轴和y轴半径,从stangle开始到endangle,画一段椭圆线
void ellipse(int x,int y,int stangle,int endangle,int xradius,int yradius);
画多边形类函数
以(x1,y1)为左上角,(x2,y2)为右下角,画一个矩形框
void rectangle(int x1,int y1,int x2,int y2);
画一个顶点个数为numpoints(取值多边形顶点数+1),各个顶点坐标由整型数组polypoints(中最后一个点与第一个相同)给出的多边形
void drawpoly(int numpoints,int *polypoints);
五
线型(style)
线宽(width)
设置当前绘图所用的线型和宽度
setlinestyle(int style,unsigned pattern,int width)
pattern:如果线型使用系统预定义的4种,就设为0。pattern是一个16位二进制数,每一位为1时显示。
六
为各种图形函数设置填充模式和颜色
setfillstyle(int pattern,int color)
color是填充颜色 pattern指定填充模式
用于对一指定的封闭区域进行填充,其填充模式和颜色由setfillstyle函数决定
floodfill(int x,int y,int border)
x,y指位于填充区域内任意一点的坐标,border为填充区域边界的颜色
用户自定义的填充模式
setfillpattern(char *pattern,int color)
七
测试要保存左上角为(x1,y1),右下角为(x2,y2)的图形屏幕区域内的全部内容需要多少字节
unsigned imagesize(int x1,int y1,int x2,int y2);
将左上角为(x1,y1),右下角(x2,y2)的图形屏幕区域内的图像保存在内存中,指针为mapbuf
void getimage(int x1,int y1,int x2,int y2,void *mapbuf)
将图像输出到左上角为点(x,y)的位置上,其中参数op规定如何释放内存中的图像
void putimage(int x,int y,void *mapbuf,int op)
八
文本输出函数
在现行位置输出字符串指针textstring所指的文本:
void outtext(char *textstring);
在规定的(x,y)位置输出字符串指针textstring所指的文本
void outtextxy(int x,int y,char *textstring);
第二章 基本图形的生成
基本图形的生成原理:是指在点阵输出设备上,如何快速的确定一个最佳逼近与理想图形的像素集,并用指定颜色把这些像素显示出来。
直线的生成
(1)数值微分法(DDA法)
对于|k|≤1的直线段
①若x2≥x1,则x++,y=y+k,取像素点(x,int(y+0.5))//四舍五入
②否则,x–,y=y-k,取像素点(x,int(y+0.5))
对于|k|>1的直线段
①若y2≥y1,则y++,x=x+1/k,取像素点(int(x+0.5),y)//四舍五入
②否则,y–,x=x-1/k,取像素点(int(x+0.5),y)
(2)中点画线法
假定直线斜率0<k<1,直线过P1P2这个,竖着的线上一点Q,取中点M,
若M在Q上方,则P1离直线更近,选择P1为下一个像素
若M在Q下方,则P2离直线更近,选择P2为下一个像素
若M与Q重合,则P1P2任取一点
(xp,yp)为P1左边一点,M就表示为(xp+1,yp+0.5)
d=F(M)=a(xp+1)+b(yp+0.5)+c
若d<0,M在直线下方,取P2
若d>0,M在直线上方,取P1
若d=0,M在直线重合,P1P2任取一点
当d≥0时,取P1,再下一个就为
d1=F(xp+2,yp+0.5)=d+a
当d≥0时,取P2,再下一个就为
d1=F(xp+2,yp+1.5)=d+a+b
最终问题就可以变为:
假设直线的第一个像素为左端点(x1,y1)
d0=F(x1+1,y1+0.5)=F(x1,y1)+a+0.5b
d0=a+0.5b
再依次根据di的大小判断,就好了
(3)Bresenham画线法
基本原理:
假设直线斜率k在0到1之间,并且直线当前已确定的一个像素点为(xk,yk)。则下一步需要在列xk+1上确定扫描线y的值,将要选择两点到直线上点的距离做差,来作为依据选择。
圆与椭圆的生成
由于圆有对称性,我们只需要解决1/8圆弧
中点画圆法
跟中点画线法很像
若d<0,取正右方向增量为2xp+3
若d≥0,取右下方向增量为2(xp-yp)+5
d0=1.25-r
最开始x=0,y=r
由于椭圆有对称性,我们只需要解决1/4椭圆弧
上半部分2b²x<2a²y≥0
若d<0,取正右方向增量为b²(2xp+3)
若d≥0,取右下方向增量为b²(2xp+3)+a²(-2yp+2)
d0=b²+a²(-b+0.25)
下半部分2b²x≥2a²y>0
若d≤0,取P2(右下方向)增量为b²(2xp+2)+a²(-2yp+3)
若d>0,取P1(正下方向)增量为a²(-2yp+3)
d0=b²(x+0.5)²+a²(y-1)²-a²b²
区域填充
填充方法:
(1)种子填充算法
四连通区域
八连通区域
边界:区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素可以与边界的颜色相同
(2)有序边表填充算法
(3)边填充算法
对每一条水平扫描线,依次求与多变形各边的交点,将该扫描线上交点右边的所有像素求补,对多边形的每条边作此处理。顺序随意。
(4)图案填充
图案填充方式:
透明方式:当图案位图的对应位置为1时,用前景色写像素,否则,不改变该像素的颜色值
不透明方式:当图案位图的对应位置为1时,用前景色写像素,否则,用背景色写像素
对齐方法
第一种对齐方法:把图案与边界或内部某点对齐,填充的图案将随着区域的移动而跟着移动,看起来自然,但算法复杂性高
第二种对齐方法:把图案与边界或外部部某点对齐,算法简单,但是当区域移动时,图案不会跟着移动
假设上一像素坐标为(x,y),则它在图案模型上对应的位置是(x mod M,y mod N)
裁剪
直线段的裁剪
(1)编码裁剪算法
①若两个端点编码都为0000,则整条线段全部位于窗口内
②若两个端点编码的位逻辑按位与不为0,则整条线段全部位于窗口外
③若线段不能由以上两种测试决定,则可能部分可见,需求交点,把线段再分割
1001 1000 1010
0001 0000 0010
0101 0100 0110
(2)中点分割裁剪算法
分别寻找直线段两个端点各自对应的最远可见点,这两个最远可见点之间的线段即为要输出的可见段
多边形的裁剪
(1)逐边裁剪算法
依次用窗口的四条边框直线对多边形进行分步裁剪。先用一条边框直线对整个多边形进行裁剪,得到一个或若干个新的多边形;再用第二条边框直线对这些新产生的多边形进行裁剪。以此类推,直到用四条边框直线都裁剪完。
线宽与线型的处理
线刷子
垂直线刷子:直线斜率在[-1,1]时,把刷子置成垂直方向
水平线刷子:直线斜率不在[-1,1]时,把刷子置成水平方向
直线线刷子(一维循环)
正方形刷子(二维循环)
线型可以用一个布尔值序列来存放
第三章 图形变换
几何变换,改变几何形状和位置
非几何变换,改变图形的颜色,线型等属性
图形变换:一般是指对图形的几何信息经过变换后产生新的图形
案例1 三维图形几何变换算法116
案例2 正交投影算法129
案例3 三视图算法135
案例4 透视投影算法141
案例5 二维图形几何变换算法83
第四章 参数样条曲线
二次参数样条曲线:P(t)=A0+A1t+A2t²
三次参数样条曲线:P(t)=A0+A1t+A2t²+A3t³
插值与逼近
插值方法要求建立的曲线或曲面数学模型,严格通过已知的每一个型值点
逼近方法建立的曲线或曲面数学模型只是近似的接近已知的型值点
拟合
是指在曲线或曲面的设计过程中,用插值或逼近的方法使生成的曲线或曲面达到某些设计要求。
参数连续性与几何连续性
二次插值样条曲线
P(t)=(2t²-3t+1)P1+(-4t²+4t)P2+(2t²-t)P3
二次插值样条曲线的加权合成
三次插值样条曲线
三次自然样条曲线
Hermite样条曲线
Cardinal样条曲线
Bezier曲线(逼近)
P是控制点并不是曲线上的点
B样条曲线
二次B样条曲线
三次B样条曲线
第五章 几何造型
几何造型:是指能将物体的形状存储在计算机内,形成该物体的三维几何模型,并能 为各种具体应用提供信息的一种技术
点
控制点:用来确定曲线和曲面的位置与形状,而相应曲线和曲面不一定经过的点。
型值点:用来确定曲线和曲面的位置与形状,而相应曲线和曲面一定经过的点。
插值点:为提高曲线和曲面的精度,在型值点之间插入的一系列点。
边
边是一维几何元素,是两个相邻面(对于正则形体)或多个相邻面(对于非正则形体)的交界。
直线边由其端点(起点和终点)定界;曲线边由一系列型值点或控制点表示,也可用显式、隐式方程表示。
环
环是由有序、有向边组成的面的封闭边界。环中的边不能相交,相邻两条边共享一个端点。
内环和外环
确定面的最大外边界的环称为外环,其边按逆时针方向排序;
确定面中内孔边界或凸台边界的环称为内环,其边按顺时针方向排序。因此,在面上沿一个环前进,左侧总在面内,右侧总在面外。
体
体是三维几何元素,是由封闭表面围合成的有效空间,其边界是有限面的并集。
体素
体素是可以用有限个尺寸参数定位和定形的体,比如长方体、圆柱体、圆锥体、圆环体、球体、棱柱体、棱锥体、棱台体等。也可以是由参数定义的一条(或一组)截面轮廓线沿一条(或一组)空间参数曲线作扫描运动而产生的形体。
几何信息:用于描述几何元素(如点、线、面等)的空间位置和大小。比如,点的空间坐标值、线段的长度等。
拓扑信息:用于描述几何元素之间的相互连接关系。只反映几何元素的结构关系,不考虑它们各自的绝对位置,这种关系称为拓扑关系。几何元素之间共有九种拓扑关系:面-面相邻性、边-边相邻性、顶点-顶点相邻性、边-面相邻性、顶点-面相邻性、顶点-边相邻性、面-边包含性、面-顶点包含性、边-顶点包含性。
布尔运算
两个多边形之间进行并,交,差的运算
分形几何造型
真实感图形
消除隐藏线
平面体的消隐处理
曲面体的消隐处理
光照模型与明暗效应
基本光照模型
只考虑环境光和点光源
Flat明暗处理法
Gouraud明暗处理法
Phong明暗处理法