计算机图形学课程设计
--基于四叉树算法绘制颜色填充等值线图
姓名:陈明
学号:200905070110 学院:信息科学与技术学院 指导老师:黄地龙老师
一、 问题提出与需求分析
1、 问题及目标
问题:基于四叉树算法绘制颜色填充等值线图。
目标:利用四叉树思想用所给文件中的数据绘制等值线图,并绘出坐标系及颜色标识码。通过本次实验提高学生编程能力,加深对OpenGL的理解,加深对VC++6.0的认识。 2、 问题概念及算法原理
等值线是一组值相等的序列连线组成的图形。等值线图在实际中应用广泛, 如等高线图、等气压图等等。等值线的表达形式有两类:一类是画线等值线图;另一类是颜色填充等值线图。
依据数据分部不同,等值线图的绘制有两类方法:三角网法和矩形网格法。
三角网法是针对数据分布不规则的环境下的一种绘制方法。矩形网格法是一种针对数据分布规则的等直线图绘制方法。它是设平面区域按一定大小的网格距划分的矩形网格。
由于所给数据时矩形网格数据,所以本程序采用矩形网格法,并采用颜色填
充。改程序采用基于四叉树的颜色填充等值线图绘制方法。
四叉树的基本算法思想是:当网格四个节点的颜色值相等时,则用该颜色值填充该矩形,否则将矩形网格等分四个小网格,并用插值方法计算每个小网格的颜色值,递归使用网格四个节点的颜色值是否相等,由此依次建立一棵四叉树。当细分至四个节点的颜色值全部都小于或等于一个像素时,则将其视为等值线上的点,用来画等值线。
在该程序中,对于等值线处理比较粗糙,采用的是描点的方式,当四个节点的颜色值全部都小于或等于一个像素时,对其进行描点处理,这样处理的结果导致等值线不够光滑,且颜色级数不能过大,否则效果比较难看。一般来说颜色级数为11最佳,主要是本人能力有限。
二、 绘图程序设计的技术思路
1、 程序总体设计
利用四叉树思想绘制等颜色填充等值线图,首先应从数据文件中读取数据, 用二级指针**a来存放,并求出最大值max及最小值min,接收键盘输入的颜色
1
级数Ncolor,并求出等值颜色域的间距Dc,Dc=(max-min)/Ncolor。为了填充颜色得先建立颜色填充表,可以采用颜色类的方式,本程序中采用三个浮点型数组r、g、b来建立颜色填充表,由函数void Color(int m)来构造。
准备工作做好了开始构建四叉树,采用递归思想循环调用四叉树算法填充矩
形网格的颜色值,当x增量和y增量都小于1个像素点时则可认为该点为等值区域的边界点,即等值线上的点,作为描绘等值线的点。填充完毕后建立平面坐标系并绘制色码标识。
根据以上所述,程序设计步骤可分为以下几步:
(1)读入网格数据值,并求全区网格的最大值max和最小值min。 (2)给定等值线的级数Ncolor,求得等值线的间距Dc=(max-min)/Ncolor。 (3)建立填充颜色表r[],g[],b[]。
(4)循环递归调用四叉树算法填充网格矩形颜色值。 (5)等值线检测 (6)绘制平面坐标系 (7)绘制色码标识
2、 详细设计及各函数主要算法原理
(1)void TreeMath(float x,float y,float dx,float dy,int z1,int z2,int
z3,int z4); 递归调用四叉树算法填充网格矩形颜色值由下列式子分别计算z1、z1、z3、z4、的颜色索引值Ic1、Ic2、Ic3、Ic4,Ic1=int((z1-min)/Dc),Ic2=int((z2-min)/Dc),Ic3=int((z3-min)/Dc),Ic4=int((z4-min)/Dc)(Dc为等值颜色域的间距,min为数据最小值)。当它们颜色索引值相等时则说明它们位于一个等值区域(该区域是以点(x,y)和(x+dx,y+dy)为对角顶点的矩形),调用函数glColor3f(r[Ic1],g[Ic1],b[Ic1])对该区域设置对应的颜色。若dx,dy都小于1,则说明(x,y)位于等值域的边界上。否则循环递归调用该函数直到满足上面两个条件之一。
(2)void gltRasterText(float x, float y, const char *text, void *font)采用光栅思
想在(x,y)处输出text的值,输出字体为font,用于描绘坐标系,输出X轴和Y轴的坐标。
(3)void DrawCoordinate(float x,float y)绘制坐标系,(x,y)为图片开始的坐标,
即图片坐标系的原点,由于对OpenGL不是很熟悉,所以在本程序中采用的是画
2
网格的方法绘制图片的坐标系。在边缘部分都延长出去5个像素点,从原点开始每隔20个单位分别在X轴方向和Y轴方向画一条直线,X轴方向画column(数据文件中数据的列数)条,Y轴方向画row(数据文件中数据的行数)条,再调用gltRasterText(float x, float y, const char *text, void *font)在相应的地方输出坐标轴的坐标值。网格画好了再将图贴上去则把中间的网格覆盖,只留坐标轴。由于是先画网格后画图,所以部分坐标轴会被覆盖,所以外围四条线单独在绘图完成后再画。
(4)void DrawCodeIdentifier(float x,float y);色码标识绘制函数,从点(x,y)开
始沿X、Y的正向绘制色码标识,色码标识由Ncolor(颜色级数)个小矩形构成,其颜色是由红色到绿色连续变化的,代表值的从小到大并调用函数gltRasterText(float x, float y, const char *text, void *font)在相应地方标出其所代表的值的大小,最小值min(数据最小值),按步长Dc(等值颜色域的间距)从红色到绿色依次递增。
(5)void display(void);窗口的显示回调函数。调用以上函数绘制完整的等值
线图,循环调用TreeMath(float x,float y,float dx,float dy,int z1,int z2,int z3,int z4)函数对整个数据网格进行填充,绘制完整的颜色填充等值线图。
三、 主要程序设计的说明
1、 变量说明
下列变量因为要多个函数共用,为了方便,所以将其声明为全局变量。 int max,min; max用来记录网格数据中的最大值,min用来记录网格数据中 的最小值。
int Ncolor;用来设置颜色的级数,动态设置,接收键盘的输入。 int Dc;用来记录等值颜色域的间距,Dc=(max-min)/Ncolor。
float *r,*g,*b;用于构建颜色填充表,其大小由颜色级数Ncolor来进行动态分
配。分别代表RGB三种颜色的颜色值。
int row,column; row用于记录网格数据的行数,column用于记录网格数据的
列数。
int **a;用于存放网格数据值。其大小由行数row和列数column动态分配。
2、 函数说明
3
相关推荐: