Thread BwInf Aufgabe Flitz mit Tk möglich?: graFische Modellierung eines Teichs (2 answers)
Opened by DS at 2003-09-06 01:21

Dubu
 2003-09-06 03:37
#43031 #43031
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Hier mal ein Code zum Testen (und vielleicht als Grundgeruest fuer dein Programm ;)).
Der macht auf meinem Rechner (Athlon XP 2000+, Linux 2.4.20) knapp 180 fps bei 100 Fischen gleichzeitig. Jetzt kommt's noch darauf an, wie kompliziert deine Berechnungen in jedem Schritt sind.

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
78
79
80
81
82
83
84
85
86
#!/usr/bin/perl
# fische.pl - kleines Testprogramm fuer Bewegungen im Tk::Canvas
#
# dubu -at- perl-community.de   06-Sep-2003

use strict;
use warnings;
use Tk;
use Time::HiRes;

my $FischZahl = 100;
my $CanvasWidth = 400;
my $CanvasHeight = 300;
my $FischRadius = 3;

# MainWindow und Canvas anlegen
my $Mw = MainWindow->new (-title => 'Fische');
my $Canvas = $Mw->Canvas (-width => $CanvasWidth,
    -height => $CanvasHeight,
)->pack;

# Fische anlegen
my @Fische;
for (1 .. $FischZahl) {
    # Startposition
    my $x = int (rand $CanvasWidth);
    my $y = int (rand $CanvasHeight);

    # Delta-Bewegungen (+1/0/-1 Pixel)
    my ($dx, $dy);
    do {
        $dx = int(rand 3) - 1;
        $dy = int(rand 3) - 1;
    } while $dx == 0 && $dy == 0; # nicht stillstehen!

    # Farbe des Fisches
    my $color = '#' . sprintf ("%06X", int rand 0x1000000);

    # Neuen Fisch im Canvas anlegen
    my $item = $Canvas->createOval (
        $x-$FischRadius, $y-$FischRadius,
        $x+$FischRadius, $y+$FischRadius,
        -fill => $color,
    );

    # Neuen Fisch merken
    push @Fische, {
        x => $x,
        y => $y,
        dx => $dx,
        dy => $dy,
        item => $item,
    };
}

# Zaehler und Zeit zuruecksetzen
my $cnt = 0;
my $time = Time::HiRes::time();

# Fische schwimmen lassen :-)
while (1) {
    for (@Fische) {
        $Canvas->move ($_->{item}, $_->{dx}, $_->{dy});

        # Position mitfuehren (schneller als aus Canvas)
        $_->{x} += $_->{dx};
        $_->{y} += $_->{dy};

        # Am Rand Bewegung umkehren
        $_->{dx} = -$_->{dx} if $_->{x} < 0 || $_->{x} > $CanvasWidth;
        $_->{dy} = -$_->{dy} if $_->{y} < 0 || $_->{y} > $CanvasHeight;
    }
    # Grafik-Update "manuell" durchfuehren
    $Mw->update;

    # Alle 500 Schritte Geschwindigkeit ausrechnen
    ++$cnt;
    if ($cnt == 500) {
        my $newtime = Time::HiRes::time();
        printf "%5d fps\n", $cnt/($newtime-$time);
        $time = $newtime;
        $cnt = 0;
    }
}

# ENDE

View full thread BwInf Aufgabe Flitz mit Tk möglich?: graFische Modellierung eines Teichs