OpenGl, Kreisbogen Zeichenen

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

OpenGl, Kreisbogen Zeichenen

Beitrag von cloidnerux » Mo Feb 15, 2010 5:16 pm

Also, ich will mit OpenGL einen Kreisbogen zeichnen. Den Kreisbogen wollte ich als Dreieck Definieren, dessen Umkreis den Kreisbogen darstellt und zwei Punkte des Dreiecks als Start, bzw Endpunkt dient. Meine Größte Hürde bei der Umsetzung bisher ist, das ich es nicht schaffe den Mittelpunkt des Umkreises zu finden.
Hat jemand einen Vorschlag für eine bessere Implementation oder eine Lösung zum finden des Mittelpunkts?
Redundanz macht wiederholen unnötig.
quod erat expectandum

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: OpenGl, Kreisbogen Zeichenen

Beitrag von AnGaiNoR » Mo Feb 15, 2010 6:20 pm

Also mein Ansatz sähe so aus:

Dreieck ABC ist gegeben. Aus A bilde ich den Vektor va aus AB den Vektor vc und aus AC den Vektor vb.
Die Punkte bilden eine Ebene, die sich durch vx = va + r * vb + s * vc beschreiben lässt. Deren Normalenvektor vn ist das Kreuzprodukt vb x vc.

Die Geraden der Mittelsenkrechten haben den Stützvektor va + 0.5 * vb bzw. va + 0.5 * vc. Der Richtungsvektor muss senkrecht zum Vektor der Seite sein und senkrecht zum Normalenvektor der Dreiecksebene; er ergibt sich also aus dem Kreuzprodukt. Die Mittelsenkrechten lauten also:
mb: vx = va + 0.5 * vb + r * (vn x vb)
mc: vx = va + 0.5 * vc + r * (vn x vc)

Diese Geraden musst du bestimmen und zum Schnitt bringen, dadurch erhälst du den Umkreismittelpunkt. Der Radius ist dann einfach der Abstand zu einem Punkt des Dreiecks.
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: OpenGl, Kreisbogen Zeichenen

Beitrag von Dirty Oerti » Mo Feb 15, 2010 6:34 pm

Naja, also wie genau du das jetzt einbauen willst weiß ich nicht, aber ich kann dir helfen den Umkreismittelpunkt zu finden ^^

Bekanntlichermaßen ist der Umkreismittelpunkt in einem Dreieck der Schnittpunkt aller Mittelsenkrechten.
Sprich: Du suchst die Mittelpunkte der Seiten (2 reichen ja), berechnest den Normalenvektor der jeweiligen Seite und stellst daraus zwei Geraden auf, die du dann schneidest. Der Schnittpunkt ist dein Mittelpunkt.

So, ausführlich für die Nicht-Mathematiker:

Du hast ein Dreieck ABC
Punkt A hat die Koordinaten (a1,a2), Punkt B die Koordinaten (b1,b2) etc...

Also berechnest du zuerst die Seitenmittelpunkte der Seiten AB und AC:

AB:

M = 0.5 * (A+B)
also:
m1 = 0.5 * (a1+b1)
m2 = 0.5 * (a2+b2)

Dann brauchst du den Normalenvektor zur Seite. Dazu erstmal der Vektor der Seite:
v = A-B (wieder mit den einzelnen Koordinaten)

Den Normalenvektor in einem 2D-System zu finden ist einfach:
Einfach die beiden Koordinaten vertauschen und eine mit -1 multiplizieren:

n1 = v2
n2 = v1 * -1

=> Normalenvektor n

Dann stellst du eine Gerade auf, die den Seitenmittelpunkt als Aufpunkt hat und in Richtung n geht:

G = M + k*n

Das gleiche jetzt nochmal mit einer anderen Seite..
Liefert uns z.b. die Gerade H

Nun schneiden wir G und H:
(Der Aufpunkt der Geraden G ist g, der Vektor v, Aufpunkt von H ist h und Richtung ist u)

g1 + k*v1 = h1 + l*u1
g2 + k*v2 = h2 + l*u2

Auflösen nach k (oder l, ist eigntl egal) und dann einsetzen in die jeweilige Geradengleichung und man hat den Punkt :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: OpenGl, Kreisbogen Zeichenen

Beitrag von cloidnerux » Mo Mär 01, 2010 8:03 pm

So, für alle die es Interessiert, ich habe seit langen mal wieder die Zeit gefunden und das ganze in Code umgewandelt, nachdem ich auch 4 mal nachgerechnet habe, fand ich auch alle Bugs im Programm, die zum Teil an einer vergessenen Klammer lagen :evil:
Hier der Code:

Code: Alles auswählen

//Zentrum zweier Seiten des Dreiecks ausrechnen
PointF centerA, centerB;
centerA = new PointF(0.5f * (end.X + arc.X),
    0.5f * (end.Y + arc.Y));
centerB = new PointF(0.5f * (start.X + arc.X),
    0.5f * (start.Y + arc.Y));
//Die Stützvektoren der Mittelsenkrechten Ausrechnen
VectorF va, vb;
va = new VectorF(end, arc);
vb = new VectorF(start, arc);
va.Normalize();
vb.Normalize();
//Nach K aufgelöste Formeln->K berechnen
float k = ((vb.X * (centerA.Y - centerB.Y)) - (vb.Y * (centerA.X - centerB.X))) / ((va.X * vb.Y) - (va.Y * vb.X));
//Das Zentrum des Umkreises bestimmen.
PointF umkreisCenter = centerA + (va * k);
//radius berechnen
float radius = (float)GetDistanceBetwenTwoPoints(start, umkreisCenter);
Das ganze ist wie beim letzten mal C#, PointF stellt ein Punkt mit float Koordinaten dar, VectorF ein Vektor mit flaot Koordinaten und einigen Nützlichen Operatorüberladungen."start", "end", "arc" stehen für die Punkte des Dreiecks, die den Kreisbogen beschreiben, GetDistanceBetwenTwoPoints ist eine Memberfunktion.
Wer den Funktionsfähigen, Kompletten Code haben möchte, kann mich über PN an benarichtigen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten