返回列表 发帖

[技术讨论] [Perl][分形艺术]Julia集的绘制、缩放

计算公式和方法我是直接抄Matrix67 数学笔记里面的
神奇的分形艺术(四):Julia集和Mandelbrot集
本来昨天还可以访问,今天不知为何404了

因为这套公式是直接按理论的方法计算,没有优化,运行消耗不少,所以直接就改小了生成图像的尺寸。
按 4 6 8 2 左右上下移动, 按5放大 按0缩小

运行环境:ActivePerl, V5.16, for windows
依赖的库:OpenGL  没安装的可以再activeperl的环境下执行:ppm install OpenGL
use IO::Handle;
use OpenGL qw/ :all /;
use OpenGL::Config;
use Time::HiRes 'sleep';
use feature 'state';
STDOUT->autoflush(1);
my ($re, $im);
#my @c = ( 0.3, 0 ); #云
#my @c = ( 0.279, 0.0 );
my @c = ( 0.316, -0.033 );
my @z = ();
our $dtx = 200;
our $dty = 100;
our $moveDT = 30;
our $movex = 0;
our $movey = 0;
our $left;
our $right;
our $bottom;
our $top;
our $scale = 1;
our $depth = 100;
&Main();
sub display
{
    my ($i, $j, $k);
    $left   = -$dtx/2 + $movex;
    $right  = $dtx/2 + $movex;
    $bottom = -$dty/2 + $movey;
    $top    = $dty/2 + $movey;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);   
    for ($i = $left; $i < $right; $i += 1)
    {
        for ($j = $bottom; $j < $top; $j += 1)
        {
            ($re, $im) = (
                $i / ($dty *$scale),
                $j / ($dty *$scale),
            );
            
            for ($k=0; $k <= $depth; $k++)
            {
                $xre = $re * $re;
                $xim = $im * $im;
                if ( ($xre + $xim ) > 4 )
                {
                    last;
                }
                else
                {
                    ($re, $im) = (
                        $xre - $xim + $c[0],
                        $re * $im * 2  + $c[1],
                    );
                }
            }
            
            glColor3f( colors($k, 33.3) );
            glVertex3f( $i - $movex, $j - $movey, 0.0);
        }
    }
   
    glEnd();
    glutSwapBuffers();
}
sub colors
{
    my ($value, $limit) = (shift, shift);
    my ($R, $G, $B);
    if ($value > $limit) {
        $R = 0.0;
        $value -= $limit;
    } else {
        $R = $value / $limit;
    }
    if ($value > $limit ) {
        $G = 0.0;
        $value -= $limit;
    } else {
        $G = $value / $limit;
    }
    $B = $value % $limit /$limit;
    return ($R, $G, $B);
}
sub init
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glPointSize(1.0);
}
sub idle
{
    sleep 0.01;
    glutPostRedisplay();
}
sub Reshape
{
    my $half = 250.0;
    glViewport(0.0,0.0,500.0,500.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-$half, $half,-$half, $half,0.0,200.0);
    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);
    }
    if ($keychar eq '4') {
        $movex -= 50;
        glutPostRedisplay();
    } elsif ($keychar eq '6') {
        $movex += $moveDT;
        glutPostRedisplay();
    } elsif ($keychar eq '8') {
        $movey += $moveDT;
        glutPostRedisplay();
    } elsif ($keychar eq '2') {
        $movey -= $moveDT;
        glutPostRedisplay();
    } elsif ($keychar eq '5') {
        $scale *= 1.1;
        $movex *= 1.1;
        $movey *= 1.1;
        glutPostRedisplay();
        
    } elsif ($keychar eq '0') {
        $scale /= 1.1;
        $movex /= 1.1;
        $movey /= 1.1;
        glutPostRedisplay();
        
    }
}
sub Main
{
    glutInit();
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(1,1);
    our $WinID = glutCreateWindow("title");
    &init();
    glutDisplayFunc(\&display);
    glutReshapeFunc(\&Reshape);
    glutKeyboardFunc(\&hitkey);
    glutIdleFunc(\&idle);
    glutMainLoop();
}COPY
2

评分人数

[url=][/url]

本帖最后由 523066680 于 2015-8-3 22:43 编辑

原来Matrxi67数学笔记上面的 PASCAL 代码相当直观,复制过来供参考。
还要百度有快照,关于公式的说明:

神奇的分形艺术(四):Julia集和Mandelbrot集 百度快照


代码中的 i j 其实分别代表窗口上的 x 像素位置 和 y 像素位置
取值范围分别为 [-300,300] [-200, 200]
然后将 i/200, j/200 作为复数Z的实部 和 虚部进行代入计算 -> 其实单独写了个循环 k = 1 到 200 迭代试算(判断方面参考页面)
根据k的大小设置颜色深度,以i为x坐标, j为y坐标进行点绘

环境搭建:安装free pascal 编译器 win32版 (64位版本不含 graph 库)
编译Pascal程序:建议使用命令执行 fpc source.pp 进行编译。自带那个编辑器界面乱码……

http://sourceforge.net/projects/freepascal/files/
{$ASSERTIONS+}
uses graph;
type
   complex=record
      re:real;
      im:real;
   end;
operator * (a:complex; b:complex) c:complex;
begin
   c.re := a.re*b.re - a.im*b.im;
   c.im := a.im*b.re + a.re*b.im;
end;
operator + (a:complex; b:complex) c:complex;
begin
   c.re := a.re + b.re;
   c.im := a.im + b.im;
end;
var
   z,c:complex;
   gd,gm,i,j,k:integer;
begin
   gd:=D8bit;
   gm:=m640x480;
   InitGraph(gd,gm,'');
   Assert(graphResult=grOk);
   c.re:=-0.75;
   c.im:=0;
   for i:=-300 to 300 do
   for j:=-200 to 200 do
   begin
      z.re:=i/200;
      z.im:=j/200;
      for k:=0 to 200 do
      begin
         if sqrt(z.re*z.re + z.im*z.im) >2 then break
         else z:=(z*z)+c;
      end;
      PutPixel(i+300,j+200,k)
   end;
   readln;
   CloseGraph;
end.COPY
[url=][/url]

TOP

回复 2# 523066680
我发现matrix67笔记的女作者数学小宇宙异常强大,居然能导出那么美的图形。

TOP

吓尿了,我以为是julialang
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 4# codegay
julia,python直接就能计算复数,当然可以用更少代码实现。但是我只会用logo语言绘图,就是那种海龟。

TOP

回复 5# happy886rr


    都是用现成的库。难度应该也不会太大。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

本帖最后由 523066680 于 2016-5-30 18:20 编辑

回复 6# codegay


    要做动态效果需要高效率计算,最好上渲染语言(GLSL/HLSL)

(动图好像无效?
[url=][/url]

TOP

回复 3# happy886rr


    我记得他有头像是男的啊
[url=][/url]

TOP

回复 8# 523066680
他们是一对夫妇,共同爱好数学,生了两男孩,有些文章是那女的写的,虽然个别数学观点是错的,但是图画的不错。

TOP

回复 9# happy886rr


    。。。。。。。。可是找他找女朋友结婚生孩子只是最近几年的事情。。。至少是2011年后的事情。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 9# happy886rr


    哇塞原来有这么多内幕,学习了
[url=][/url]

TOP

本帖最后由 523066680 于 2016-10-27 21:15 编辑

C
2

评分人数

[url=][/url]

TOP

本帖最后由 Bella 于 2016-10-28 22:08 编辑

回复 12# 523066680


    这效果酷炫, 每天看终端就是这感觉, 眼睛受不了有残影

TOP

返回列表