[转]分形剧场 - Menger sponge
原文: http://www.cnblogs.com/atlantis13579/archive/2009/12/28/1633502.html
波兰数學家谢尔平斯基(Vaclav Sierpinski:1882~1969)在1916年提出fractal概念,不過早在12世紀,意大利教堂裡的讲坛就已經用類似的圖案做裝飾。
Menger sponge是一种特殊的立方体结构。Menger海绵说明在立方体里面同时能分出许多的立方体﹐这些是采数列的方式来增加的﹐因此在体积小的立方体上,却可以拥有很大的表面积。
Menger sponge的定义如下:
1. 先拿一个正方体。
2. 将正方体的面均分成9个正方形,正方体于是均分成27个小的正方体。
3. 从每个面取走中间的小正方体,正方体中心的小正方体亦要取走。这样便得出一个Level 1的Menger sponge。
4. 对每个剩下的小正方体都重复1-3。
以上步骤重复一次得出Level 2的Menger sponge,再来一次得出Level 3的Menger sponge,无限重复便得出真正的Menger sponge。
画这个图的递归算法如下, 很简单, (注意是没优化的, 有不少面重复了)
Menger sponge
void render_menger_sponge(GLfloat x1, GLfloat x2, GLfloat y1, GLfloat y2, GLfloat z1, GLfloat z2, int depth = 0)
{
if( MAX_DEPTH == depth )
{
glBegin(GL_QUADS);
{
if( MAX_DEPTH == depth )
{
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f, -1.0f);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y2, z1);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y1, z1);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(x1, y1, z2);
glVertex3f(x1, y2, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y1, z2);
glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y1, z2);
glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y1, z1);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(x1, y1, z2);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y1, z1);
glVertex3f(x1, y1, z1);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(x1, y2, z1);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x1, y2, z2);
glEnd();
return;
}
GLfloat dx = (x2-x1)/3.0f, dy = (y2-y1)/3.0f, dz = (z2-z1)/3.0f;
render_menger_sponge(x1, x1+dx, y1, y1+dy, z1, z1+dz, depth+1);
render_menger_sponge(x1, x1+dx, y1, y1+dy, z1+dz, z2-dz, depth+1);
render_menger_sponge(x1, x1+dx, y1, y1+dy, z2-dz, z2, depth+1);
render_menger_sponge(x1, x1+dx, y1+dy, y2-dy, z1, z1+dz, depth+1);
render_menger_sponge(x1, x1+dx, y1+dy, y2-dy, z2-dz, z2, depth+1);
render_menger_sponge(x1, x1+dx, y2-dy, y2, z1, z1+dz, depth+1);
render_menger_sponge(x1, x1+dx, y2-dy, y2, z1+dz, z2-dz, depth+1);
render_menger_sponge(x1, x1+dx, y2-dy, y2, z2-dz, z2, depth+1);
render_menger_sponge(x1+dx, x2-dx, y1, y1+dy, z1, z1+dz, depth+1);
render_menger_sponge(x1+dx, x2-dx, y1, y1+dy, z2-dz, z2, depth+1);
render_menger_sponge(x1+dx, x2-dx, y2-dy, y2, z1, z1+dz, depth+1);
render_menger_sponge(x1+dx, x2-dx, y2-dy, y2, z2-dz, z2, depth+1);
render_menger_sponge(x2-dx, x2, y1, y1+dy, z1, z1+dz, depth+1);
render_menger_sponge(x2-dx, x2, y1, y1+dy, z1+dz, z2-dz, depth+1);
render_menger_sponge(x2-dx, x2, y1, y1+dy, z2-dz, z2, depth+1);
render_menger_sponge(x2-dx, x2, y1+dy, y2-dy, z1, z1+dz, depth+1);
render_menger_sponge(x2-dx, x2, y1+dy, y2-dy, z2-dz, z2, depth+1);
render_menger_sponge(x2-dx, x2, y2-dy, y2, z1, z1+dz, depth+1);
render_menger_sponge(x2-dx, x2, y2-dy, y2, z1+dz, z2-dz, depth+1);
render_menger_sponge(x2-dx, x2, y2-dy, y2, z2-dz, z2, depth+1);
}
glVertex3f(x2, y2, z1);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y1, z1);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(x1, y1, z2);
glVertex3f(x1, y2, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y1, z2);
glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y1, z2);
glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y1, z1);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(x1, y1, z2);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y1, z1);
glVertex3f(x1, y1, z1);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(x1, y2, z1);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x1, y2, z2);
glEnd();
return;
}
GLfloat dx = (x2-x1)/3.0f, dy = (y2-y1)/3.0f, dz = (z2-z1)/3.0f;
render_menger_sponge(x1, x1+dx, y1, y1+dy, z1, z1+dz, depth+1);
render_menger_sponge(x1, x1+dx, y1, y1+dy, z1+dz, z2-dz, depth+1);
render_menger_sponge(x1, x1+dx, y1, y1+dy, z2-dz, z2, depth+1);
render_menger_sponge(x1, x1+dx, y1+dy, y2-dy, z1, z1+dz, depth+1);
render_menger_sponge(x1, x1+dx, y1+dy, y2-dy, z2-dz, z2, depth+1);
render_menger_sponge(x1, x1+dx, y2-dy, y2, z1, z1+dz, depth+1);
render_menger_sponge(x1, x1+dx, y2-dy, y2, z1+dz, z2-dz, depth+1);
render_menger_sponge(x1, x1+dx, y2-dy, y2, z2-dz, z2, depth+1);
render_menger_sponge(x1+dx, x2-dx, y1, y1+dy, z1, z1+dz, depth+1);
render_menger_sponge(x1+dx, x2-dx, y1, y1+dy, z2-dz, z2, depth+1);
render_menger_sponge(x1+dx, x2-dx, y2-dy, y2, z1, z1+dz, depth+1);
render_menger_sponge(x1+dx, x2-dx, y2-dy, y2, z2-dz, z2, depth+1);
render_menger_sponge(x2-dx, x2, y1, y1+dy, z1, z1+dz, depth+1);
render_menger_sponge(x2-dx, x2, y1, y1+dy, z1+dz, z2-dz, depth+1);
render_menger_sponge(x2-dx, x2, y1, y1+dy, z2-dz, z2, depth+1);
render_menger_sponge(x2-dx, x2, y1+dy, y2-dy, z1, z1+dz, depth+1);
render_menger_sponge(x2-dx, x2, y1+dy, y2-dy, z2-dz, z2, depth+1);
render_menger_sponge(x2-dx, x2, y2-dy, y2, z1, z1+dz, depth+1);
render_menger_sponge(x2-dx, x2, y2-dy, y2, z1+dz, z2-dz, depth+1);
render_menger_sponge(x2-dx, x2, y2-dy, y2, z2-dz, z2, depth+1);
}
结果如下:




浙公网安备 33010602011771号