Kreis: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „Ein Kreis lässt sich durch einen Winkel, Radius und Mittelpunkt parameterisieren. <source lang="c"> int x=m+r*cosf(alpha); int y=m+r*sinf(alpha); </source> Fü…“)
 
 
Zeile 2: Zeile 2:
  
 
<source lang="c">
 
<source lang="c">
int x=m+r*cosf(alpha);
+
int x = ofsx + r * cosf(alpha);
int y=m+r*sinf(alpha);
+
int y = ofsy + r * sinf(alpha);
 
</source>
 
</source>
  
 
Für einen vollständigen Kreis durchläuft man alpha von 0 bis 2PI und als Zeichenmodus wird GL_POINTS oder GL_LINE_STRIP gewählt.
 
Für einen vollständigen Kreis durchläuft man alpha von 0 bis 2PI und als Zeichenmodus wird GL_POINTS oder GL_LINE_STRIP gewählt.
 +
 +
==Beispiel==
 +
Dieses Beispiel zeigt, wie man die obige Formel umsetzt, einfachheitshalber wird der Kreis auf den Canvas des Forms ausgegeben.<br>
 +
Bei OpenGL nimmt man anstelle MoveTo und LineTo, Vektoren.
 +
 +
<source lang="pascal">
 +
procedure TForm1.Circle(ofsx, ofsy, radius: integer);
 +
const
 +
  Sektoren = 24; // Die Auflösung des Kreises.
 +
var
 +
  i: integer;
 +
  a: single;
 +
begin
 +
  Canvas.MoveTo(ofsx + radius, ofsy);
 +
  for i := 1 to Sektoren do begin
 +
    a := Pi * 2 / Sektoren * i;
 +
    Canvas.LineTo(
 +
      ofsx + round(cos(a) * radius),
 +
      ofsy + round(sin(a) * radius)
 +
    );
 +
  end;
 +
end;
 +
</source>

Aktuelle Version vom 18. Mai 2018, 20:07 Uhr

Ein Kreis lässt sich durch einen Winkel, Radius und Mittelpunkt parameterisieren.

int x = ofsx + r * cosf(alpha);
int y = ofsy + r * sinf(alpha);

Für einen vollständigen Kreis durchläuft man alpha von 0 bis 2PI und als Zeichenmodus wird GL_POINTS oder GL_LINE_STRIP gewählt.

Beispiel

Dieses Beispiel zeigt, wie man die obige Formel umsetzt, einfachheitshalber wird der Kreis auf den Canvas des Forms ausgegeben.
Bei OpenGL nimmt man anstelle MoveTo und LineTo, Vektoren.

procedure TForm1.Circle(ofsx, ofsy, radius: integer);
const
  Sektoren = 24; // Die Auflösung des Kreises.
var
  i: integer;
  a: single;
begin
  Canvas.MoveTo(ofsx + radius, ofsy);
  for i := 1 to Sektoren do begin
    a := Pi * 2 / Sektoren * i;
    Canvas.LineTo(
      ofsx + round(cos(a) * radius), 
      ofsy + round(sin(a) * radius)
    );
  end;
end;