|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Kluchnikov Eugene 2:5003/39.64 21 Dec 2001 16:39:54 To : Michael Ryazanov Subject : Формула окружности -------------------------------------------------------------------------------- AM>>> Кстати, а существует ли алгоритм построения эллипсов (т.е. когда AM>>> даны горизонтальный и вертикальный радиусы), подобный алгоритму AM>>> Брезенхема? MR> А как с произвольными осями (т.е. не параллельными осям координат) MR> рисовать? Тут сложнее. Пусть a*y=b*x - ось u=a*y-b*x v - перпендикулярна u => v=b*y+a*x Запишем уравнение эллипса в новых координатах u^2/c^2+v^2/d^2=1 u^2*d^2+v^2*c^2=c^2*d^2 Подставим x и y (a*y-b*x)^2*d^2+(b*y+a*x)^2*c^2=t0 a^2*d^2*y^2-2*a*b*d^2*x*y+b^2*d^2*x^2+b^2*c^2*y^2+2*a*b*c^2*x*y+a^2*c^2*x^2=t Теперь зададим начальные x,y. Hапример при u=-d v=0. Для начала помним, что движемся в сторону возрастания u.(То есть a*dy-b*dx>=0) Для каждой точки проверяем восемь вариантов перехода, и выбираем тот, что в сторону увеличения u, при этом |t-t0| минимален. Для каждого из восьми вариантов пути можно по формуле вывести dt(x,y). Если не ошибаюсь, то можно хранить dt1,...dt8, и при каждом изменении координат их обновлять, а так как dx и dy <=1, то в зависимости от направления движения к ним прозводится прибавление констант и динамических добавок (которые на каждом ходу изменяются на константу). Вот после этого надо идти в сторону уменьшения u, но с такой миникоррекцией начальных координат, что пройдем по другой ветке. PS: Если все учесть, то проще завести в памяти таблицу синусов, и рисовать по небольшим отрезкам. _WBR_, _/*Eustas*/_. --- Shadow of Warrior * Origin: My life for Aiur (2:5003/39.64) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33763c233427.html, оценка из 5, голосов 10
|