OpenGL由已知控制点绘制模拟曲面地形

本人原创,欢迎转载,转载请注明出处http://www.cnblogs.com/zhouchanwen

主要要点:1.将离散的数据点网格化曲面

     2.对3d模型的鼠标控制,如虚拟球的实现

 

 

由已知控制点通过曲面拟合方法,将不规则的数据分布转换成规则的网格分布,然后绘制三维地形曲面图。即如图所示:

数据规则网格化(简称网格化)。网格化实际是一种曲面拟合方法。关于曲面拟合算法有很多,下面我们采用曲面样条方法实现网格化。我们定义曲面样条函数:

下面为c++/c代码:

3D_MAP.cpp

  1 #include <iostream>
2 #include "tools.h"
3 #include "Grids.h"
4 #include "3dmap.h"
5
6 using namespace std;
7
8 // 3D_MAP.cpp : 定义控制台应用程序的入口点。
9
10 int xFar=0.0f,yFar=0.0f,zFar=0.0f;
11 int wWidth=1300,wHeight=700;
12 int oldX,oldY;
13 bool gIsStartTrackBall = false;
14 bool gIsMoveMap=false;
15 TrackBall trackball;
16 _3dMap map;
17
18 void displayEvent()
19 {
20 glClearColor(0, 0, 0.1f, 1);
21 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
22
23 glMatrixMode(GL_MODELVIEW);
24 glLoadIdentity();
25 glTranslatef(xFar, yFar,zFar);
26
27 trackball.makeRolate();
28 map.drawMap();
29
30 glFlush();
31 glutSwapBuffers(); // 交换缓存
32 }
33
34 void mouseMoveEvent(int x, int y)
35 {
36 if(gIsStartTrackBall)
37 {
38 trackball.MouseMove(x,y);
39 glutPostRedisplay();
40 }
41 if(gIsMoveMap)
42 {
43 xFar-=oldX-x;
44 yFar+=oldY-y;
45 oldX=x;
46 oldY=y;
47 glutPostRedisplay();
48 }
49 }
50 // 鼠标事件函数
51 void mouseEvent(int button, int state, int x, int y)
52 {
53 if(button == GLUT_LEFT_BUTTON)
54 {
55 if(state == GLUT_DOWN)
56 {
57 oldX=x;
58 oldY=y;
59 trackball.setXY(x,y);
60 gIsStartTrackBall = true;
61 }
62 else if(state == GLUT_UP)
63 {
64 oldX=x;
65 oldY=y;
66 gIsStartTrackBall = false;
67 }
68 glutPostRedisplay();
69 }else if(button == GLUT_RIGHT_BUTTON)
70 {
71 if(state == GLUT_DOWN)
72 {
73 oldX=x;
74 oldY=y;
75 gIsMoveMap=true;
76 }else if(state == GLUT_UP)
77 {
78 oldX=x;
79 oldY=y;
80 gIsMoveMap = false;
81 }
82 }
83 }
84 // 窗体尺寸变化事件
85 void resizeEvent(int w, int h)
86 {
87 wWidth=w;
88 wHeight=h;
89 zFar=0.0f;
90 xFar=0.0f;
91 yFar=0.0f;
92 glViewport(0,0, w, h);
93 glMatrixMode(GL_PROJECTION);
94 glLoadIdentity();
95 h = h > 0 ? h : 1;
96 float aspect = (float)w / (float)h;
97 gluPerspective(45,aspect,1.0,1500.0);
98 glTranslatef(0,0,-300.0f);
99
100 trackball.resize();
101
102
103 glutPostRedisplay();
104 }
105 void processSpecialKeys(int key, int x, int y) {
106 if(key==101)
107 {
108 zFar+=4;
109 glutPostRedisplay();
110 }
111 if(key==103)
112 {//
113 zFar-=4;
114 glutPostRedisplay();
115 }
116 printf("key:%d\n",key);
117 }
118
119 void MenuFunc(int data)
120 {
121 switch(data)
122 {
123 case 1:
124 map.setLineOrFill();break;
125 default:break;
126 }
127 glutPostRedisplay();
128 }
129 void glInit()
130 {
131 glShadeModel(GL_FLAT);//SMOOTH//GL_FLAT
132 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
133 glClearDepth(1.0f);
134
135 glEnable(GL_NORMALIZE);
136
137 glEnable ( GL_DEPTH_TEST );
138 glAlphaFunc(GL_GREATER,0);
139 glDepthFunc(GL_LEQUAL);
140 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
141
142 glEnable( GL_BLEND);
143 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
144
145 glEnable(GL_POINT_SMOOTH);
146 glEnable(GL_LINE_SMOOTH);
147 glEnable (GL_POLYGON_SMOOTH);
148
149 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points
150 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Antialias the lines
151 glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST);
152
153
154 //glClearColor(1.0,1.0,1.0,1.0); //窗口背景设置为白色
155 glMatrixMode(GL_MODELVIEW); //设置投影参数
156
157 glEnable( GL_COLOR_MATERIAL) ;
158 glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
159
160 }
161
162 int main(int argc,char* argv[])
163 {
164 map.initMap();
165
166 glutInit(&argc,argv); //初始化GLUT
167 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH | GLUT_MULTISAMPLE); //设置显示模式
168 glutInitWindowPosition(0,0); //设置显示窗口的左上角位置
169 glutInitWindowSize(wWidth,wHeight); //设置窗口的长和高
170 glutCreateWindow("3DMap" ); //创造显示窗口
171
172 glInit(); //开始初始化过程
173 glutReshapeFunc(resizeEvent);
174 glutDisplayFunc(displayEvent);
175 glutMouseFunc(mouseEvent);
176 glutSpecialFunc(processSpecialKeys);
177 glutMotionFunc(mouseMoveEvent);
178 glutCreateMenu(MenuFunc);
179 glutAddMenuEntry("填充/网格",1);
180 glutAttachMenu(GLUT_MIDDLE_BUTTON);
181
182 glutMainLoop(); //显示所有并等候
183
184 getchar();
185 return 0;
186 }

