PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BoundingBox eines Kreisbogens (Arc)


DanDanger
30.09.2004, 17:15
Hallo,

ich möchte die BoundingBox eines Kreisbogens (Arc) Berechnen.
Ich kenne den Mittelpunkt (M), Radius (R), den Öffnungswinkel (Alpha),
und den Schliesswinkel (Beta) vom Kreisbogen, habe aber keine Idee, wie ich an die beiden Punkte für die BoundingBox (UpperRight, LowerLeft) herankomme.

Mein bisheriger Code sieht so aus :

UpperRight.x = Mittelpunkt.x + Radius * cos(Alpha * ((2 * PI) / 180)) ;
UpperRight.y = Mittelpunkt.y - Radius * sin(Alpha * ((2 * PI) / 180)) ;

LowerLeft.x = Mittelpunkt.x + Radius * cos(Beat* ((2 * PI) / 180)) ;
LowerLeft.y = Mittelpunkt.y - Radius * sin(Beta* ((2 * PI) / 180)) ;


Nur leider haut das nicht hin.

Ich hab' mal eine kleine zeichnung eingefügt, damit man sich das besser Vorstellen kann.....
http://www.coding-board.de/board/attachment.php?attachmentid=544&stc=1

Hat jemand ne' Idee ??

Neugierige Grüsse
DanDanger


DarkTom
01.10.2004, 04:48
Zunächst mal verwundert mich, das die Winkel in die andere Richtung gemessen werden, als der Kreisbogen geschlossen ist, d.h. dass beta-alpha nicht den Winkel des Kreisbogens angibt. Soll das so oder ist das ein Versehen bei der Zeichnung?

Ich werde auf jeden Fall mal drüber nachdenken. :)

DanDanger
01.10.2004, 13:35
Zunächst mal verwundert mich, das die Winkel in die andere Richtung gemessen werden, als der Kreisbogen geschlossen ist, d.h. dass beta-alpha nicht den Winkel des Kreisbogens angibt. Soll das so oder ist das ein Versehen bei der Zeichnung?


Das soll so sein.

Ich bin mittlerweile schon etwas weiter, und erhalte den Start und End-Punkt
des Kreisbogens :


ArcStartPoint.x = Mittelpunkt.x + Radius * cos(StartAngle) ;
ArcStartPoint.y = Mittelpunk.y + Radius * sin(StartAngle) ;

ArcEndPoint.x = Mittelpunkt.x + Radius * cos(EndAngle) ;
ArcEndPoint.y = Mittelpunk.y + Radius * sin(EndAngle) ;

{ Wobei StartAngle und EndAngle im Bogenmass angegeben sind }

==> NUN : Fallunterscheidung, in welchem Quadranten ich mich befinde
|
A | B
--+--
C | D
|

(.. tja, hier komme ich halt nicht weiter.....)


Neugierige Grüsse
DanDanger

DarkTom
01.10.2004, 23:39
Grr, das war also kein Versehen. Und ich war jetzt davon ausgegangen und hatte dafür die Lösung vorbereitet:if (beta < alpha) beta = beta + 2*PI

alphaX = radius * sin(alpha)
betaX = radius * sin(beta)
alphaY = radius * cos(alpha)
betaY = radius * cos(beta)

if (alpha < PI/2 && beta > PI/2) minX = -radius
else minX = min(alphaX, betaX, 0)

if (alpha < 3*PI/2 && beta > 3*PI/2) maxX = radius
else maxX = max(alphaX, betaX, 0)

if (alpha < PI && beta > PI) minY = -radius
else minY = min(alphaY, betaY, 0)

if (beta > 2*PI) maxY = radius
else maxY = max(alphaY, betaY, 0)Die Punkte sind relativ zum Mittelpunkt, d.h. du musst überall noch den Mittelpunkt addieren.

Die Lösung passt so dann ja leider doch nicht mehr.
Wobei, du kannst ja einfach in mein System umrechnen indem du alpha und beta vertauscht.

