1、科学计算可视化实验报告等值线生成tjuwar天津大学计算机科学与技术学院2011 年 4 月 28 日一、实验目的编程实现等值线生成的网格序列法和单元剖分法二、实验内容数据可采用随机方法生成,代表网格中每个点的值。根据网格序列法和单元剖分法对网格的点进行扫描,并由给出的值生成等值线。实现方法:1网格序列法:假设网格单元都是矩形,其等值线生成算法的主要步骤如下:1) 逐个计算每一个网格单元与等值线的交点;2) 连接该单元内等值线的交点,生成该单元内的等值线线段;3) 由一系列单元内的等值线线段构成该网格中的等值线;网格单元与等值线的交点计算主要计算各单元边与等值线的交点,可采用顶点判定,边上插值
2、的方法计算。设等值线的值为 Ft,若 Fij(Ft,则记顶点为- ;若 FijFt,则记顶点为+ 。若单元的四个顶点全为+或-,则网格单元内无等值线;否则对两个顶点分别为+ -的单元边插值计算等值线的交点,并在单元内连线,连线情况见图 2-2。图 1 单元内等值线连接情况在图 1(d)的情况下,实际上存在着两种连接方式的二义情况,不可能判断哪种连接情况是正确的。这里的二义性问题通用中点的值加以判断来解决。2.单元剖分法:为了避免网格序列法的二义性情况,可采用单元剖分法,算法的基本思想是利用对角线将矩形单元分成四个三角形单元,求出中心点的函数值,等值线的抽取直接在三角单元中进行。三角单元中至多只
3、包含一条等值线,从而避免了二义性问题,但处理单元数目增加了四倍。图 2 剖分法连接情况三、实验结果1.网格序列法图 3 网格宽 30,网格数 10图 4 网格宽 20,网格数 152.单元剖分法图 5 网格宽 30,网格数 10图 6 网格宽 20,网格数 15四、实验分析和总结网格序列法计算量小,有二义性,这里用中间点的值判断来解决,处理效果较粗糙。而单元剖分法运算点多,不存在二义性问题,但计算量大。在实现算法的过程中熟练了插值的方法。五、源代码注:运行说明:要切换序列法和单元剖分法只需在void display(void)/display_1(); /网格序列法display_2(); /
4、单元剖分法中切换。/*王安然 3008216120等值线生成网格序列法和单元剖分法2011 年 4 月 28 日*/#include #include#include “math.h“#include#include#include#include #include#include#include “math.h“using namespace std;#define max 100 /最大网格数float Amaxmax;int Flagmaxmax;const float B=5;int N=10;/实际网格数int grid=30;/网格宽度/初始化 OpenGLvoid init(vo
5、id) glClearColor(0.0f, 0.0f, 0.0f, 0.0f);/设置背景颜色glShadeModel(GL_FLAT);/设置明暗处理/主要的绘制过程/网格法void display_1(void)glClear(GL_COLOR_BUFFER_BIT);/清除颜色缓存glBegin(GL_LINES);/开始画直线glColor3f(1.0f, 1.0f, 1.0f);/设置颜色为白色int i,j;float x1,y1,x2,y2,x3,y3,x4,y4;float X0,X1,Y0,Y1;int startx=100;int starty=100;for(i=0;i=B)flag=1;else flag=0;