tools.h

tools.h中定义了TrackBall类,用于对3D模型进行鼠标的旋转,世界中心点的移动等控制

  1 #include <cmath>
2 #include <gl/glut.h>
3
4 using namespace std;
5
6 struct GPoint3d{
7 double mX, mY, mZ;
8 double x() { return mX; }
9 double y() { return mY; }
10 double z() {return mZ; }
11 void setX(double x) { mX = x; }
12 void setY(double y) { mY = y; }
13 void setZ(double z) { mZ = z; }
14 void set(double x, double y, double z) { mX = x; mY = y; mZ = z;}
15 };
16
17 class TrackBall
18 {
19 int OldX;
20 int OldY;
21 double mMatrix[16];
22 public:
23 TrackBall(){}
24 // 向量的点积
25 double dotMult(GPoint3d v1, GPoint3d v2);
26 // 向量的叉积
27 GPoint3d crossMult(GPoint3d v1, GPoint3d v2);
28 // 将鼠标二维点映射为球面向量(用于鼠标追踪球)
29 GPoint3d gMousePtToSphereVec(int x, int y, int w, int h);
30 void makeRolate();
31
32 void MouseMove(int x, int y);
33 void resize()
34 {
35 glGetDoublev(GL_MODELVIEW_MATRIX, mMatrix); // 返回当前模型矩阵
36 }
37 void setXY(int x, int y){OldX = x;OldY = y;}
38 void setP(double *v)//{x1,y1,z1, x2,y2,z2, x3,y3,z3}
39 {
40 GPoint3d v1,v2,v3;
41 v1.setX(v[3]-v[0]);
42 v1.setY(v[4]-v[1]);
43 v1.setZ(v[5]-v[2]);
44
45 v2.setX(v[6]-v[0]);
46 v2.setY(v[7]-v[1]);
47 v2.setZ(v[8]-v[2]);
48
49 v3=crossMult(v1,v2);
50
51 glNormal3f(v3.x(),v3.y(),v3.z());
52 }
53 };
54
55 double TrackBall::dotMult(GPoint3d v1, GPoint3d v2)
56 {
57 double angle;
58 angle = v1.x()*v2.x()+v1.y()*v2.y()+v1.z()*v2.z();
59 return angle;
60 }
61 GPoint3d TrackBall::crossMult(GPoint3d v1, GPoint3d v2)
62 {
63 GPoint3d v;
64 v.setX(v1.y()*v2.z()-v1.z()*v2.y());
65 v.setY(v1.z()*v2.x()-v1.x()*v2.z());
66 v.setZ(v1.x()*v2.y()-v1.y()*v2.x());
67 return v;
68 }
69
70 // 将鼠标二维点映射为球面向量(用于鼠标追踪球)
71 GPoint3d TrackBall::gMousePtToSphereVec(int x, int y, int w, int h)
72 {
73 double x1,y1,z1,r,len;
74 GPoint3d vec;
75 x1 = (2.0*x - w) / w;
76 y1 = (h - 2.0*y) / h;
77 r=x1*x1+y1*y1;
78 if(r > 1) r = 1;
79 z1 = sqrt(1 - r);
80 len = sqrt(x1*x1+y1*y1+z1*z1);
81 vec.setX(x1/len);
82 vec.setY(y1/len);
83 vec.setZ(z1/len);
84 return vec;
85 }
86 void TrackBall::makeRolate()
87 {
88 glMultMatrixd(mMatrix);
89 }
90 void TrackBall::MouseMove(int x, int y)
91 {
92 if(x != OldX || y != OldY)
93 {
94 int wWidth,wHeight;
95 wWidth = glutGet(GLUT_WINDOW_WIDTH);
96 wHeight = glutGet(GLUT_WINDOW_HEIGHT);
97 GPoint3d lastVec = gMousePtToSphereVec(OldX, OldY, wWidth, wHeight);
98 GPoint3d currentVec = gMousePtToSphereVec(x, y, wWidth, wHeight);
99 OldX = x; OldY = y;
100 // 求旋转角度
101 double rotAngle = acos(dotMult(lastVec,currentVec))*57.29577958;
102 // 求旋转向量轴
103 GPoint3d axis = crossMult(lastVec,currentVec);
104 glMatrixMode(GL_MODELVIEW);
105 glPushMatrix();
106 glLoadIdentity();
107 glRotated(rotAngle, axis.x(), axis.y(), axis.z()); // 旋转
108
109 glMultMatrixd(mMatrix);
110 glGetDoublev(GL_MODELVIEW_MATRIX, mMatrix); // 返回当前模型矩阵
111
112 glPopMatrix();
113 }
114 }