DanDanger
02.10.2004, 00:14
Hey,
erstmal : Danke ;-)

Ich hab's mittlerweile auch selbst hinbekommen, aber mit 16 (!) Fallunterscheidungen (ich musste jeden Quadranten im Koordinatensystem mit den anderen vergleichen ).....

Deine Lösung sieht auf jeden Fall WESENTLICH ELEGANTER aus :)
Ich komme leider erst am Montag wieder dazu, das Zeug zu testen.
Das mit dem Anpassen der Koordinaten bekomme ich dann schon hin....;-)

Ich hab' aber nochmal ne' Frage zum Code - Verständniss :
Mit :
alphaX = radius * sin(alpha)
betaX = radius * sin(beta)
alphaY = radius * cos(alpha)
betaY = radius * cos(beta)

bekommst du ja die LOKALEN Anfangs- und Endpunkte des Kreisbogens !
(
Also :
Anfangspunkt.x = Mittelpunkt.x + alphaX ;
Anfangspunkt.y = Mittelpunkt.y + alphaY ;

Endpunkt.x = Mittelpunkt.x + betaX ;
Endpunkt.Y = Mittelpunkt.y + betaY ;
)
Hab' ich soweit alles richtig Verstanden ??

Nun, ich habe nun überprüft, wie Start- und Endpunkt zueinander stehen
(die 16 IF...THEN Abfragen), um zu prüfen, "wie herum" der Kreisbogen den
nun verläuft.
Schliesslich begrenzt immer entweder ein Punkt(Start- oder Endpunkt) oder
der Radius des Kreisbogens die BoundingBox.

Wie genau funktioniert deine Lösung (und warum kommst Du ohne die vergleiche der Quadranten aus ?) ?

Neugierige Grüsse
DanDanger

DarkTom
02.10.2004, 05:23
Ich hab' aber nochmal ne' Frage zum Code - Verständniss :
Mit :
alphaX = radius * sin(alpha)
betaX = radius * sin(beta)
alphaY = radius * cos(alpha)
betaY = radius * cos(beta)

bekommst du ja die LOKALEN Anfangs- und Endpunkte des Kreisbogens !
(
Also :
Anfangspunkt.x = Mittelpunkt.x + alphaX ;
Anfangspunkt.y = Mittelpunkt.y + alphaY ;

Endpunkt.x = Mittelpunkt.x + betaX ;
Endpunkt.Y = Mittelpunkt.y + betaY ;
)
Hab' ich soweit alles richtig Verstanden ??Jepp!
Schliesslich begrenzt immer entweder ein Punkt(Start- oder Endpunkt) oder
der Radius des Kreisbogens die BoundingBox.

Wie genau funktioniert deine Lösung (und warum kommst Du ohne die vergleiche der Quadranten aus ?) ?Deine Aussage ist fast richtig, lediglich den Mittelpunkt hast du übersehen, der kann durchaus auch begrenzen, bei einem relativ 'spitzen' Stück. Daher wird in meinem else-Zweigen auch immer das Extremum von diesen drei Punktkoordinaten gebildet. Um zu prüfen, ob für einen Wert der Kreisbogen ausschlaggebend ist, prüfe ich einfach, ob der Bogen da lang geht. Nehmen wir als Beispiel minX. Dazu müssen wir wissen, ob bei 90° bzw PI/2 der Bogen lang geht. Und das tut er genau dann, wenn alpha kleiner und beta größer als PI/2 ist. Wie gesagt, alpha und beta hier immer nach meinem Verständnis.

Soweit alles klar?

DanDanger
02.10.2004, 13:42
Ahhhh,
Danke, jetzt hab' ich's Verstanden. :D
War meine Idee mit dem Quadrantenvergleich also doch nicht sooo Falsch (nur viel zu kompliziert).
Anstatt die Koordinatend der Punkte die Winkel zu Vergleichen, da wäre ich jetzt nicht drauf gekommen :rolleyes:

Nochmals : DANKE ;-)