[转]分形剧场 - 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);
            glNormal3f(0.0f0.0f-1.0f);
            glVertex3f(x2, y1, z1);    
            glVertex3f(x2, y2, z1);
            glVertex3f(x1, y2, z1);
            glVertex3f(x1, y1, z1);

            glNormal3f(0.0f0.0f1.0f);
            glVertex3f(x1, y1, z2);
            glVertex3f(x1, y2, z2);
            glVertex3f(x2, y2, z2);
            glVertex3f(x2, y1, z2);            

            glNormal3f(-1.0f0.0f0.0f);
            glVertex3f(x1, y1, z1);
            glVertex3f(x1, y2, z1);
            glVertex3f(x1, y2, z2);
            glVertex3f(x1, y1, z2);            

            glNormal3f(1.0f0.0f0.0f);
            glVertex3f(x2, y1, z2);    
            glVertex3f(x2, y2, z2);
            glVertex3f(x2, y2, z1);
            glVertex3f(x2, y1, z1);

            glNormal3f(0.0f-1.0f0.0f);
            glVertex3f(x1, y1, z2);    
            glVertex3f(x2, y1, z2);
            glVertex3f(x2, y1, z1);
            glVertex3f(x1, y1, z1);

            glNormal3f(0.0f1.0f0.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);

}
复制代码

结果如下:

 

posted @ 2012-04-25 20:34  Scan.  阅读(901)  评论(0)    收藏  举报