[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创教程] [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
  1. =info
  2.     code: 523066680
  3.     date: 2015-07
  4. =cut
  5. use IO::Handle;
  6. use OpenGL qw/ :all /;
  7. use OpenGL::Config;
  8. use Time::HiRes 'sleep';
  9. use feature 'state';
  10. our %T = (
  11.         'A' => [-50.0, -30.0],
  12.         'B' => [50.0, -30.0],
  13.         'C' => [0.0, 50.0]
  14.     );
  15. STDOUT->autoflush(1);
  16. &Main();
  17. sub func
  18. {
  19.     my ($lv, $ref) = (shift, shift);
  20.     if ($lv > 5) { return; }
  21.     my $mAB = mid($ref->{'A'}, $ref->{'B'});
  22.     my $mAC = mid($ref->{'A'}, $ref->{'C'});
  23.     my $mBC = mid($ref->{'B'}, $ref->{'C'});
  24.     glBegin(GL_TRIANGLES);
  25.         glColor4f( ($mAB->[0]+50.0)/100.0, ($mAB->[1] +50.0)/100.0, 0.6, 1.0);
  26.         glVertex3f($mAB->[0], $mAB->[1], 0.0);
  27.         glVertex3f($mAC->[0], $mAC->[1], 0.0);
  28.         glVertex3f($mBC->[0], $mBC->[1], 0.0);
  29.     glEnd();
  30.     my %T1 = (
  31.             'A' => $ref->{'A'},
  32.             'B' => $mAB,  
  33.             'C' => $mAC
  34.         );
  35.     func($lv+1, \%T1);
  36.     my %T2 = (
  37.             'A' => $ref->{'B'},
  38.             'B' => $mAB,  
  39.             'C' => $mBC
  40.         );
  41.     func($lv+1, \%T2);
  42.    
  43.     my %T3 = (
  44.             'A' => $ref->{'C'},
  45.             'B' => $mAC,  
  46.             'C' => $mBC
  47.         );
  48.     func($lv+1, \%T3);
  49. }
  50. sub mid
  51. {
  52.     my ($refA, $refB) = (shift, shift);
  53.     my $x = ($refA->[0] + $refB->[0]) / 2;
  54.     my $y = ($refA->[1] + $refB->[1]) / 2;
  55.     return [$x, $y];
  56. }
  57. sub display
  58. {
  59.     our %T;
  60.     glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
  61.     glClear(GL_COLOR_BUFFER_BIT);
  62.     glBegin(GL_TRIANGLES);
  63.         glColor4f(1.0, 1.0, 1.0, 0.2);
  64.         glVertex3f($T{'A'}->[0], $T{'A'}->[1], 0.0);
  65.         glVertex3f($T{'B'}->[0], $T{'B'}->[1], 0.0);
  66.         glVertex3f($T{'C'}->[0], $T{'C'}->[1], 0.0);
  67.     glEnd();
  68.     &func(0, \%T);
  69.     glutSwapBuffers();
  70. }
  71. sub init
  72. {
  73.     glClearColor(0.0, 0.0, 0.0, 1.0);
  74.     glPointSize(3.0);
  75.     glEnable(GL_BLEND);
  76. }
  77. sub idle
  78. {
  79.     sleep 0.1;
  80.     glutPostRedisplay();
  81. }
  82. sub Reshape
  83. {
  84.     glViewport(0.0,0.0,800.0,800.0);
  85.     glMatrixMode(GL_PROJECTION);
  86.     glLoadIdentity();
  87.     glOrtho(-100.0,100.0,-100.0,100.0,0.0,200.0);
  88.     glScalef(1.8, 1.8, 1.8);
  89.     glMatrixMode(GL_MODELVIEW);
  90.     glLoadIdentity();
  91.     gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0, 0.0,1.0,100.0);
  92. }
  93. sub hitkey
  94. {
  95.     my $keychar = lc(chr(shift));
  96.     if ($keychar eq 'q') {
  97.         glutDestroyWindow($WinID);
  98.     }
  99. }
  100. sub Main
  101. {
  102.     glutInit();
  103.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE );
  104.     glutInitWindowSize(800, 800);
  105.     glutInitWindowPosition(1,1);
  106.     our $WinID = glutCreateWindow("Sierpinski");
  107.     &init();
  108.     glutDisplayFunc(\&display);
  109.     glutReshapeFunc(\&Reshape);
  110.     glutKeyboardFunc(\&hitkey);
  111.     glutIdleFunc(\&idle);
  112.     glutMainLoop();
  113. }
复制代码

这个是 Matrix67笔记中的 C 代码实现,相当精简
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     const int n=(1<<5)-1;
  5.     int i,j;
  6.     for (i=0; i<=n; i++)
  7.     {
  8.         for (j=0; j<=n; j++)
  9.            printf( (i&j)==j ? "#" : " ");
  10.         printf("\n");
  11.     }   
  12.     getchar();
  13.     return 0;
  14. }
复制代码
#
##
# #
####
#   #
##  ##
# # # #
########
#       #
##      ##
# #     # #
####    ####
#   #   #   #
##  ##  ##  ##
# # # # # # # #
################
#               #
##              ##
# #             # #
####            ####
#   #           #   #
##  ##          ##  ##
# # # #         # # # #
########        ########
#       #       #       #
##      ##      ##      ##
# #     # #     # #     # #
####    ####    ####    ####
#   #   #   #   #   #   #   #
##  ##  ##  ##  ##  ##  ##  ##
# # # # # # # # # # # # # # # #
################################

TOP

颜色很靓。

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

TOP

回复 3# yu2n


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

TOP

回复 3# yu2n


   

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

评分人数

TOP

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

TOP

回复 5# 523066680


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

TOP

第二阶段


从PHPBB论坛代码里取一段

TOP

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

TOP

回复 9# codegay


    C代码,在那边发了

V2.5

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

评分人数

TOP

回复 12# 523066680

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

TOP

返回列表