接下来是3dmap.h,其中定义了_3dMap类,主要用来完成3d模型的主要绘制任务

  1 class _3dMap
2 {
3 double **data;
4 int M,N;
5 int dip;
6 double scale;
7 bool showBaseLine;
8 double max,min;
9 bool LineMode;
10 public :
11 _3dMap()
12 {
13 M=320;
14 N=220;
15 showBaseLine=true;
16 LineMode=false;
17 scale=20.0;
18 dip=1;
19 max=-1000;
20 min=10000;
21 }
22 ~_3dMap(){}
23 void initMap();
24 void drawBaseLine();
25 void drawMap();
26 void _3dMap::setLineOrFill()
27 {
28 LineMode=!LineMode;
29 }
30 double getAver(double * arr)
31 {
32 double num=0;
33 int n=3;//(int)(sizeof(arr)/sizeof(double))/3;
34 for(int i=0;i<n;i++)
35 num+=arr[3*i+2];
36 return num/n;
37 }
38
39 void setColor(double z1,double z2,double z3)
40 {
41 float r,g,b;
42 double temp=(max+min)/2;
43 double aver=(z1+z2+z3)/3;
44 /*printf("%lf ",aver);*/
45 if(aver>temp)
46 {
47 r=(aver-temp)/(temp-min);
48 b=0;
49 }else {
50 r=0;
51 b=(temp-aver)/(temp-min);
52 }
53 g=1-((abs(temp-aver))/(temp-min));
54 glColor3f(r,g,b);
55 }
56 };
57
58 void _3dMap::initMap()
59 {
60
61 int temp[]={
62 229,219,199,216,235,255,266,285,272,241,246,281,284,275,261,273,
63 221,214,195,216,234,258,273,289,281,249,259,278,287,272,275,277,
64 213,203,196,206,221,232,259,293,294,277,258,285,287,283,288,286,
65 204,195,200,201,209,218,231,259,288,306,286,291,301,311,319,298,
66 196,207,201,211,239,234,241,259,294,315,317,321,325,322,325,341,
67 208,218,204,214,235,260,239,268,298,291,331,313,281,280,280,280,
68 216,231,218,196,220,255,271,253,264,303,322,312,276,243,238,239,
69 236,242,218,198,200,215,224,238,261,294,324,312,280,255,220,200,
70 255,241,219,211,206,225,252,275,284,285,305,316,271,237,208,191,
71 245,218,207,198,214,241,261,256,273,276,291,298,281,238,197,175,
72 225,215,205,195,208,221,235,252,262,271,301,275,245,212,181,171
73 };
74 int len=11*16;
75 int i,j;
76 double** src=new double*[3];
77 for(i=0;i<3;i++)
78 src[i]=new double[len];
79 for(i=0;i<11;i++)
80 {//y
81 for(j=0;j<16;j++)
82 {//x
83 src[0][i*16+j]=j*10;
84 src[1][i*16+j]=i*10;
85 src[2][i*16+j]=temp[i*16+j];
86 }
87 }
88 Grids g1(3,len,src);
89 double** des=new double*[2];
90 for(i=0;i<2;i++)
91 des[i]=new double[N*M];
92 for(i=0;i<N;i++)
93 {//y
94 for(j=0;j<M;j++)
95 {//x
96 des[0][i*M+j]=j/2;
97 des[1][i*M+j]=i/2;
98 }
99 }
100 Grids g2(2,N*M,des);
101 data=g1.Surface_Fitting(&g1,&g2);
102
103 for(i=0;i<N;i++)
104 {//height
105 for(int j=0;j<M;j++)
106 {//width
107 data[0][i*M+j]*=2;
108 data[1][i*M+j]*=2;
109 data[2][i*M+j]/=5;
110
111 if(max<data[2][i*M+j])
112 max=data[2][i*M+j];
113 if(min>data[2][i*M+j])
114 min=data[2][i*M+j];
115 }
116 }
117 printf("max=%lf,min=%lf\n",max,min);
118 }
119 void _3dMap::drawBaseLine()
120 {
121 glBegin(GL_LINES);
122 glColor3f(1, 0, 0);
123 glVertex2i(0,0);//x line
124 glVertex2i(100,0);
125
126 glColor3f(0, 1, 0);
127 glVertex2i(0,0);//y line
128 glVertex2i(0,100);
129
130 glColor3f(0, 0, 1);
131 glVertex3f(0,0,0);//
132 glVertex3f(0,0,500);
133 glEnd();
134 }
135 void _3dMap::drawMap()
136 {
137
138 if(showBaseLine)
139 drawBaseLine();
140
141 if(LineMode)
142 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
143 else
144 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
145
146 glLineWidth(0.4f);
147 for(int i=0;i<N-1;i++)
148 {//height22
149
150 for(int j=0;j<M-1;j++)
151 {//width32
152 glBegin(GL_TRIANGLE_FAN);
153 int t=i*M+j;
154 setColor(data[2][t],data[2][t+1],data[2][t+1+M]);
155
156 glVertex3f(data[0][t],data[1][t],data[2][t]);
157 glVertex3f(data[0][t+1],data[1][t+1],data[2][t+1]);
158 glVertex3f(data[0][t+1+M],data[1][t+1+M],data[2][t+1+M]);
159 setColor(data[2][t+M],data[2][t+1],data[2][t+1+M]);
160 glVertex3f(data[0][t+M],data[1][t+M],data[2][t+M]);
161 glEnd();
162 }
163 }
164 }

 

 

