Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Programm zur Bestimmung von PI - Schleife auf Knopfdruck abbrechen, aber wie?

  Alt 13. Nov 2010, 18:55
Hier haben wir doch ein perfektes Beispiel dafür, warum man Code und Ausgabe trennen sollte.

Die ermittelten Zufallspunkte werden in einem Bitmap gepseichert und nun drängt sich die Frage auf, wie man die Anzahl der Zufallspixel bekommt und die Anzahl der Pixel im Kreissegment.
Das Bitmap beinhaltet ja auch noch die Kreislinie.

Antwort: Geht gar nicht. Durch die Zufallsmethode können auf einem Pixelpunkt des Bitmaps n Zufallspunkte liegen. Wie soll das im Nachhinein gezählt werden? Pixel ist blauer als der andere Blaue?

Also trennen wir das Ganze mal, denn die Berechnung muss auch ohne grafische Ausgabe erfolgen und selbige dient ja nur der Visualisierung.

Zunächst brauchen wir ja einen Speicher für einen Zufallspunkt. Da bietet und Delphi ja passend TPoint an. Da können wir einen x und y Wert abspeichern (was wollen wir mehr).
Wir haben mehrere Punkte, gut wir brauchen eine Liste. Das ist jetzt Geschmackssache, ob man das mit einer verketteten Liste (Pointer) selber baut, ein variables Array benutzt oder das fertige TList oder auch TObjectList .

Jede Liste hat eine Eigenschaft Count und schon weiß man, wieviele Punkte man insgesamt erzeugt hat.

Jetzt fehlt und ein Algorithmus, der berechnen kann, ob ein Punkt innerhalb oder ausserhalb des Kreissegments liegt.

Die Ausgabe erfolgt jetzt anhand genau dieser Liste. Also jeden Pixel wie gewohnt auf das Bitmap klatschen.
Über den Algorithmus, weiß man, ob der Punkt blau oder rot gepinselt werden soll.

BTW das Ergebnis wird umso genauer, je größer man das Zielgebiet macht.
Ein Gebiet mit 10x10 Pixel ergibt ein ungenaues Ergebnis.
1000x1000 wäre schon besser

Bei einer Auflösung mit 10.000x10.000 habe ich aber Probleme mit der Darstellung. Darum hilft jetzt auch die Trennung zwischen Code und Ausgabe, denn die Pixel-Koordinaten werden für die Ausgabe einfach skaliert.
Code:
AusgabeX = Runden( WertX / WertBreite * AusgabeBreite )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat