|
楼主 |
发表于 2011-5-6 20:28
|
显示全部楼层
如何获取下面3个m文件生成的三维地形图的坐标(x,y,z)信息??
生成三维随机地形图的代码,用matlab实现:
CeatHill.m文件- function [data]=CeatHill(N,h,x0,y0,xi,yi,num)
- %创建小山丘模型,N座山,H为山的高度,X0,Y0为山的坐标。XI,YI为山丘的斜度,NUM为山丘模型数据的维数。
- %XI,YI的值越大,山丘就越平坦
- % Example:
- % tic;
- % h=[20,60,40];
- % x0=[20,40,50];
- % y0=[20,50,60];
- % xi=[];
- % yi=[];
- % d=CeatHill(3,h,x0,y0,xi,yi,65);
- % colormap(gray); %设置渲染的颜色
- % surf(d); %画出三维曲面
- % shading flat; %各小曲面之间不要网格
- % toc %测试运行时间
- x=1:1:num;y=1:1:num;
- %z2=zeros(1,4);
- for m=1:num
- for n=1:num
- Sum=0;
- for k=1:N
- s=h(k)*exp(-((x(m)-x0(k))/xi(k))^2-((y(n)-y0(k))/yi(k))^2);
- Sum=Sum+s;
- end
- data(m,n)=Sum;
- end
- end
复制代码 SquareDiamond.m文件- function [data]=SquareDiamond(N,initvalue,c)
- %输入N为:方阵的维数2^N+1,在方阵的四个角的顶点上放置的初值,
- %这里定为四个初值一样
- % Example:
- % tic;
- % d=SquareDiamond(8,5,0.5);
- % colormap(gray); %设置渲染的颜色
- % surf(d); %画出三维曲面
- % shading flat; %各小曲面之间不要网格
- % toc %测试运行时间
- n=2^N;
- data=zeros(n+1);
- data(1,1)=initvalue;
- data(1,n+1)=initvalue;
- data(n+1,1)=initvalue;
- data(n+1,n+1)=initvalue;
- data=mytry(data,n,c,n);
- function [x]=rnd(absvalue)
- %扩展的随机函数生成器,产生绝对值小于absvalue的随机实数
- x=(rand(1)-0.5)*2*absvalue;
- function [data]=mytry(data,m,r,n)
- %square=========================================
- %x-------x
- %---------
- %-- 0 -- 由四个x定中间的0
- %---------
- %x-------x
- for i=1:m:n
- for j=1:m:n
- data((i+i+m)/2,(j+j+m)/2)=(data(i,j)+data(i,j+m)+data(i+m,j)+data(i+m,j+m))/4+rnd(r);
- end
- end
- %diamond========================================
- %----x--
- %-----
- %x- 0 -x 由四个x定中间的0
- %--------
- %----x---
- %钻石步骤的横向部分
- %line No.1
- for j=1+m/2:m:n
- data(1,j)=(data(1,j+m/2)+data(1+m/2,j)+data(1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
- end
- %middle
- for i=1+m:m:n
- for j=1+m/2:m:n
- data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
- end
- end
- %line last
- for j=1+m/2:m:n
- data(n+1,j)=(data(n+1,j+m/2)+data(1+m/2,j)+data(n+1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
- end
- %钻石步骤的纵向部分
- %line No.1
- for i=1+m/2:m:n
- data(i,1)=(data(i,1+m/2)+data(i+m/2,1)+data(i,n+1-m/2)+data(i-m/2,1))/4+rnd(r);
- end
- %middle
- for i=1+m/2:m:n
- for j=1+m:m:n
- data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
- end
- end
- % line last
- for i=1+m/2:m:n
- data(i,n+1)=(data(i,1+m/2)+data(i+m/2,n+1)+data(i,n+1-m/2)+data(i-m/2,n+1))/4+rnd(r);
- end
- if (m>2)
- data=mytry(data,m/2,r/2,n); %递归
- end
复制代码 createmap.m文件- clc
- clear all
- close all
- %map1 随机地表。
- Z1=SquareDiamond(6,2,8);
- figure(1);
- surf(Z1); %画出三维曲面
- shading flat; %各小曲面之间不要网格
- %map2 山峰图
- h=[20,35,25];
- x0=[10,40,45];
- y0=[10,25,50];
- xi=[5.5,8,5];
- yi=[5,7,6];
- Z2=CeatHill(3,h,x0,y0,xi,yi,65);
- figure(2);
- surf(Z2); %画出三维曲面
- shading flat; %各小曲面之间不要网格
- %map3 合成图
- Z3=max(Z1,Z2);
- figure(3);
- surf(Z3); %画出三维曲面
- shading flat; %各小曲面之间不要网格
复制代码 |
|