Effiziente Weise zu Ellipse zeichnen mit OpenGL oder D3D
Gibt es einen schnellen Weg, um einen Kreis zeichnen, wie dies
void DrawCircle(float cx, float cy, float r, int num_segments)
{
float theta = 2 * 3.1415926 /float(num_segments);
float c = cosf(theta);//precalculate the sine and cosine
float s = sinf(theta);
float t;
float x = r;//we start at angle = 0
float y = 0;
glBegin(GL_LINE_LOOP);
for(int ii = 0; ii < num_segments; ii++)
{
glVertex2f(x + cx, y + cy);//output vertex
//apply the rotation matrix
t = x;
x = c * x - s * y;
y = s * t + c * y;
}
glEnd();
}
Frage ich mich, ob es eine ähnliche Weise zu zeichnen, ellipse, wo seine major/minor-Achsen-Vektor und die Größe bekannt sind.
Dieser code wird niemals "effizient" solange Sie den immediate-mode (glBegin, glVertex, glEnd, etc.)
InformationsquelleAutor giggle | 2011-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Möglichkeit eine Kurve zeichnen in openGL, nur eine Menge von geraden Linien. Aber wenn Sie vertex-buffer-Objekte, dann werden Sie nicht haben, um jedes vertex an der Grafikkarte, die wird viel schneller sein.
Mein Java-Beispiel
InformationsquelleAutor HahaHortness
Wenn wir Ihrem Beispiel können wir die Verwendung einer internen radius 1 und Anwendung horizontaler/vertikaler radius getrennt, um die ellipse:
InformationsquelleAutor Tyler Wright
Wenn die ellipse ((x-cx)/a)^2 + ((y-cy)/b)^2 = 1 ist, dann ändern Sie die glVertex2f Aufruf
glVertext2d(a*x + cx, b*y + cy);
Zur Vereinfachung der Beträge lässt vermuten, dass sich die ellipse ist zentriert am Ursprung.
Wenn die ellipse gedreht ist, so dass die semi-major axis (der Länge a) einen Winkel theta mit der x-Achse, dann die ellipse ist die Menge aller Punkte p so dass p' * inv(C) * p = 1, wo C ist die matrix R(theta) * D * R(theta)' wo ' bedeutet transponieren und D ist die Diagonale matrix mit den Einträgen a*a,b*b (b ist die Länge des semi-minor axis). Wenn L der cholesky-Faktor (zB hier) von C, dann die ellipse ist die Menge aller Punkte p so dass (inv(L) * p)'*(inv(L) *p ) = 1, so dass L Karten der Einheit Kreis auf der ellipse. Wenn wir das berechnet haben L ( u 0 ; v-w) (nur einmal vor der Schleife), dann die glVertexf Anruf wird glVertex2f( u*x + cx v*x + w*y + cy);
L kann berechnet werden, wie hier (wobei C cos(theta) und S-sin(theta)):
u = sqrt( C*C*a*a + S*S*b*b); v = C*S*(a*a-b*b); B = a*b/u;
InformationsquelleAutor dmuir