Einen Bogen zeichnen In opengl
Ich eine Funktion benötigen, damit Sie einen Bogen zeichnen in opengl.
Ich brauche auch ein Beispiel-code für die Verwendung.
kann ich einen Kreis zeichnen mit Linien,die ich zeichnen möchte, Bogen-Linie zu.
Dies ist Meine Funktion zum zeichnen von circule :
void DrawCircle(float cx, float cy, float r, int num_segments)
{
glBegin(GL_LINE_STRIP);
for(int ii = 0; ii < num_segments; ii++)
{
float theta = 2.0f * 3.1415926f * float(ii) /float(num_segments);//get the current angle
float x = r * cosf(theta);//calculate the x component
float y = r * sinf(theta);//calculate the y component
glVertex2f(x + cx, y + cy);//output vertex
}
glEnd();
}
Ich verwendet LINE_STRIP für das Konzert der code zum Zeichnen eines Bogens, aber hat nicht funktioniert.
Wer kann mir helfen?
- Dies ist nicht ein gib mir codz plz-website. Sie müssen um genauer zu sein. Zeigen Sie, was Sie versucht haben. Was ist der code, den Sie bisher geschrieben haben? Welcher Teil des Codes ist problematisch? Ist es der OpenGL-API, die Sie haben problem mit, oder der Algorithmus? Haben Sie ein problem mit der Mathematik, oder in der Umsetzung als Programm?
- ich möchte zu erstellen arc mit Line-in openGL.
- Schnellste Lösung: Lassen Sie die
for
gehennum_segments
dividieren und die Winkel vonfloat(something_bigger)
stattfloat(num_segments)
. Aber generell gibt es viel bessere Lösungen. - Scheint, Sie sind mit einer alten OpenGL-version, bitte angeben, welche version
- Ja,Sie haben Recht,machen Sie bitte Ihren Kommentar auf eine Antwort, ich kann wählen, es für die beste Antwort, mein Freund.Der Winkel des Bogens konstant ist jetzt...wie kann ich es machen variable ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht unbedingt der beste Weg, aber wenn Sie nur brauchen, um etwas zu arbeiten, Sie können Ihre circle-code etwas. Hinzufügen eines
float arc_length
parameter an die Funktion Unterschrift. Ersetzen2.0f * 3.1415926f
mitarc_length
. Wenn Sie brauchen, um starten Sie den Lichtbogen bei einem bestimmten offset, die Sie hinzufügen können, ein weiterer parameter namensfloat arc_start
. Dann fügen Siearc_start
zutheta
in jeder iteration Ihrerfor
Schleife.Bearbeiten, basierend auf Saman ' s Kommentar:
Was Sie eigentlich wollen, ist nicht nur ein Bogen, sondern eine weitere Allgemeine Darstellung einer Kurve. Ein Bogen ist ein Art der Kurve, aber es ist eine sehr Besondere Art, D. H. mit einem Konstanten radius. Es klingt wie Sie möchten, um zu zeichnen, beliebige Kurven, eventuell mit unterschiedlichen Radien. Wenn dem so ist, dann ist meine Empfehlung Bezier-Kurven. Hier ist eine ziemlich gute Einführung:
http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/
Hinweis: der Teil später in das tutorial über das zeichnen, wo der Autor sagt "der einfachste Ansatz ist die Verwendung von kleinen Schritten von t zu berechnen aufeinanderfolgender Punkte." Das ist ziemlich viel, was Sie zu tun haben, um so zeichnen Sie eine Bézier-Kurve in OpenGL. Wählen Sie einen Wert von
t
, und die Schrittweite in einer for-Schleife, genauso wie Sie es mittheta
in Ihren ursprünglichen Kreis von code. Für jede iteration, zeichnen Sie einen Punkt.Haben Sie verschiedene Lösungen, basierend auf, wie Sie ziehen Sie Ihren Kreis. Derzeit, was Sie tun, ist zu teilen
2*pi
inn
Segmente und verbinden Sie zusammen. Gut, die erste Lösung, die einem einfällt, ist zu ändern Sie die Auswahl des arc.Beispielsweise, um den Bogen nur
3*PI/4
Sie können einfach ändern Sie Ihrezu
Oder allgemein, wenn man bedenkt, das der Kreis zu entsprechen
1
nichts und entsprechen0
machen Sie einen Bogen, die ists
mal den Kreis (z.B. 3/8), dann kannst du einfach schreiben:Beachten Sie, dass Sie nicht wollen, dass die Bögen beginnen bei Winkel 0. Daher können Sie eine Konstante, die den Startwinkel um diese Formel zu:
Andere Lösung wäre, statt-computing-Winkel innerhalb des arc, erhalten Sie den start-und Endwinkel, und eine Schritt Größe. Dann haben Sie:
und stellen Sie sicher, dass Sie am Ende Ihrer
GL_LINE_STRIP
Sie eineglVertex2f
vontheta
entsprechendend
Winkel zur Oberfläche die arc richtig.Aus Ihren Kommentaren zu den anderen Antworten, scheint es möglich, dass Sie in der Tat auf der Suche nach anderen Kurven wie bezier-Kurven oder splines oder andere.
glVertex3f
undglVertex2f
sind die gleiche Sache. Man zieht in 3d und die andere in 2d. Aber 2d wird 3d mit z=0.