下面是Grids.h文件,定义了Grids类,用于对控制点的数据进行网格化

  1 #include <iostream>
2
3 #include <cmath>
4
5 using namespace std;
6
7 class Grids
8 {
9 int row;
10 int col;
11 double **mat;
12 public:
13 Grids();
14 Grids(int r, int c);
15 Grids(int r, int c, double **m);
16 ~Grids();
17 void Mul_Mat(Grids* m1, Grids* m2, Grids* m3);
18 void Inv_Mat(Grids* m1, Grids* m2);
19 double** Surface_Fitting(Grids* m1, Grids* m2);
20 };
21
22 Grids::Grids()
23 {
24 row = 0;
25 col = 0;
26 mat = 0;
27 }
28
29 Grids::Grids(int r, int c)
30 {
31 row = r;
32 col = c;
33 mat = 0;
34 }
35
36 Grids::Grids(int r, int c, double **m)
37 {
38 row = r;
39 col = c;
40 mat = m;
41 }
42
43 Grids::~Grids()
44 {
45 mat=0;
46 row=0;
47 col=0;
48 }
49
50 void Grids::Mul_Mat(Grids* m1, Grids* m2, Grids* m3)
51 {
52 int i=0,j=0,p=0;
53 double sum=0;
54 if (m1->col != m2->row) {
55 cout<<"\n行、列数不匹配!";
56 exit(0);
57 }
58 m3->row=m1->row;
59 m3->col=m2->col;
60 m3->mat=new double*[m1->row];
61 if (NULL==m3->mat) {
62 cout<<"ERROR!\n";
63 exit(0);
64 }
65 for (i=0;i<m3->row;i++) {
66 m3->mat[i]=new double[m3->col];
67 for (j=0;j<m3->col;j++) {
68 for (m3->mat[i][j]=0,p=0;p<m1->col;p++) {
69 m3->mat[i][j]+=m1->mat[i][p]*m2->mat[p][j];
70 }
71 }
72 }
73 }
74
75 void Grids::Inv_Mat(Grids* m1, Grids* m2)
76 {
77 int i,j,n,*is,*js,k;
78 double d,p;
79 if(m1->row!=m1->col) {
80 cout<<"ERROR! 必须是方阵才能求逆!\n";
81 exit(1);
82 }
83 m2->mat=new double*[m1->row];//申请行指针数组
84 if(NULL==m2->mat){
85 cout<<"ERROR! 申请内存出错!\n";
86 exit(1);
87 }
88 for (i=0;i<m1->row;i++) {
89 m2->mat[i]=new double[m1->col];//申请行
90 for (j=0;j<m1->col;j++)
91 m2->mat[i][j]=m1->mat[i][j];
92 }
93 n=m1->row;
94 m2->row=m1->row;
95 m2->col=m1->col;
96 is=new int[n];
97 js=new int[n];
98 if (NULL==is || NULL==js){
99 cout<<"ERROR! 申请内存出错!\n";
100 exit(1);
101 }
102 for (k=0;k<=n-1;k++){ //全选主元
103 d=0.000;
104 for (i=k;i<=n-1;i++){
105 for (j=k;j<=n-1;j++){
106 p=fabs(m2->mat[i][j]);
107 if (p>d){
108 d=p;
109 is[k]=i;
110 js[k]=j;
111 }
112 }
113 }
114 if(1.0==d+1.0){
115 delete []is;
116 delete []js;
117 cout<<"ERROR ! 矩阵求逆出错!\n";
118 exit(1);
119 }
120 if(is[k]!=k){ /*行交换*/
121 for (j=0;j<=n-1;j++){
122 p=m2->mat[k][j];
123 m2->mat[k][j]=m2->mat[is[k]][j];
124 m2->mat[is[k]][j]=p;
125 }
126 }
127 if(js[k] != k) { /*列交换*/
128 for (i=0;i<=n-1;i++) {
129 p=m2->mat[i][k];
130 m2->mat[i][k]=m2->mat[i][js[k]];
131 m2->mat[i][js[k]]=p;
132 }
133 }
134 m2->mat[k][k]=1/m2->mat[k][k];
135 for (j=0;j<=n-1;j++){
136 if (j != k){
137 m2->mat[k][j]=m2->mat[k][j]*m2->mat[k][k];
138 }
139 }
140 for (i=0;i<=n-1;i++){
141 if(i!=k){
142 for (j=0;j<=n-1;j++){
143 if(j!=k){
144 m2->mat[i][j]=m2->mat[i][j]-m2->mat[i][k]*m2->mat[k][j];
145 }
146 }
147 }
148 }
149 for (i=0;i<=n-1;i++){
150 if (i!=k){
151 m2->mat[i][k]=-m2->mat[i][k]*m2->mat[k][k];
152 }
153 }
154 }
155 for (k=n-1;k>=0;k--){
156 if (js[k]!=k){
157 for (j=0;j<=n-1;j++){
158 p=m2->mat[k][j];
159 m2->mat[k][j]=m2->mat[js[k]][j];
160 m2->mat[js[k]][j]=p;
161 }
162 }
163 if (is[k] != k){
164 for (i=0;i<=n-1;i++){
165 p=m2->mat[i][k];
166 m2->mat[i][k]=m2->mat[i][is[k]];
167 m2->mat[i][is[k]]=p;
168 }
169 }
170 }
171 delete []is;
172 delete []js;
173 }
174
175 double** Grids::Surface_Fitting(Grids* m1, Grids* m2)
176 { // m1为已知数组R,m2为自变量数组
177 int i,j;
178 double ipso=0.05;
179 Grids *R=new Grids(m1->col+3,m1->col+3);
180 R->mat=new double*[R->row];
181 for(i=0;i<R->row;i++)
182 R->mat[i]=new double[R->col];
183 for(i=0;i<R->row;i++){
184 for(j=0;j<R->col;j++){
185 if(i<m1->col&&j<m1->col){
186 if(i==j)
187 R->mat[i][j]=ipso;
188 else
189 R->mat[i][j]=sqrt(pow(m1->mat[0][i] - m1->mat[0][j],2)+pow(m1->mat[1][i] - m1->mat[1][j],2));
190 }
191 if(i>=m1->col&&j<m1->col){
192 if(i==m1->col)
193 R->mat[i][j]=1;
194 else
195 R->mat[i][j]=m1->mat[i-m1->col-1][j];
196 }
197 if(i<m1->col&&j>=m1->col){
198 if(j==m1->col)
199 R->mat[i][j]=1;
200 else
201 R->mat[i][j]=m1->mat[j-(m1->col)-1][i];
202 }
203 if(i>=m1->col&&j>=m1->col){
204 R->mat[i][j]=0;
205 }
206 }
207 }
208
209 Grids *z1=new Grids(m1->col+3,1);
210 Grids *invm1=new Grids();
211 Grids *F=new Grids();
212 z1->mat=new double*[z1->row];
213 for(i=0;i<z1->row;i++){
214 z1->mat[i]=new double[z1->col];
215 for(j=0;j<z1->col;j++){
216 if(i<m1->col)
217 z1->mat[i][j]=m1->mat[2][i];
218 else
219 z1->mat[i][j]=0;
220 }
221 }
222 Inv_Mat(R, invm1);
223
224 Mul_Mat(invm1, z1, F);
225
226 Grids *z=new Grids();
227 Grids *r=new Grids(m2->col,F->row);
228 r->mat=new double*[r->row];
229 for(i=0;i<r->row;i++)
230 r->mat[i]=new double[r->col];
231 for(i=0;i<r->row;i++){
232 for(j=0;j<m1->col+3;j++){
233 if(j<m1->col){
234 double temp=sqrt(pow(m2->mat[0][i] - m1->mat[0][j],2)+pow(m2->mat[1][i] - m1->mat[1][j],2));
235 r->mat[i][j]=temp*log(temp+ipso);
236 }
237 else{
238 if(j==m1->col)
239 r->mat[i][j]=1;
240 else
241 r->mat[i][j]=m2->mat[j-m1->col-1][i];
242 }
243 }
244 }
245 /* FF->mat=new double*[FF->row];
246 for(i=0;i<FF->row;i++)
247 FF->mat[i]=new double[FF->col];
248 for(i=0;i<FF->row;i++){
249 for(j=0;j<FF->col;j++){
250 if(i<m2->col)
251 FF->mat[i][j]=F->mat[i/4][j/4];
252 else
253 FF->mat[i][j]=F->mat[i-m2->col+m1->col][j];
254 }
255 }*/
256 Mul_Mat(r, F, z);
257
258 Grids *xyz=new Grids(m2->row+1,m2->col);
259 xyz->mat=new double*[xyz->row];
260 for(i=0;i<xyz->row;i++)
261 xyz->mat[i]=new double[xyz->col];
262 for(i=0;i<xyz->row;i++){
263 for(j=0;j<xyz->col;j++){
264 if(i<m2->row)
265 xyz->mat[i][j]=m2->mat[i][j];
266 else
267 xyz->mat[i][j]=z->mat[j][0];
268 }
269 }
270 for(i=0;i<R->row;i++)
271 delete [] R->mat[i];
272 delete [] R->mat;
273 for(i=0;i<z1->row;i++)
274 delete [] z1->mat[i];
275 delete [] z1->mat;
276 for(i=0;i<invm1->row;i++)
277 delete [] invm1->mat[i];
278 delete [] invm1->mat;
279 for(i=0;i<F->row;i++)
280 delete [] F->mat[i];
281 delete [] F->mat;
282 for(i=0;i<z->row;i++)
283 delete [] z->mat[i];
284 delete [] z->mat;
285 for(i=0;i<r->row;i++)
286 delete [] r->mat[i];
287 delete [] r->mat;
288 return xyz->mat;
289 }


下面是最终效果:

 


操作:使用鼠标左键进行虚拟球控制模型,键盘上下键进行拉近拉远视图,鼠标右键移动视图中心点,点击鼠标滚轮弹出菜单,菜单中可以设置地图绘制方式,网格状和填充。

 

本人原创,欢迎转载,转载请注明出处http://www.cnblogs.com/zhouchanwen

posted @ 2012-03-13 16:35  狂热与执着  阅读(6102)  评论(1编辑  收藏  举报