码迷,mamicode.com
首页 > 编程语言 > 详细

算法生成七芒星

时间:2014-11-04 14:54:54      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   os   使用   for   sp   

      玄幻小说中经常会有七芒星的技法,这一节就使用算法生成下七芒星的图像。在西方,7被认为是一个很有魔力的数字。上帝用7天造人,第7天休息;圣经启示录中有7封印、7灯台、7号角等等。但是魔法符号中却很少见到七芒星。不过在神秘学上,七芒星阵是存在的,他蕴含着非常强大的力量,无数的人都在寻觅并探索着他,但是七芒星的强大,使得很多人都未能解开它的神秘面纱,这让七芒星至今都成为了一种迷。
关于七芒星的资料:
      1 .七芒星很难被准确地画出,因为七芒星是“不平均却稳定的一体”。完美的七芒星是很漂亮的图案,而且可以被一笔画出。传说一笔画出过完美七芒星的人有的说看见了炽天使长米迦勒,有的说看见了魔君路西法,也有人说看见了天堂的生命树。
      2.七芒星分为“正七芒星”与“逆七芒星”。但是,你很难区分开“正七芒星”和“逆七芒星”,因为有多种不同的说法,一种也是按顶角位置来分正逆,但代表的意思与五芒星相反;另一种说法则是说七芒星的正逆判断与五芒星刚好相反;也有人认为七芒星与五芒星在正逆上并没有不同。
      3.关于“七芒星魔法阵”也是众说纷纭。一种被神秘学者认为七个顶点要写上七位大天使的名字,也有人说是写上七公爵之名;另一种说法是写上六种元素(风+火+水+土四元素的基础上,再加上光与暗)的名称,而空出的顶尖就依旧代表“人类的情感”。关于魔法阵外面有没有环也是有争议的。魔法阵外面应该是有环的,但是有种说法说:如果在七芒星魔法阵外面加上环就限制了它力量,甚至会破坏完整性,所以不能画上环。
      4.七芒星的寓意很深刻,而七芒星的强大无人可知。不过也正是因为这种神秘探寻的吸引力,也让很多人对他的图标迷恋不已,很多人选择他的图标作为图腾,佩戴左右或纹在身上。
      七芒星魔法阵的功效被记载得不多,只知道大概可以用来召唤。一个人是没有办法发动魔法阵的,但是如果魔法阵被发动,被召唤出来的东西就都是重量级的,比如大天使或大恶魔,甚至是未知的存在或力量。不要高兴,这些重量级的家伙可不会费神去聆听一个“低贱的生物”的愿望,甚至你连看都看不到他们第二眼,不是因为他们看不见,而是召唤者的结局会很惨。据说有以下几种结局:
一 、召唤者什么都忘记了。(所知最好结局)
二 、召唤者在强光下失明。(比较好的结局)
三 、召唤者精神失常。(至少还活着)
四 、召唤者被吓死。(有个全尸)
五 、召唤者被烤焦、开膛、撕碎、断头等等……
六 、有东西吞掉召唤者。
七 、召唤者活着掉入地狱。
八 、召唤者完全消失。(尸体和灵魂都没有了)
------------------------------------
看了这些召唤者结局,我有种作死的感觉。

    之前我发过一篇文章是"算法生成N芒星",其中也包括七芒星。与那篇不同的是,这里将使用混沌的办法生成七芒星,成的图像更为深邃且有分形的效果。

七芒星生成算法:

先生成正七角形的7个顶点,和一个当前点设置为原点;

a.随机选择三角形的某一个顶点,计算出它与当前点的中点位置;

b.将计算出的中点做为当前点,重新执行操作a

由此迭代处理上千万次后,即能生成七芒星图的像素数据。

代码如下:

int p[14];//七个顶点

for (int i = 0; i < 7; i++)
{
      p[i*2] = 512 + (int)(480*sin(i*2*PI/7));
      p[i*2+1] = 512 - (int)(480*cos(i*2*PI/7));
}

unsigned int m_pixels_map[1024][1024];// 像素数据

int count = 40000000;// 迭代次数

        for(int n=0;n<count;n++)
        {
            int v=rand()%7;
            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

bubuko.com,布布扣

      生成的图像看上去有点糊,但这幅图像的神奇之处在于:当你远离屏幕看它时,七芒星会清晰地显示出来。

      下面将对七芒星算法进行些变化,改变其随机数的生成和使用方式,如随机选择与当前顶点有一定关系的顶点做为下一步的运算。

(1)

        for(int n=0;n<count;n++)
        {
            // 不取相邻的两个点
            r = rand()%5;
            if (r == 0)
            {
                v = c;
            }
            else
            {
                v = (c + r + 1)%7;
                c = v;
            }

            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

bubuko.com,布布扣

(2)

        for(int n=0;n<count;n++)
        {
            // 不取相邻的四个点
            r = rand()%3;
            if (r == 0)
            {
                v = c;
            }
            else
            {
                v = (c + r + 2)%7;
                c = v;
            }

            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

bubuko.com,布布扣

(3)

        for(int n=0;n<count/2;n++)
        {
            // 不取相邻的两个点
            r = rand()%5;
            if (r == 0)
            {
                v = c;
            }
            else
            {
                v = (c + r + 1)%7;
                c = v;
            }

            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

        for(int n=0;n<count/2;n++)
        {
            // 不取相邻的四个点
            r = rand()%3;
            if (r == 0)
            {
                v = c;
            }
            else
            {
                v = (c + r + 2)%7;
                c = v;
            }

            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

bubuko.com,布布扣

(4)

        for(int n=0;n<count;n++)
        {
            // 不取当前点
            r = rand()%6;
            v = (c + r + 1)%7;
            c = v;

            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

bubuko.com,布布扣

(5)

        for(int n=0;n<count;n++)
        {
            // 不取当前点及相邻的两个点
            r = rand()%4;
            v = (c + r + 2)%7;
            c = v;

            x+=p[v*2];
            x/=2;
            y+=p[v*2+1];
            y/=2;
            ++m_pixels_map[x][y];
        }

bubuko.com,布布扣

 

相关文章:

算法生成N芒星

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]

 

算法生成七芒星

标签:style   blog   http   color   ar   os   使用   for   sp   

原文地址:http://www.cnblogs.com/WhyEngine/p/4073420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!