《科学计算可视化》实验报告.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《科学计算可视化》实验报告.doc

《科学计算可视化》实验报告 等值线生成 tjuwar 天津大学计算机科学与技术学院 2011年 4月 28日 一、实验目的 编程实现等值线生成的网格序列法和单元剖分法 二、实验内容 数据可采用随机方法生成,代表网格中每个点的值。根据网格序列法和单元剖分法对网格的点进行扫描,并由给出的值生成等值线。 实现方法: 1.网格序列法: 假设网格单元都是矩形,其等值线生成算法的主要步骤如下: 1) 逐个计算每一个网格单元与等值线的交点; 2) 连接该单元内等值线的交点,生成该单元内的等值线线段; 3) 由一系列单元内的等值线线段构成该网格中的等值线; 网格单元与等值线的交点计算主要计算各单元边与等值线的交点,可采用顶点判定,边上插值的方法计算。设等值线的值为Ft,若Fij(Ft,则记顶点为‘-’;若FijFt,则记顶点为‘+’。若单元的四个顶点全为‘+’或‘-’,则网格单元内无等值线;否则对两个顶点分别为’+’ ‘-‘的单元边插值计算等值线的交点,并在单元内连线,连线情况见图2-2。 图1 单元内等值线连接情况 在图1(d)的情况下,实际上存在着两种连接方式的二义情况,不可能判断哪种连接情况是正确的。这里的二义性问题通用中点的值加以判断来解决。 2.单元剖分法: 为了避免网格序列法的二义性情况,可采用单元剖分法,算法的基本思想是利用对角线将矩形单元分成四个三角形单元,求出中心点的函数值,等值线的抽取直接在三角单元中进行。三角单元中至多只包含一条等值线,从而避免了二义性问题,但处理单元数目增加了四倍。 图2 剖分法连接情况 三、实验结果 1.网格序列法 图3网格宽30,网格数10 图4网格宽20,网格数15 2.单元剖分法 图5网格宽30,网格数10 图6网格宽20,网格数15 四、实验分析和总结 网格序列法计算量小,有二义性,这里用中间点的值判断来解决,处理效果较粗糙。而单元剖分法运算点多,不存在二义性问题,但计算量大。 在实现算法的过程中熟练了插值的方法。 五、源代码 注:运行说明:要切换序列法和单元剖分法只需在 void display(void) { //display_1(); //网格序列法 display_2(); //单元剖分法 }中切换。 /* 王安然 3008216120 等值线生成 网格序列法和单元剖分法 2011年4月28日 */ #include GL/glut.h #includestdlib.h #include math.h #includeiostream #includequeue #includealgorithm #include time.h #includestring.h #includeCString #include math.h using namespace std; #define max 100 //最大网格数 float A[max][max]; int Flag[max][max]; const float B=5; int N=10;//实际网格数 int grid=30;//网格宽度 //初始化OpenGL void init(void) { 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;iN;i++) for(j=0;jN;j++) { X0=startx+i*grid; Y0=starty+j*grid; X1=startx+(i+1)*grid; Y1=starty+(j+1)*grid; if(j!=N-1) //画点上方的线 { glVertex2f(X0, Y0); glVertex2f(X0, Y1); } if(i!=N-1) //画点右方的线 { glVertex2f(

文档评论(0)

yanzhaoqiang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档