Thread Apfelmännchen (11 answers)
Opened by Mampfgnom at 2010-11-10 08:42

Gast Mampfgnom
 2010-11-10 08:42
#142606 #142606
Hallo.

Ich habe mal ein kleines Programm geschrieben, welches ein Apfelmännchen erzeugt. Ich habe Perl Tk verwendet und mich beim Schreiben gleich erst mal geärgert, dass man bei dem Canvas nicht wie bei anderen Sprachen die Pixel direkt ansprechen kann, und wenn dann nur über widgets. Dementsprechend lange dauert das Zeichnen. Meine erste Frage lautet also: kann mir bitte jemand einen Ansatz geben, wie man mit einem anderen Modul schneller Pixel färben kann? Hier gab es schon mal einen Thread dazu, in dem u.a. auf WxPerl verwiesen wurde. Ich habe mich mal in lichtkinds Tutorial eingelesen, weiß jetzt aber nicht welche Klassen (so heißt das bei Wx oder?) ich verwenden müsste. Also wenn mir jemand einen Tipp geben könnte, wie ich das Färben der Pixel beschleunigen könnte, wäre ich sehr dankbar.

Meine Zweite Frage bezieht sich auf eine Positionsgeschichte. Und zwar ist das Erstaunliche am Apfelmänchen, dass man beim Reinzoomen immer wieder neue Apfelmännchen am Rand eines Apfelmännchens findet. Nun würde ich zum Zoomen sehr gerne selber mit der Maus einen Rahmen ziehen. Was ich von euch bitte bräuchte, ist der Code für:

1. Maus drücken auf dem Canvas --> Position bestimmen
2. Bei gedrückter Maus einen rechteckigen Rahmen ziehen vom Ort des Drückens zur aktuellen Mausposition
3. Beim Loslassen der Maustaste die Position speichern

Das wäre es eigentlich schon. Wenn ich sage "ich brauche den Code" dann meine ich ein Code Beispiel, ihr sollt nicht für mich mein Programm schreiben müssen^^

So und anbei mal mein bisheriger Code. Bei meinem Rechner hier dauert das Zeichnen ca. 50s was aber wirklich nur an dem Pixel Färben liegt und nichts mit der Iteration zu tun hat.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/perl -w

use strict;
use Tk;

my $mw = MainWindow->new(-title=>"Apfelmaennchen");
my $width = $mw->screenwidth;
my $height = $mw->screenheight-200;
$mw->geometry($width.'x'.($height+200));

my $bt1 = $mw->Button(-text=>"Beenden", -command=>sub{exit})->pack(-side=>'bottom');
my $bt2 = $mw->Button(-text=>"Malen", -command=>\&malen)->pack(-side=>'bottom');
my $p = $mw->Photo(-width=>800, -height=>800);
my $c = $mw->Canvas(-width=>800, -height=>800, -bg=>'white')->pack(-side=>'top');
my $img = $c->createImage(0,0,-image=>$p,-anchor=>'nw');

$c->CanvasBind('<ButtonPress-1>'=>[\&koords,Ev('x'),Ev('y')]);


MainLoop;


##############################################
#               koords                       #
##############################################


sub koords{
   shift;
   print "@_\n";
}


##############################################
#               malen                        #
##############################################

sub malen{
my $n = 500;
my @punkt;
for my $i(1..800){
   my $x = $i/200-2;
   for my $j(1..800){
      my $y = $j/200-2;
      ${$punkt[$i]}[$j] = &iterieren($x,$y,$n);
      if (${$punkt[$i]}[$j] == 0){$p->put('black', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 1){$p->put('red', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 2){$p->put('green', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 3){$p->put('yellow', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 4){$p->put('cyan', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 5){$p->put('red', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 6){$p->put('magenta', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 7){$p->put('yellow', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] == 8){$p->put('red', -to => $i,$j);}
      elsif (${$punkt[$i]}[$j] >= 9){$p->put('blue', -to => $i,$j);}
   }
}
}

##############################################
#               iterieren                    #
##############################################

sub iterieren{
   my $x1 = $_[0]; my $xN = 0;
   my $y1 = $_[1]; my $yN = 0;
   my $count = 0;
   for my $i(1..$_[2]){
      my $xNplus = $xN**2 - $yN**2 + $x1;
      my $yNplus = 2 * $xN * $yN + $y1;
      my $a = sqrt($xNplus**2 + $yNplus**2);
      $xN = $xNplus;
      $yN = $yNplus;
      if ($a > 2){$count = $i;last;}
   }
   return $count;
}

Last edited: 2010-11-10 09:09:14 +0100 (CET)

View full thread Apfelmännchen