Radrasimulation in Delphi

Tutorials.at
Verfügbare Informationen zu "Radrasimulation in Delphi"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Moritz - Xin
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: Pascal
  • Antworten: 13
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Radrasimulation in Delphi
  • Letzte Antwort: vor 16 Jahren, 2 Monaten, 16 Tagen, 22 Stunden, 35 Minuten
  • Alle Beiträge und Antworten zu "Radrasimulation in Delphi"

    Re: Radrasimulation in Delphi

    Moritz - 23.01.2008, 22:26

    Radrasimulation in Delphi
    Ich habe mal versucht, in delphi eine Radarsimulation zu schreiben. Kann mir jemand ein Par ideen geben, wie man das anfangen soll??
    Das habe ich schon (Deldhi-quellcode):
    Code:
    unit Unit13;

    interface

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

    type
      TForm13 = class(TForm)
        Time: TTimer;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure TimeTimer(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
      w, h, d, dt: integer;
        { Private-Deklarationen }
      public
      rek: integer;
        { Public-Deklarationen }
      end;

    var
      Form13: TForm13;

    implementation

    {$R *.dfm}
    procedure getxy (winkel: real; var x, y: real; w, h: integer);
    var x1, y1: real;
    begin
     x1 := cos (winkel);
     y1 := sin (winkel);
     x1 := x1* (w div 3);
     y1 := y1* (h div 3);
     x1 := x1 + (w div 2);
     y1 := y1 + (h div 2);
     x := x1;
     y := y1;
    end;
    procedure spur (var d, w, h: integer; color: tcolor; var tox, toy: real; var rek: integer);
    var x, y: real;
    begin
    inc (rek);
    d := d-5;
    getxy (d/100, x, y, w, h);
    color := rgb (0, 265-rek, 0);
    tox := x;
    toy := y;
    end;

    procedure TForm13.FormCreate(Sender: TObject);
    begin
    w := width;
    h := height;
    d:=0;
    end;

    procedure TForm13.Timer1Timer(Sender: TObject);
    begin
    refresh;
    end;

    procedure TForm13.TimeTimer(Sender: TObject);
    var i, j: integer;
      k: Integer;
    var x, y: real;
    var cl: tcolor;
    begin
    rek := 0;
    {============================================================}
    for i := 0 to 36000 do
      begin
      w := width;
      h := height;
      getxy (i/100, x, y, w, h);
      canvas.pixels[trunc(x), trunc(y)] := clgreen;
      end;
    {============================================================}
      inc(d);
      canvas.Pen.Color := clgreen;
      getxy(d/100, x, y, w, h);
      Canvas.Moveto(Width div 2,Height div 2);
      Canvas.LineTo(trunc(x),trunc(y));
      if d=28000 then d:= -8000;
      dt := d;
      for j := 0 to 100 - 1 do
      begin
     
      spur (dt, w, h, cl, x, y, rek);
      canvas.pen.Color := cl;
      canvas.MoveTo(width div 2, height div 2);
      canvas.lineto (trunc(x), trunc(y));
      for k := 0 to 250 - 1 do application.ProcessMessages;


      end;
    end;

    end.


    Die Bild hochladen-function get nicht!!



    Re: Radrasimulation in Delphi

    Moritz - 23.01.2008, 22:32


    Hier ein Bild vom momentanem status: (es dreht sich natürlich)



    Jetzt möchte ich noch, dass es mehr nach richtigem Radar aussieht!!



    Re: Radrasimulation in Delphi

    Xin - 24.01.2008, 00:08

    Re: Radrasimulation in Delphi
    Moritz hat folgendes geschrieben: Ich habe mal versucht, in delphi eine Radarsimulation zu schreiben. Kann mir jemand ein Par ideen geben, wie man das anfangen soll??
    In jedem Fall nicht mit LineTo.

    Nehmen wir an, Du möchtest den Strahl verschieben, das bedeutet, dass Du außen große Schritte machst und innen kleine. Die kleinen wirst Du vermutlich schonmal nicht abbilden können, weil die Pixel viel zu groß sind.

    Also was passiert? Malst Du erst die neue Linie und löschst dann die alte, dann wird das Mittelfeld immer leer sein, weil durch das Löschen auch Teile der neuen Linie entfernt werden. Sieht also bescheiden aus.

    Du könntest natürlich erst die alte Linie entfernen, um dann die neue Linie zu zeichnen. Damit ist das Mittelfeld grundsätzlich gesehen gefüllt - aber halt nicht immer. Es flackert. Macht die Sache also nicht unbedingt besser.

    Fazit: LineTo ist nicht das Mittel der Wahl.

    Folgender Ansatz: Du nimmst Dir zwei Arrays mit Punkten. Darin berechnest Du jeden einzelnen Punkt der Linie. Anschließend zeichnest Du die Linie. Die nächste Linie im 2. Array berechnen und zeichnen, anschließend aus dem ersten Array die Punkte rauswerfen, die im zweiten Array vorkommen und das zweite Array zeichnen. Das kannst Du beschleunigen, wenn Du ausrechnest, ab welchem Radius die Linien mindestens 1 Pixel auseinander liegen müssen, weil darüber überschneiden sich die Linien zwangsläufig nicht mehr.
    Dann löschst Du alle Punkte auf der Grafik, die aus dem ersten Array übrig bleiben.

    Wenn Du nun im nächsten Level ankommst, könntest Du nun mit einem Algorithmus, der Bögen zeichnet(und wieder ist Bresenham Dein Stichwort), einen Farbverlauf zwischen der alten Linie und der neuen Linie zeichnen, so als würde der Lichtstrahl verblassen. In Abhängigkeit zum Radius könntest Du den Lichtstrahl heller machen, da die Winkelgeschwindigkeit hier geringer ist, der Radarschirm in der Mitte also länger beleuchtet wird als außen. Entsprechend verlängert sich der Lichtbogen, der dem Strahl folgt.



    Re: Radrasimulation in Delphi

    Moritz - 24.01.2008, 18:52


    so richtig verstanden habe ich das jetzt nicht..
    kannst du mal ein beispiel in pascal oder pseudocode geben??



    Re: Radrasimulation in Delphi

    Xin - 24.01.2008, 23:51


    Moritz hat folgendes geschrieben: so richtig verstanden habe ich das jetzt nicht..
    kannst du mal ein beispiel in pascal oder pseudocode geben??

    *lach*, definitiv nein. Das Problem, dass Du lösen möchtest ist nicht schwer, aber auch nicht so trivial, dass ich das mal eben so fertig als funktionierenden (Pseudo-)Code runtertexten könnte. Wäre es so trivial, könntest Du ja auch triviale Befehle wie lineTo verbraten.
    Und ich selbst habe auch keine Lust, es zu entwickeln - schließlich willst Du es ja schreiben.

    Konntest Du nachvollziehen, warum der LineTo Delphi-Befehl für Dich nicht in Frage kommt?

    Wenn nicht, stell Fragen. Meine Kristallkugel ist grade zum Polieren.

    Wenn Dir klar ist, warum lineTo nicht geht, fang doch erstmal an, eine Linie zu zeichnen.
    Auf meiner Website liegt noch meine Implementierung des Bresenhams - Du bist nicht der erste, der Linien selbst malen muss ^^.
    Aber halt in C++: http://sascha.atrops.com/bresenham.h
    Was Punkte sind, sollte klar sein; eine Distance ist der Abstand zwischen zwei Punkten.
    delta.Direction kürzt die Dimensionen auf -1, 0 oder +1, egal welche Länge die Richtungen vorher hatten.
    delta.Absolute lässt das Vorzeichen verschwinden, verändert aber die Längen nicht.

    Meinen Algorithmus kannst Du als Vergleich nehmen, ich vermute in Wikipedia o.ä. finden sich einfachere Implementierungen.

    Dann zeichne einfach mal eine Linie selbst und dann gucken wir weiter.



    Re: Radrasimulation in Delphi

    Moritz - 27.01.2008, 21:21


    der c++-code ist total konfus (dem hätte die Benutzung dieser großen, sechseckigen Taste in der rechten Hälfte der Tastatur gutgetan)...oder mein editor kanns nicht



    Re: Radrasimulation in Delphi

    Xin - 27.01.2008, 21:38


    Moritz hat folgendes geschrieben: der c++-code ist total konfus (dem hätte die Benutzung dieser großen, sechseckigen Taste in der rechten Hälfte der Tastatur gutgetan)...oder mein editor kanns nicht
    Return? Und dann?

    Keine Ahnung, ich denke der Code ist ganz akzeptabel, ich kenne Implementationen des Bresenhams, die schwieriger zu lesen sind.

    Nach dem Gemecker an meinem Sourcecode... was macht denn Deiner?



    Re: Radrasimulation in Delphi

    Moritz - 27.01.2008, 22:27


    jedesmal, wenn ich ihn ausprobiere, fängt der debugger an zu laufen und der Pc schmiert ab. kann man den debugger irgendwie abstellen??
    Ich habe es jetzt so gemacht, dass ich die Pixel nicht sofort setze, sondern in ein dynamisches array schreibe und erst zum schluss setzte. Nur klappt das mit dem dynamischem array noch nicht...



    Re: Radrasimulation in Delphi

    Xin - 31.01.2008, 14:16


    Moritz hat folgendes geschrieben: jedesmal, wenn ich ihn ausprobiere, fängt der debugger an zu laufen und der Pc schmiert ab. kann man den debugger irgendwie abstellen??
    Ich habe es jetzt so gemacht, dass ich die Pixel nicht sofort setze, sondern in ein dynamisches array schreibe und erst zum schluss setzte. Nur klappt das mit dem dynamischem array noch nicht...
    Wozu brauchst Du ein dynamisches Array?

    Der PC schmiert ab?!
    Ich dachte, heute Betriebsysteme haben Speicherschutz? Programmierst Du unter Windows 98?



    Re: Radrasimulation in Delphi

    Moritz - 04.02.2008, 18:32


    das liegt am debugger, ich weiss nich... aber ich habe xp



    Re: Radrasimulation in Delphi

    Xin - 04.02.2008, 20:59


    Moritz hat folgendes geschrieben: das liegt am debugger, ich weiss nich... aber ich habe xp
    XP hat Speicherschutz, grundsätzlich sollte ein fehlerhaftes Programm (der Debugger) hier die Kiste nicht abschmieren lassen. Aber Windows XP ist ja auch nur Windows98 auf dem Weg ein Betriebsystem zu werden.

    Ich darf Dir Linux mit C/C++ oder MacOS mit C/C++/ObjC ans Herz legen?

    Anyway, was ist aus Deinem Programm geworden?



    Re: Radrasimulation in Delphi

    Moritz - 05.02.2008, 15:06


    na ja, ich weiß ja noch nicht, wie groß der Anwender das Fenster nachher zieht, und ich möchte die Pixel in einem array of array of tcolor speichern (eine farbe für jedes Pixel), demnach muss das array auch verschieden groß sein. Ein dynamisches array bietet sich also an.



    Re: Radrasimulation in Delphi

    Xin - 05.02.2008, 15:29


    Moritz hat folgendes geschrieben: na ja, ich weiß ja noch nicht, wie groß der Anwender das Fenster nachher zieht, und ich möchte die Pixel in einem array of array of tcolor speichern (eine farbe für jedes Pixel), demnach muss das array auch verschieden groß sein. Ein dynamisches array bietet sich also an.
    Wenn man nur den Hammer kennt, wird jedes Problem zum Nagel, hm?

    Für diese Technik gibt es einen eigenen Namen: BruteForce.
    BruteForce-Techniken stehen im Buzzword-Katalog auf einer Ebene mit Worst-Case-Szenario.

    Deine Lösung wird funktionieren, sie wird massiv Speicher und Rechenzeit schlucken, aber irgendeinen Grund wird es wohl haben, dass ich für die 2000 Mark für meinen 50MHz Prozessor vor 12 Jahren heute ein 3000 MHz Quadcore System bekomme. ^^

    Anders ausgedrückt: Programmieren mit Stil funktioniert anders.



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    atoi (Fehler: cast ??) - gepostet von exbs am Mittwoch 20.12.2006
    reihenfolge - gepostet von Robotfunk am Mittwoch 15.11.2006
    brauche Hilfe für ein kleines Programm - gepostet von Boron am Samstag 24.06.2006
    Pascal - gepostet von Kakashi am Donnerstag 22.02.2007
    Umrechner Arabische in Römische Zahlen - gepostet von Walgo am Donnerstag 19.07.2007
    compiler gesucht!!! - gepostet von the gangster am Donnerstag 07.06.2007
    <iostream.h> mit <conio.h>, geht nicht ? - gepostet von EndSub am Montag 05.06.2006
    Zahlen in eine Datei schreiben - gepostet von c# am Dienstag 03.04.2007
    % - gepostet von ottiotti am Samstag 07.10.2006



    Ähnliche Beiträge wie "Radrasimulation in Delphi"

    Delphi Videos - Hgli (Sonntag 10.09.2006)
    Delphi 7 Hilfe - molli (Freitag 01.12.2006)
    VA mit Delphi - Bob (Montag 12.03.2007)
    DELPHI-Quelltext: Worm Blaster - .-=[g4$m0k3]=-. (Donnerstag 10.06.2004)
    DELPHI-Quelltext: scherzprogramm - .-=[g4$m0k3]=-. (Donnerstag 10.06.2004)
    Delphi Compiler? - Anonymous (Sonntag 05.09.2004)
    Delphi(ne) - MLB (Donnerstag 03.02.2005)
    In die Registry schreiben - nur mit Delphi? - Newbie (Samstag 12.01.2008)
    Delphi - Nessy (Dienstag 26.09.2006)
    Delphi - Moritz (Samstag 29.12.2007)