Skip to content

Commit 588e044

Browse files
committed
Not ready - needs conversion to Gtk3
Original copied from http://www.perlmonks.org/?node_id=813179
1 parent 1ec9cc4 commit 588e044

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

julia-fractals.pl

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
#!/usr/bin/perl
2+
3+
use strict;
4+
use warnings;
5+
use Gtk2 -init;
6+
use Gtk2::Ex::Dialogs;
7+
use Gtk2::Gdk::Keysyms;
8+
use Glib ':constants';
9+
#use Goo::Canvas;
10+
11+
use Inline C => Config => CCFLAGS => '-O3 -msse3 -mfpmath=sse -march=core2 -ffast-math';
12+
use Inline C => 'DATA';
13+
14+
# setting up default sizes
15+
my $xbox = 360;
16+
my $ybox = 300;
17+
my $boxsize = 2;
18+
19+
my $centerx = 0;
20+
21+
my $centery = 0;
22+
23+
my $wsize = 4;
24+
25+
26+
27+
my $pmax = $centerx + $wsize / 2;
28+
29+
my $pmin = $centerx - $wsize / 2;
30+
31+
my $qmax = $centery + $wsize / 2 * $ybox/$xbox;
32+
33+
my $qmin = $centery - $wsize / 2 * $ybox/$xbox;
34+
35+
36+
37+
my $A = ($pmax-$pmin)/$xbox;
38+
my $C = ($qmax-$qmin)/$ybox;
39+
#print "$pmax, $pmin, $qmax, $qmin, $A, $C\n";
40+
41+
my $kmax=100;
42+
43+
# setting up palette
44+
my @palette = map {
45+
pack("WWW",
46+
int(sqrt($_/$kmax)*256),
47+
int(($_/$kmax)**3*256),
48+
int(sin(3.14159*$_/$kmax)*256)
49+
)
50+
} (0..$kmax);
51+
$palette[-1] = "\0\0\0";
52+
53+
# Create the main window
54+
my $win = new Gtk2::Window ( "toplevel" );
55+
$win->signal_connect ("delete_event", sub { Gtk2->main_quit; });
56+
#$win->signal_connect ("configure_event", \&win_expose);
57+
$win->set_title( "Julia set demo" );
58+
$win->set_border_width (6);
59+
#$win->maximize;
60+
$win->set_resizable (0);
61+
$win->resize(700, 500);
62+
63+
my $vbox = Gtk2::VBox->new (0, 6);
64+
$win->add ($vbox);
65+
66+
my $da = Gtk2::DrawingArea->new;
67+
$da->set_size_request($xbox*$boxsize, $ybox*$boxsize);
68+
$vbox->pack_start($da, 1, 1, 0);
69+
$da->signal_connect (motion_notify_event => \&on_background_motion_notify);
70+
$da->set_events ([ @{ $da->get_events },
71+
'leave-notify-mask',
72+
'pointer-motion-mask',
73+
'pointer-motion-hint-mask', ]);
74+
#my $gc1 = Gtk2::Gdk::GC->new ($win);
75+
76+
$win->show_all;
77+
78+
main Gtk2;
79+
80+
# replotting on mouse movement
81+
sub on_background_motion_notify {
82+
my ($da, $event) = @_;
83+
84+
my (undef, $ex, $ey, $state) = $event->window->get_pointer;
85+
86+
my $cy = $C*int(($ey)/$boxsize) + $qmin;
87+
my $cx = $A*int(($ex)/$boxsize) + $pmin;
88+
89+
#print $ex," ,",$ey," ,$cx ,$cy";
90+
my $data = '';
91+
my $row = '';
92+
foreach my $q (0..$ybox-1) {
93+
foreach my $p (0..$xbox-1) {
94+
my $k = julia_iter($p, $q, $A, $C, $pmin, $qmin, $kmax, $cx, $cy);
95+
$row .= $palette[$k] x $boxsize;
96+
}
97+
$data .= $row x $boxsize;
98+
$row = '';
99+
}
100+
101+
my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_data (
102+
$data, 'rgb', FALSE, 8,
103+
$xbox*$boxsize,
104+
$ybox*$boxsize,
105+
3*$xbox*$boxsize
106+
);
107+
108+
my $gc1 = Gtk2::Gdk::GC->new ($da->window);
109+
$da->window->draw_pixbuf($gc1, $pixbuf, 0, 0,
110+
0, 0, $xbox*$boxsize,
111+
$ybox*$boxsize,
112+
113+
'none', 0, 0,
114+
);
115+
return TRUE;
116+
}
117+
118+
__DATA__
119+
__C__
120+
int julia_iter (int p, int q, double A, double C, double pmin, double qmin, int kmax, double cx, double cy) {
121+
int k = 0;
122+
double x = A*p + pmin;
123+
double y = C*q + qmin;
124+
double x2 = x*x;
125+
double y2 = y*y;
126+
while (x2+y2<4 && k<kmax) {
127+
y=2*x*y+cy;
128+
x=x2-y2+cx;
129+
x2=x*x;
130+
y2=y*y;
131+
k++;
132+
}
133+
return k;
134+
}

0 commit comments

Comments
 (0)