Welcome to the new Friends-of-FPC!

Here you can find all kinds of information about the FreePascal Compiler. We have many tutorials and howtos as well as a selection of tools to help you with your programming. We also have some example codes for you. And if you want to contribute some information/ sources/ tools yourself you can do so.
Also we have finally relaunched the FoFPC forum. It's your chance for some Q&A about everything FreePascal.

Friends-of-FPC

Tutorials: Learn how to code with FreePascal.

Source Codes: A collection of examples, miscellaneous source codes and open source stuff.

Tools and Help Files: Intro- duction of some tools that might help you with FPC.

Community

Forum: Ask or answer questions about the FreePascal Compiler, programming or just babble about coding.

Contribute! Contribute your own Tutorial, Source Codes or Tools and send them to us!

Website

About: Information about Friends-of-FPC.org.

Grundlagen der Grafikprogrammierung - Teil 9 - by Delax

Hi!

Linien hatten wir das letzte Mal, nun zu Kreisen. Kreise sind eigentlich einfach. Wir verwenden auch wieder einen Algorithmus von Bresenham. Schauen wir uns einmal einen ganz normalen Kreis an:

Na gut, es gibt im groben und ganzen 2 Möglichkeiten einen Kreis darzustellen. Der erste funktioniert auf der Grundlage von Y = R*Sin(deg) bzw X = R*Cos(deg). Das sind Formeln auf der Grundlage von Pythagoras, wie man die X/Y Koordinaten eines Kreises berechnet. Was fällt euch auf? Richtig - da wird Sinus und Cosinus zur Berechnung genutzt. Grundsätzlich also eine gute Methode, nur zu langsam.

Die Methode von Bresenham basiert mehr auf Logik. Ein Kreis ist eine ziemlich symmetrische Sache. Schauen wir uns den Kreis noch einmal an:

Was sehen wir? Ein Kreis kann also in 2 gleiche Hälften geteilt werden. Und das sowohl auf X und Y Achse. Da haben wir schon einmal 4 Teile. Jetzt drehen wir das ganze um 45 Grad und schon haben wir 8 Teile, die im Grunde gleich sind und nur gespiegelt werden müssen.

Na gut, das erspart Arbeit, aber eigentlich nicht die Sinus/ Cosinus Berechnungen. Bresenham fand auch dazu eine Lösung, indem er diesen 1/8 Kreis als eine Art Linie ausgelegt hat. Nur hat diese Linie keine konstante Steigung, sondern vielmehr eine Funktion als Steigung.

Als fertige Prozedur halten wir uns wieder an Toxic Avenger, der hat in seinem Tutorial nämlich schon einen fertig umgesetzten Bresenham Kreis-Algorithmus angegeben, den wir nur noch etwas modifizieren müssen:

 PROCEDURE Circle(destiny : pointer; x0,y0,radius : longint; color1, color2 : byte);
   Var x,y,p : longint;
  BEGIN

   x:=0;
   y:=-radius;
   p:=y shl 1+3;
   while x<=-y do begin
    PutPixel(destiny,x0+x,y0+y,color1, color2);
    PutPixel(destiny,x0-x,y0+y,color1, color2);
    PutPixel(destiny,x0+x,y0-y,color1, color2);
    PutPixel(destiny,x0-x,y0-y,color1, color2);
    PutPixel(destiny,x0+y,y0+x,color1, color2);
    PutPixel(destiny,x0-y,y0+x,color1, color2);
    PutPixel(destiny,x0+y,y0-x,color1, color2);
    PutPixel(destiny,x0-y,y0-x,color1, color2);
    if p>=0 then begin
     inc(y);
     inc(p,(x+y)shl 2+6);
    end else inc(p,x shl 2+6);
    inc(x);
   end;

  END;

Und wieder ein komplettes Beispiel zum Schluß: Hier als Datei zum download

Das nächste Mal binden wir die Prozeduren, die wir schon haben in eine eigene Unit und machen ein paar kleine Spielereien. Bis denn dann!

Delax/ Sundancer Inc.
[delax@sundancerinc.de]

Back to previous page

Useful Links









Link to us