Thread WxPerl: Pixel färben schnell gemacht (29 answers)
Opened by Mampfgnom at 2010-11-16 11:40

Mampfgnom
 2010-11-17 08:54
#142807 #142807
User since
2010-11-16
16 Artikel
BenutzerIn
[default_avatar]
Guten Morgen. Ich habe deine Methode mal probiert und der Bildschirm wird wirklich schneller bemalt. Danach habe ich das ganze mal auf mein Apfelmännchen angewandt. Weil es dort immer noch sehr lange dauert, wird das wahrscheinlich doch an den Iterationen liegen. Kannst du dein Apfelmännchenprogramm bitte mal starten und kurz stoppen wie lange er für 500 Iterationen braucht?

Jetzt habe ich noch ein anderes Problem. Immer wenn ich mein Skript starte, springt er gleich in die sub malen rein und wartet nicht auf das EVT_BUTOON. D.h. er zeichnet gleich das Apfelmännchen. Wenn ich danach auf den Button klicke erscheint der Fehler:

Not a CODE reference at apfel2.pl line 6.

Hier mein Quelltext:

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
#!/usr/bin/perl -w

use Wx qw[:allclasses];
use strict;

Apfel->new->MainLoop;

package Apfel;

use base qw(Wx::App);
use Wx::Event qw (EVT_BUTTON);

sub OnInit {
   my $frame = Wx::Frame->new( undef, -1, "Apfelmaennchen", [-1,-1], [1000,1000]);
   my $Button = Wx::Button->new($frame,-1,"Malen",[450,850],[100,50]);
   my $panel = Wx::Panel->new( $frame, -1, [0,0],[1000,800]);
   my $dc = $frame->{dc} = Wx::MemoryDC->new();
   $frame->{tafel} = Wx::StaticBitmap->new( $panel, -1, Wx::Bitmap->new( 0, 0, -1), [100,1]);
   $dc->Clear();
      EVT_BUTTON($frame,$Button, \&malen($frame));   
   
   $frame->Show(1);
}


sub malen {
   my $frame = shift;
   my $n = 50;   
   my @punkt;
   my $data;
   my ($width,$height) = (800,800);
   
   for my $i (1..$width){
      my $y = $i/200 - 2;
      for my $j (1..$height){
         my $x = $j/200 - 2;
         ${$punkt[$i]}[$j] = &iterieren($x,$y,$n);
         if (${$punkt[$i]}[$j] < 51) {
            $data .= pack('C3',0,5*${$punkt[$i]}[$j],5*${$punkt[$i]}[$j]);
         }
         else {$data .= pack('C3',0,255,255);}
      }
   }
   
   my $bmp=data_to_pixmap($data,$width,$height);
   $frame->{tafel}->SetBitmap( $bmp );
   $frame->{dc}->SelectObject( $bmp );
   $frame->{tafel}->Refresh();
}   
  
sub data_to_pixmap {
  my ($data,$width,$height)=@_;
  my $wximg=Wx::Image->new( $width, $height, $data );
  return Wx::Bitmap->new($wximg);
}

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;
}  


P.S.: Falls das jetzt schon wieder in meinen ursprünglichen Apfelmännchen Thread gehört, soll mich ein Moderator bitte darauf hinweisen oder den Beitrag gleich verschieben. Danke.

View full thread WxPerl: Pixel färben schnell gemacht