Если эллипс равен ((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;