返回列表 发帖

[原创教程] [Perl]Sierpinski镂垫绘制程序 示例

本帖最后由 523066680 于 2015-7-29 21:26 编辑



参考链接
Matrix67数学笔记 - 神奇的分形艺术(三):Sierpinski三角形
http://www.matrix67.com/blog/archives/280

wikipedia - Sierpinski triangle
http://en.wikipedia.org/wiki/Sierpinski_triangle
=info
    code: 523066680
    date: 2015-07
=cut
use IO::Handle;
use OpenGL qw/ :all /;
use OpenGL::Config;
use Time::HiRes 'sleep';
use feature 'state';
our %T = (
        'A' => [-50.0, -30.0],
        'B' => [50.0, -30.0],
        'C' => [0.0, 50.0]
    );
STDOUT->autoflush(1);
&Main();
sub func
{
    my ($lv, $ref) = (shift, shift);
    if ($lv > 5) { return; }
    my $mAB = mid($ref->{'A'}, $ref->{'B'});
    my $mAC = mid($ref->{'A'}, $ref->{'C'});
    my $mBC = mid($ref->{'B'}, $ref->{'C'});
    glBegin(GL_TRIANGLES);
        glColor4f( ($mAB->[0]+50.0)/100.0, ($mAB->[1] +50.0)/100.0, 0.6, 1.0);
        glVertex3f($mAB->[0], $mAB->[1], 0.0);
        glVertex3f($mAC->[0], $mAC->[1], 0.0);
        glVertex3f($mBC->[0], $mBC->[1], 0.0);
    glEnd();
    my %T1 = (
            'A' => $ref->{'A'},
            'B' => $mAB,  
            'C' => $mAC
        );
    func($lv+1, \%T1);
    my %T2 = (
            'A' => $ref->{'B'},
            'B' => $mAB,  
            'C' => $mBC
        );
    func($lv+1, \%T2);
   
    my %T3 = (
            'A' => $ref->{'C'},
            'B' => $mAC,  
            'C' => $mBC
        );
    func($lv+1, \%T3);
}
sub mid
{
    my ($refA, $refB) = (shift, shift);
    my $x = ($refA->[0] + $refB->[0]) / 2;
    my $y = ($refA->[1] + $refB->[1]) / 2;
    return [$x, $y];
}
sub display
{
    our %T;
    glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
        glColor4f(1.0, 1.0, 1.0, 0.2);
        glVertex3f($T{'A'}->[0], $T{'A'}->[1], 0.0);
        glVertex3f($T{'B'}->[0], $T{'B'}->[1], 0.0);
        glVertex3f($T{'C'}->[0], $T{'C'}->[1], 0.0);
    glEnd();
    &func(0, \%T);
    glutSwapBuffers();
}
sub init
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glPointSize(3.0);
    glEnable(GL_BLEND);
}
sub idle
{
    sleep 0.1;
    glutPostRedisplay();
}
sub Reshape
{
    glViewport(0.0,0.0,800.0,800.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100.0,100.0,-100.0,100.0,0.0,200.0);
    glScalef(1.8, 1.8, 1.8);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0, 0.0,1.0,100.0);
}
sub hitkey
{
    my $keychar = lc(chr(shift));
    if ($keychar eq 'q') {
        glutDestroyWindow($WinID);
    }
}
sub Main
{
    glutInit();
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE );
    glutInitWindowSize(800, 800);
    glutInitWindowPosition(1,1);
    our $WinID = glutCreateWindow("Sierpinski");
    &init();
    glutDisplayFunc(\&display);
    glutReshapeFunc(\&Reshape);
    glutKeyboardFunc(\&hitkey);
    glutIdleFunc(\&idle);
    glutMainLoop();
}COPY
[url=][/url]

这个是 Matrix67笔记中的 C 代码实现,相当精简
#include <stdio.h>
int main()
{
    const int n=(1<<5)-1;
    int i,j;
    for (i=0; i<=n; i++)
    {
        for (j=0; j<=n; j++)
           printf( (i&j)==j ? "#" : " ");
        printf("\n");
    }   
    getchar();
    return 0;
}COPY
#
##
# #
####
#   #
##  ##
# # # #
########
#       #
##      ##
# #     # #
####    ####
#   #   #   #
##  ##  ##  ##
# # # # # # # #
################
#               #
##              ##
# #             # #
####            ####
#   #           #   #
##  ##          ##  ##
# # # #         # # # #
########        ########
#       #       #       #
##      ##      ##      ##
# #     # #     # #     # #
####    ####    ####    ####
#   #   #   #   #   #   #   #
##  ##  ##  ##  ##  ##  ##  ##
# # # # # # # # # # # # # # # #
################################
[url=][/url]

TOP

颜色很靓。

来个数码雨效果吧。
JS操作DOM效率实在太低…
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 3# yu2n


    打算先花点时间学习分形,搞完弄弄别的。(看来要搞的东西很多
[url=][/url]

TOP

回复 3# yu2n


   

终于……
第一个demo,诸多不足,有待完善
1

评分人数

[url=][/url]

TOP

回复 5# 523066680
不错嘛!兄这个freetype玩的很溜啊。

TOP

回复 5# 523066680


    不错不错,不明觉厉。
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

第二阶段


从PHPBB论坛代码里取一段
[url=][/url]

TOP

别馋,放分享放代码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 9# codegay


    C代码,在那边发了

V2.5
[url=][/url]

TOP

回复 10# 523066680
gdi不好用,我也打算转战gl库

TOP

本帖最后由 523066680 于 2016-12-6 10:23 编辑

回复 11# happy886rr


    旧的GL库(v1.2-v2.1),画点画线画多边形还真是比大部分其他图形库好用。这也就是有人建议我用Unity3D,我一直没换的原因(而且体积上肯定不小,一样要学习成本)。

不过再往下深入,新知识很多,最好买书

刚好昨天和一个人聊到了书籍资源
http://www.code-by.org/viewtopic.php?f=43&t=218#p659
1

评分人数

[url=][/url]

TOP

回复 12# 523066680

很不错的学习心得。我知道该学什么了。gl异常的强大。我正准备学习3D图形方面的知识,这样就能操作图形的空间旋转。

TOP

返回列表