资源简介
大多数分形程序都是二维的,本人提供一个3DIFS分形树程序,以及分形山。
程序很简单,适合初学者.
程序很简单,适合初学者.
代码片段和文件信息
#include “stdafx.h“
#include “CFractalTerrian.h“
#include
GLfloat fogColor[4] = {.84f .87f 1.f 1.f};
extern int power_of_two(int n);
extern GLuint load_texture(const char* file_name);
GLuint CFractalTerrian::texture=0;
CFractalTerrian::CFractalTerrian(int sizeint num)
{
grid=NULL;
Size=size;
Num=num;
}
/*参数含义
fa:数组首地址,存储高度值
size:网格的大小
seedValue:随机算法所用种子值
heightScale:
h:扰动值
*/
//数组的真实大小为Size=Pow(2i)+1正方形个数为Pow(22i)i为迭代次数
//此处的size=Size-1;
void CFractalTerrian::fill2DFractArray (float *fa int size
int seedValue float heightScale float h)
{
int i j;
int stride;
int oddline;
int subSize;
float ratio scale;
//只处理维数为2的整数次方的数组
// if (!powerOf2(size) || (size==1)) { return; }
if(!power_of_two(size) || (size==1)) return;
/* subSize 以纵横向线段数计的数组维数
segments 以顶点数计的数组维数
*/
subSize = size;
size++;
/* initialize random number generator */
srand (seedValue);
/* 设定我们的粗糙度常量
随机数始终在0.0到1.0范围内生成。
随机数将乘上scale,每次迭代后scale将乘上ratio以有效的减少随机数范围。*/
ratio = (float) pow (2.-h);
scale = heightScale * ratio;
/* 设置前四个种子值。如一个4X4数组,我们将初始化下边*代表的点:
* . . . *
. . . . .
. . . . .
. . . . .
* . . . *
按diamond-square算法的术语,这将给我们正方形。
数组四角赋相同的值,这使我们排列数组时能无缝的拼接起来*/
stride = subSize / 2;
fa[(0*size)+0] =
fa[(subSize*size)+0] =
fa[(subSize*size)+subSize] =
fa[(0*size)+subSize] = 0.f;
/*现在依据棱锥种子值递增加入细节。
根据stride循环每次循环末尾都会将stride减半,
直到stride为0时结束 */
while (stride) {
/* 先用square数据生成diamond数据。
第一遍经过4X4矩阵时,已有数据为下边的X,
我们要生成*处的数据:
X . . . X
. . . . .
. . * . .
. . . . .
X . . . X
*/
for (i=stride; i for (j=stride; j fa[(i * size) + j] =
scale * randnum (-.5f.5f) +
avgSquareVals (i j stride size fa);
j += stride;
}
i += stride;
}
/* 先用diamond数据生成square数据。
第一遍经过这段代码时,已有数据为下边的X,
我们要生成*处的数据:
X . * . X
. . . . .
* . X . *
. . . . .
X . * . X
ij代表我们在数组中的(xy)位置。我们想生成的第一个值位于(i=2j=0),
用“oddline“及“stride“来增加j到所需值。
*/
oddline = 0;
for (i=0; i oddline = (oddline == 0);
for (j=0; j if ((oddline) && !j) j+=stride;
/* i and j are setup. Call avgDiamondVals with the
current position. It will return the average of the
surrounding diamond data points. */
fa[(i * size) + j] =
scale * randnum (-.5f.5f) +
avgDiamondVals (i j stride size subSize fa);
/* To wrap edges seamlessly copy edge values around
to other side of array */
if (i==0)
fa[(subSize*size) + j]
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 8215 2008-02-14 15:41 IFS分形树\CFractalTerrian.cpp
文件 1041 2008-02-14 15:34 IFS分形树\CFractalTerrian.h
文件 1089 2008-02-20 13:21 IFS分形树\CSky.cpp
.CA.... 174 2008-02-20 13:22 IFS分形树\CSky.h
文件 12271 2008-02-14 15:15 IFS分形树\CTree.cpp
文件 754 2008-02-20 13:22 IFS分形树\CTree.h
文件 49206 2003-02-13 23:49 IFS分形树\data\bark.BMP
文件 196664 2006-07-18 04:43 IFS分形树\data\leaf.bmp
文件 786486 2002-12-24 11:58 IFS分形树\data\sky.bmp
文件 3145782 2008-02-23 13:43 IFS分形树\data\terrian.bmp
..A.SH. 71168 2008-02-23 13:57 IFS分形树\data\Thumbs.db
文件 2584 2008-02-23 13:55 IFS分形树\MainFrm.cpp
文件 1583 2007-12-16 16:42 IFS分形树\MainFrm.h
文件 4385 2007-12-16 14:11 IFS分形树\ReadMe.txt
文件 766 2008-02-23 13:51 IFS分形树\res\icon1.ico
..A.SH. 8192 2008-02-23 13:57 IFS分形树\res\Thumbs.db
文件 1078 2007-12-16 14:11 IFS分形树\res\Toolbar.bmp
文件 1078 2007-12-16 14:11 IFS分形树\res\三维分形模拟.ico
.CA.... 404 2007-12-16 14:11 IFS分形树\res\三维分形模拟.rc2
文件 1078 2007-12-16 14:11 IFS分形树\res\三维分形模拟Doc.ico
文件 738 2008-02-23 13:52 IFS分形树\resource.h
.CA.... 214 2008-01-28 22:15 IFS分形树\StdAfx.cpp
文件 1118 2007-12-21 16:53 IFS分形树\StdAfx.h
文件 43532 2008-02-23 13:52 IFS分形树\三维分形模拟.aps
文件 2078 2008-02-23 14:46 IFS分形树\三维分形模拟.clw
文件 4186 2007-12-21 16:56 IFS分形树\三维分形模拟.cpp
文件 5209 2008-02-23 13:51 IFS分形树\三维分形模拟.dsp
.CA.... 549 2007-12-16 14:11 IFS分形树\三维分形模拟.dsw
文件 139342 2008-02-23 14:33 IFS分形树\三维分形模拟.exe
文件 1336 2007-12-16 14:11 IFS分形树\三维分形模拟.h
............此处省略14个文件信息
- 上一篇:Linux From Scratch 中文手册
- 下一篇:张力控制变频收卷程序
评论
共有 条评论