Эффективный способ рисовать эллипс с OpenGL или D3D - PullRequest
1 голос
/ 04 мая 2011

Существует быстрый способ рисования круга, подобного этому

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(); 
}

Мне интересно, существует ли аналогичный способ рисования эллипса, где известны вектор и размер его большой / малой осей.

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

В openGL нет способа нарисовать кривую, просто много прямых линий. Но если вы использовали объекты буфера вершин, вам не придется отправлять каждую вершину на видеокарту, что будет намного быстрее.

Мой пример Java

2 голосов
/ 12 января 2016

Если мы возьмем ваш пример, мы можем использовать внутренний радиус 1 и применить горизонтальный / вертикальный радиус отдельно, чтобы получить эллипс:

void DrawEllipse(float cx, float cy, float rx, float ry, 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 = 1;//we start at angle = 0 
    float y = 0; 

    glBegin(GL_LINE_LOOP); 
    for(int ii = 0; ii < num_segments; ii++) 
    { 
        //apply radius and offset
        glVertex2f(x * rx + cx, y * ry + cy);//output vertex 

        //apply the rotation matrix
        t = x;
        x = c * x - s * y;
        y = s * t + c * y;
    } 
    glEnd(); 
}
1 голос
/ 04 мая 2011

Если эллипс равен ((x-cx) / a) ^ 2 + ((y-cy) / b) ^ 2 = 1, тогда измените вызов glVertex2f на glVertext2d (a * x + cx, b * y + cy);

Чтобы упростить суммы, давайте на некоторое время предположим, что эллипс центрирован в начале координат.

Если эллипс вращается так, что большая полуось (длины a) образует угол тета с осью x, то эллипс - это множество точек p, так что p '* inv (C) * p = 1, где C - матрица R (тета) * D * R (тета) «где» обозначает транспонирование, а D - диагональная матрица с элементами a * a, b * b (b - длина полуосновной оси). Если L - коэффициент Холецкого (например, здесь ) C, то эллипс - это множество точек p, так что (inv (L) * p) '* (inv (L) * p) = 1, так что L отображает единичный круг на эллипс. Если мы вычислили L как (u 0; v w) (только один раз, перед циклом), то вызов glVertexf становится glVertex2f (u * x + cx, v * x + w * y + cy);

L можно рассчитать следующим образом (где C - это cos (тета), а S - это грех (тета)):

u = sqrt (C * C * a * a + S * S * b * b); v = C * S * (a * a-b * b); w = a * b / u;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...