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)