- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)