Re: Эллипс

From
Dmitriy Krylov ()
To
Andrei Novikov
Date
2002-10-07T18:25:40Z
Area
RU.ALGORITHMS
From: "Dmitriy Krylov" <krylov@mail.primorye.ru>

Привет, Andrei!
Вы писали to Dmitriy K. on Mon, 30 Sep 2002 19:34:24 +0400:

 DK>> Ну если есть способ построения эллипса, то
 DK>> повернутый/растянутый/сдвинутый/отраженный эллипсы можно построить,
 DK>> используя матрицу 2D-преобразований, каковая порождается парой
 DK>> синусов, косинусов, умножений, сложений один раз (затем
 DK>> используется для всех точек эллипса).

 AN> Можно подpобнее и с пpостеньким пpимеpом?

Есть такая штука - преобразование координат. Она 3*3 - для 2D, 4*4 для 3D.
Вот общее представление матрицы для 2D:

    | a b e  |
M = | c d f  |
    | 0 0 1* |

* Единичка используется для масштабирования. Часто её вообще отбрасывают,
используя первые
  две строчки матрицы

Допустим, есть точка с координатами p = (x, y). Применяя преобразование
получаем точку
p' = (x', y'), где:

x' = a * x + b * y + e
y' = c * x + d * y + f

Проще говоря, новая точка получается из старой умножением вектора p на
матрицу M.


Далее. Конкретно поворот точки отностительно начала координат задается так:

| cos(a)  -sin(a) 0 |
| sin(a)   cos(a) 0 |
| 0        0      1 |

Т.е. нужно всего лишь вычислить синус и косинус.

Сдвиг - тем же макаром. Комбинация преобразований достигается умножением
матриц в порядке преобразований. Т.о., для поворота эллипса потребуется
примерно такие преобразования: сдвинуть точки эллипса к началу координат,
повернуть, сдвинуть обратно. Полученные матрицы преобразований
переменожить - получится одна матрица, которой и пользоваться для поворота.

Но! То, что я написал, касается точек. Т.е. для получения повернутого
эллипса нужно прогнать его точки через матрицу преобразований (одну и ту же
для каждой точки).

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

Ну, не знаю, что еще добавить...


 AN> Если я пpавильно понял твою идею (а это, похоже, не так), то мы
 AN> "заpаботаем"
 AN> как минимyм два yмножения на точкy, а как максимyм - дикyю
 AN> погpешность пpи аппpоксимации.

Не получим. __Накопления__ погрешностей при самом преобразовании не будет.
Погрешность будет только при (однократном) расчете матрицы и при прогоне
каждой точки через матрицу. Если тебе нужно эллипс рисовать на современных
экранах, то не думаю, что погрешность как-то будет заметна.

Удачи!
__________________________________________________
--{ Dmitriy Krylov aka "Abulafia"   }-------------
--{ mailto: krylov@mail.primorye.ru }-------------


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)