Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Tunneleffekt in Delphi (https://www.delphipraxis.net/78949-tunneleffekt-delphi.html)

WordsBG 13. Okt 2006 14:56


Tunneleffekt in Delphi
 
Irgendwie hatte ich mal lust in Delphi was Grafisches zu realisieren und hab mit nem "Tunneleffekt" angefangen, also das es aussieht als würde man durch einen Tunnel fliegen/fahren/laufen.
Das hier kam raus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Box: TPaintBox; { 600x400 !!}
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Y: Integer;
  buf: TBitmap;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  X: Integer;
begin
  Y := Y + 5;
  X := Y*3 DIV 2;
  with buf.Canvas do
  begin
    Pen.Color := clWhite;
    Rectangle(0,0,600,400);
    Pen.Color := clBlack;
    Rectangle(300-X,200-Y,300+X,200+Y);
    { Second Box }
    if (Y-100) > 0 then
    begin
      X := (Y-100)*3 DIV 2;
      Rectangle(300-X,200-(Y-100),300+X,200+(Y-100));
    end;
    { /Second Box }
    MoveTo(0,0);
    LineTo(600,400);
    MoveTo(600,0);
    LineTo(0,400);
  end;
  if Y > 200 then
    Y := 100;
  Box.Canvas.Draw(0,0,Buf);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Y := 100;
  buf := Tbitmap.Create;
  buf.Height := 400;
  buf.Width := 600;
end;

end.
Ich wollte nur fragen ob ich es a) noch optimieren kann, b) ob es andere gute Ansätze gäbe (DelphiX hab ich aber keine Lust zu, viel zu Platformspeziefisch), und c) ob jemand ne Idee hat ob es möglich ist Kurven oder sowas einzubauen das es mehr Achterbahnmäßig aussieht.

Cöster 13. Okt 2006 16:05

Re: Tunneleffekt in Delphi
 
Zitat:

Zitat von WordsBG
noch optimieren kann

Ja, kann man.
  • Statt global könntest du die Variablen als Eigenschaften im Private-Abschnitt deklarieren.
  • statt
    Zitat:

    Zitat von WordsBG
    Delphi-Quellcode:
    if (Y-100) > 0

    könnte man auch
    Delphi-Quellcode:
    if Y > 100
    schreiben.
  • Zitat:

    Zitat von WordsBG
    Delphi-Quellcode:
    Rectangle(300-X,200-(Y-100),300+X,200+(Y-100));

    auch hier wird unnötig gerechntet. Besser wäre
    Delphi-Quellcode:
    Rectangle(300-X, 300-Y, 300+X, 100+Y);

Das wären ein paar Optimierungen. Der Geschwindigkeitsvorteil ist nicht so deutlich spürbar, aber er ist vorhanden, wenn auch klein.


Du hast nicht beachtet, dass gleiche Entfernungen in der Ferne kleiner sind als, wenn man direkt davor steht: So dürften sich die kleinen Rechtecke nicht so schnell vergrößern wie die großen. Außerdem sollten die Abstände zwischen den Rechtecken größer sein, wenn sie sich direkt vorm eigenen Auge befinden.

alzaimar 13. Okt 2006 16:41

Re: Tunneleffekt in Delphi
 
@Cöster: Das sind unnötige 'Optimierungen' die der Compiler eh selbst vornimmt. Wichtiger ist lesbarer Code.

Soweit sieht es sinnvoll aus, wobei das Konstrukt 'a*b div c' generell (also nicht unbedingt in diesem Fall) in 'MulDiv(a,b,c)' angepasst werden sollte. Diese Funktion vermeidet einen 32-bit Überlauf im Zwischenergebnis 'a*b'. Schneller wird das aber nicht, nur sicherer. Wenn Du aber (so wie hier) genau weisst, das a*b stehts < 2^32, dann verwende die einfache Schreibweise.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz