AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Kreisbogen direkt zeichnen (ohne canvas.arc)
Thema durchsuchen
Ansicht
Themen-Optionen

Kreisbogen direkt zeichnen (ohne canvas.arc)

Ein Thema von cltom · begonnen am 19. Mär 2008 · letzter Beitrag vom 21. Mär 2008
Antwort Antwort
cltom

Registriert seit: 22. Sep 2005
223 Beiträge
 
Delphi 12 Athens
 
#1

Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 19. Mär 2008, 12:30
Hallo DP,

folgende Sache: ich möchte genau das, was die Funktion canvas.arc kann, manuell nachbauen. Also ein Kreissegment (oder einen Kreisbogen) zeichnen und zwar zwischen zwei Punkten P1 und P2. Warum nicht arc nehmen? Ich brauche die Koordinaten einzelner Kreispunkte explizit, nicht das fertige Ding.

Jetzt kann ich mit der Kreisgleichung anfangen:

(x-xm)² + (y-ym)² = r²

Die Frage aber dann: wie kann ich den relevanten Teil des Kreises herausnehmen? Den ganzen Kreis durchgehen und prüfen ... ja, aber was? Ich sehe hier keine sinnvolle Prüfung.

Alternative Kreisgleichung:

x = xm + r * cos phi
y = ym + r * sin phi

mit phi = 0 .. 2pi

Die Idee hier: ich rechne mir von P1 und P2 jeweils phi aus und prüfe, ob phi im gegebenen Bereich liegt. Im Grunde rolle ich also den Kreis auf eine Strecke von 0 bis 2 pi ab und lasse nur jene werte durch, die zwischen P1 und P2 liegen.

Das Problem dabei: nach der Umkehrung des Cos mit dem ArcCos kann ich ja nicht mehr sagen, ob der ursprüngliche Wert zB: pi/2 oder 3pi/2 war. Eine einfache Prüfung geht also so auch nicht.

So, und hier stecke ich einmal. Aber dieses Problem hat doch bestimmt schon irgendwer einmal gelöst. Nicht zuletzt die Leute von Borland (oder vermutlich Microsoft), die den arc geschrieben haben.

kann mir jemand weiterhelfen?

danke!

gruß
tom
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 19. Mär 2008, 19:34
Hallo,

Falls du English kannst, lies dir doch mal den Artikel Draw an Arc with ActionScript durch.

Die Delphi Umsetzung würde etwa so aussehen:

Delphi-Quellcode:
procedure drawArc(Canvas: TCanvas; centerX, centerY, radius, startAngle, arcAngle: Real; steps: Word);
var
  angleStep, angle, twoPI, xx, yy: Real;
  i: Word;
begin
 //
 // For convenience, store the number of radians in a full circle.
  twoPI := 2 * PI;
 //
 // To determine the size of the angle between each point on the
 // arc, divide the overall angle by the total number of points.
  angleStep := arcAngle / steps;
 //
 // Determine coordinates of first point using basic circle math.
  xx := centerX + cos(startAngle * twoPI) * radius;
  yy := centerY + sin(startAngle * twoPI) * radius;
 //
 // Move to the first point.
  Canvas.moveTo(Trunc(xx), Trunc(yy));
 //
 // Draw a line to each point on the arc.
  for i := 1 to steps - 1 do
  begin
  //
  // Increment the angle by "angleStep".
    angle := startAngle + i * angleStep;
  //
  // Determine next point's coordinates using basic circle math.
    xx := centerX + cos(angle * twoPI) * radius;
    yy := centerY + sin(angle * twoPI) * radius;
  //
  // Draw a line to the next point.
    Canvas.lineTo(Trunc(xx), Trunc(yy));
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  drawArc(Canvas, 250, 250, 200, 45 / 360, -90 / 360, 20);
end;
Thomas
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#3

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 20. Mär 2008, 10:50
Welche Punkte brauchst du denn genau? Um einen Kreisbogen (oder eine Linie oder einen Kreis) zu zeichnen geht man normalerweise nicht von dieser Figur aus und zeichnet jeden x-ten Punkt, sondern man geht von den Pixeln des Ziels aus. Damit vermeidet man dann nämlich sowohl Lücken als auch doppelt gezeichnete Pixel, hat also das beste Ergebnis und die beste Geschwindigkeit. Wenn das für dich ok wäre, dann wären die Linien- und Kreisalgorithmen vom guten alten Bresenham für dich vielleicht einen Blick wert. Vielleicht kannst du den Kreisalgorithmus für einen Bogen adaptieren.
Wenn du hingegen ganz bestimmte Punkte auf dem Bogen brauchst, ist toms' Lösung natürlich günstiger.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
223 Beiträge
 
Delphi 12 Athens
 
#4

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 20. Mär 2008, 18:23
Danke für die Tipps!

Bei meiner Suche bin ich nun auch schon auf Bresenham gestossen, das dürfte ziemlich genau sein, was ich brauche, wenngleich ich noch keine implementierung eines kreisbogens mit Bresenham in Pascal gefunden habe. Aber gut, das lässt sich durch Such- oder Überlegarbeit auch noch lösen.

danke jedenfalls!

gruß
tom
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
223 Beiträge
 
Delphi 12 Athens
 
#5

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 21. Mär 2008, 11:24
Hmm, also vielleicht hat jemand noch Rat:

Zeichnen eines Kreises mit Bresenham geht soweit. Wie schränke ich nun aber auf die Strecke zwischen P1 und P2 ein?

hier:
http://de.wikipedia.org/wiki/Bresenham-Algorithmus
steht mal ganz entspannt:

Zitat:
Die obigen Implementierungen zeichnen immer nur komplette Oktanten bzw. Kreise. Wenn man nur einen bestimmten Kreisbogen von einem Winkel α bis zu einem Winkel β zeichnen will, muss man das so implementieren, dass man sich die x- und y-Koordinaten dieser Endpunkte im Vorhinein berechnet, wobei man unvermeidlich auf Trigonometrie oder Wurzelrechnung zurückgreifen muss (s. a. Heron-Verfahren). Dann lässt man den Bresenham-Algorithmus über den kompletten Oktanten bzw. Kreis laufen und setzt die Pixel aber nur dann, wenn sie in den gewünschten Bereich fallen. Nach Beendigung dieses Kurvenstücks kann man den Algorithmus vorzeitig abbrechen.
Jo, schon, aber wie prüfe ich das? Wie kann ich bei einem Oktanten sagen, ob seine Punkte auf dem Weg zwischen P1 und P2 liegen?
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
223 Beiträge
 
Delphi 12 Athens
 
#6

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 21. Mär 2008, 11:33
@toms

die Lösung wäre an sich schön, mein Problem damit ist, dass nur die Punkte P1 und P2 bekannt sind, zwischen denen der Kreisbogen gezeichnet werden soll, nicht die Winkel. Jetzt kann man zwar aus den Punkten die Winkel errechnen (als Winkel zwischen zwei Vektoren), was ich auch so mache. Allerdings kommen da eben Winkel zwischen 0 und 180 heraus. Das heisst, die Punkte

P1 = (10 | 20)
und
P2 = (10 | -20)

ergeben den gleichen Winkel und damit keinen Kreisbogen.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 21. Mär 2008, 13:05
Zitat von cltom:
P1 = (10 | 20)
und
P2 = (10 | -20)

ergeben den gleichen Winkel und damit keinen Kreisbogen.
Natürlich ist das so... Ist ja ähnlich wie bei der Quadratwurzel... asin und acos liefern halt immer winkel zwischen 0..180°, genau wie die Quadratwurzel immer nur positive Zahlen liefert.

Da du aber deine Punkte kennst, weisst du somit auch ganz genau, in welchem Quadranten deines Einheitskreises du dich befindest. Darauf musst du dann deine Winkel mappen.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Kreisbogen direkt zeichnen (ohne canvas.arc)

  Alt 21. Mär 2008, 13:58
Oder einfach Delphi-Referenz durchsuchenArcTan2 benutzen .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 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