标题: [技术讨论] [Perl][分形艺术]Julia集的绘制、缩放 [打印本页]
作者: 523066680 时间: 2015-8-3 19:33 标题: [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();
- }
复制代码
作者: 523066680 时间: 2015-8-3 22:14
本帖最后由 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.
复制代码
作者: happy886rr 时间: 2016-4-24 20:37
回复 2# 523066680
我发现matrix67笔记的女作者数学小宇宙异常强大,居然能导出那么美的图形。
作者: codegay 时间: 2016-4-24 20:44
吓尿了,我以为是julialang
作者: happy886rr 时间: 2016-4-24 21:01
回复 4# codegay
julia,python直接就能计算复数,当然可以用更少代码实现。但是我只会用logo语言绘图,就是那种海龟。
作者: codegay 时间: 2016-4-24 21:10
回复 5# happy886rr
都是用现成的库。难度应该也不会太大。
作者: 523066680 时间: 2016-4-26 16:58
本帖最后由 523066680 于 2016-5-30 18:20 编辑
回复 6# codegay
要做动态效果需要高效率计算,最好上渲染语言(GLSL/HLSL)
(动图好像无效?
作者: 523066680 时间: 2016-4-26 17:04
回复 3# happy886rr
我记得他有头像是男的啊
作者: happy886rr 时间: 2016-4-27 12:36
回复 8# 523066680
他们是一对夫妇,共同爱好数学,生了两男孩,有些文章是那女的写的,虽然个别数学观点是错的,但是图画的不错。
作者: codegay 时间: 2016-4-27 13:30
回复 9# happy886rr
。。。。。。。。可是找他找女朋友结婚生孩子只是最近几年的事情。。。至少是2011年后的事情。
作者: 523066680 时间: 2016-4-27 15:20
回复 9# happy886rr
哇塞原来有这么多内幕,学习了
作者: 523066680 时间: 2016-10-27 21:14
本帖最后由 523066680 于 2016-10-27 21:15 编辑
C
作者: Bella 时间: 2016-10-27 21:38
本帖最后由 Bella 于 2016-10-28 22:08 编辑
回复 12# 523066680
这效果酷炫, 每天看终端就是这感觉, 眼睛受不了有残影
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |