3、利用网格序列法实现等值线生成(等值为0.4,0.6,结果用不同颜色的线
标示)
4、用三角剖分法优化上述结果
!
二、主要技术及实现
本实验开发环境为Visual Studio 2013,采用基于C++的MFC类库。
本次实验,所要实现的等值线生成算法为网格序列法,以及其优化三角剖分
法。伪代码可以参考教材相应部分。
算法实现的主要步骤和要点:
1. 绘画网格
通过for循环即可实现
2. 网格顶点赋值
题目一直接初始化二维数组为对应的值,题目二通过rand()函数得到随机值
(注意需要先调用srand()函数初始化随机种子)
3. 生成等值线
逐个网格进行处理。每个顶点相对于等值线的值有正负两种符号。
对于网格序列法而言,考虑当前网格的四个顶点符号,分为全部相同,三正
(负)一负(正),两正两负,三种情况。后两种需要生成等值线,最后一
种如果是对顶角符号相同,还需要处理马鞍点二义性。
对于三角剖分法而言,除了四个顶点符号全部相同的情况,需要生成等值
线。首先枚举四条边,找到该网格内等值线的起点。这里确定了两个点的符
号,网格内还剩下三个点,即另外两个顶点和中点。接下来用三重的if-
else嵌套对这三个点符号的所有情况进行讨论,将线性插值法生成的顶点依
次连接即可。
4. 网格序列法中二义性处理
依据线性插值法判断中点的正负,生成等值线使得中点与同区域的顶点正负
值相同。
5. 线性插值法
考虑直线pq,(px, py)为点p坐标,pv为点p的值,点q类似。ev为等值线的
值。
那么等值点就应该是:
point{ px + (qx - px) * (ev - pv) / (qv - pv),
py + (qy - py) * (ev - pv) / (qv - pv) }
6. 程序具体实现的一些说明
网格序列法的实现可以直接参考代码和注释。
三角剖分法由于需要确定选取哪条边作为起点,所以会有四段功能类似的代
码(其实只要三段)。为了代码实现上的方便,引入“旋转”的概念,从而
只需要一段代码。
考虑当前网格,顶点为(i,j), (i+1,j), (i,j+1), (i+1,j+1),分别标号为
0,1,2,3号顶点。如果01顶点的符号不同,可以选直线01上的等值点作为起