Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kreis zeichen --> sieht komisch aus (https://www.delphipraxis.net/97095-kreis-zeichen-sieht-komisch-aus.html)

Christian18 4. Aug 2007 14:42


Kreis zeichen --> sieht komisch aus
 
Hallo,

ich zeichne einen Kreis mit einer Routine, die ich mir selber ausgedacht habe. Ich finde der Kreis sieht ein bisschen kompisch aus. Was kann man dagegen tun?

Hier mein Code:

Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
  var i   : TImage;  // Image zum Anzeigen dees Kreises
      j   : Integer; // Schleifenvariable
      r   : Integer; // Radius
      x, y : Real;    // x und y Werte des Kreises
begin
  // Parameter setzen
  i:=Image1;
  r:=i.Width div 2;

  // Berechnungen
  for j := 0 to 360 do
    begin
      x:=cos(DegToRad(j)) * r + i.Width / 2;
      y:=sin(DegToRad(j)) * r + i.Height / 2;

      i.Canvas.LineTo(Round(x), Round(y));
    end;
end;
Ich finde der sieht besser aus!!!

Delphi-Quellcode:
procedure TForm1.BitBtn2Click(Sender: TObject);
  var i : TImage;
begin
  i:=Image2;

  i.Canvas.Ellipse(0, 0, i.Width, i.Height);
end;
MFG Chris

Phoenix 4. Aug 2007 14:45

Re: Kreis zeichen --> sieht komisch aus
 
Bresenham-Algorithmus

arbu man 4. Aug 2007 14:52

Re: Kreis zeichen --> sieht komisch aus
 
Eventuell sagst du uns auch wie er komisch aussieht (ein Screenshot wäre eine Lösung).

Ich würde das Ganze so machen 2 Funktionen auf stellen um den Kreis zu Zeichen eine Für die Unterseite und eine Für die Oberseite. Die Funktion sieht dann wie folgt aus:

Code:
f(x) = sqrt(r² - x²) // basiert auf dem Satz des Pythagoras
Damit sparst du die sin und cos die viel Rechen Zeit beanspruchen.

mfg, Björn

Christian18 4. Aug 2007 14:55

Re: Kreis zeichen --> sieht komisch aus
 
Naja, deshalb habe ich ja den code reingestellt, da kann dann jeder selber gucken.

Christian18 4. Aug 2007 15:00

Re: Kreis zeichen --> sieht komisch aus
 
Ich habe nochmal was ausprobiert. Wenn ich nicht jeden Punkt berechne sondern nur jeden achten, dann sieht es auch besser aus. und schneller gehts auch noch xD

Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
  var i   : TImage;  // Image zum Anzeigen dees Kreises
      j   : Integer; // Schleifenvariable
      r   : Integer; // Radius
      x, y : Real;    // x und y Werte des Kreises
begin
  // Parameter setzen
  i:=Image1;
  r:=i.Width div 2;

  // Berechnungen
  for j := 0 to 45 do
    begin
      x:=cos(DegToRad(j * 8)) * r + i.Width / 2;
      y:=sin(DegToRad(j * 8)) * r + i.Height / 2;

      i.Canvas.LineTo(Round(x), Round(y));
    end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
  var i : TImage;
begin
  i:=Image2;

  i.Canvas.Ellipse(0, 0, i.Width, i.Height);
end;

Namenloser 4. Aug 2007 16:00

Re: Kreis zeichen --> sieht komisch aus
 
Könnte man nicht irgendwie den Umfang berechnen, und daraus die Anzahl der Schritte ableiten, die nötig sind, um den Kreis zu zeichnen? Weiß allerdings nicht, wie das bei einer Ellipse geht :mrgreen:

CalganX 4. Aug 2007 16:12

Re: Kreis zeichen --> sieht komisch aus
 
Hi,
mit dem Code wirst du auch keinen exakten Kreis erzeugen, sondern nur ein regelmäßiges 360-eck. Je größer du jetzt den Radius machst, desto deutlicher wird das. Wenn du einen genaueren Kreis haben willst, musst du die Anzahl der Iterationen erhöhen.
Mich wundert, dass der Kreis bei jedem achten Punkt mehr nach einem Kreis aussehen, aber ich habe gerade kein Delphi in der Nähe und ohne Screenshot sehe ich auch den Unterschied nicht.

Der Vorschlag über eine Funktion nach Satz des Pythagoras wird dir wahrscheinlich bessere Ergebnisse liefern. Das solltest du zumindest mal ausprobieren.

Chris

Phoenix 4. Aug 2007 16:28

Re: Kreis zeichen --> sieht komisch aus
 
Also nochmal poste ich den Link zum Bresenham-Algorithmus nicht.

Der Algorithmus ist deswegen so schnell, weil er nur 1/8 des gesamtkreises berechnen muss. Die restlichen achtel werden einfach gespiegelt. Und er ist deswegen so genau, weil er die ideale Annäherung an einen Kreis berechnet.

Wenn Kreis, dann Bresenham.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 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