Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Комбинированный алгоритм Кузьмина, обсуждение и исправление 
V
    Опции темы
GremlinProg
Дата 26.7.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Я предлагаю обсудить реализацию алгоритма, описанного здесь: http://fit.com.ru/Surveys/Course/Lecture_02_Part_2.doc
(суть находится в самом конце дока)

Описано сухо, поэтому поясню его со своей точки зрения.

По сути, это модернизация всем известного алгоритма Брезенхема построения растра линии. Разница лишь в том, что здесь решается маленькая проблемка такого построения при отсечении отрезка прямоугольником: если вычислить координаты отрезка, например, с помощью отсечения Сазерленда-Кохена и построить его по Брезенхему, то на различных прямоугольниках, эта линия будет рисоваться по-разному. Проблема заключается в том, что при построении полной, неотсеченной версии, координаты отсеченного отрезка не всегда будут находиться на прямой Брезенхема, то же самое касается и начальной ошибки e = 2 * dy - dx, отсюда и ошибка растеризации.

Кузьмин предложил более точный способ: вычислять растр, используя параметры полной, неотсеченой версии, но опираясь на координаты отсеченного прямоугольником отрезка: он находит начальные значения для итераций Брезенхема, это  и e0 (начальная ошибка).

Работает нормально, но не учитывается ситуация, когда при вычислении  в горизонтальном случае, она выпадает из прямоугольного отсечения, то же самое в вертикальном случае, когда точно так же выпадает . Если использовать для коррекции итеративные способы, то теряется смысл ускорения Кузьмина (в некоторых случаях, после коррекции, ни один пиксель линии бывает вообще не виден). Вот эту ситуацию и необходимо поправить, естественно, если найдутся умы пересчитать формулу, и позволят не проверять координаты кузьмина дополнительно, это будет большой плюс.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 31.7.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Все, проблема решена, был недочет в горизонтальном случае, необходимо все же учитывать погрешность при делении, ну и отсечение Сазерленда-Кохена (да и любое другое) порой отсекало видимые фрагменты линии брезенхема, слил три алгоритма в один, расширил его для всех четвертей, получилось неплохо, единственное замечание, конечную точку тоже необходимо просчитывать по Кузьмину, чтобы не терять ни одного пиксела. 

В целом, работает алгоритм, конечно немного медленнее, чем чистый Брезенхем, но точно, теперь действительно можно одновременно и отсекать и рисовать без потери качества.

Поскольку алгоритм отсечения FC (Fast Clipping) Собкова-Поспишила-Янга, с кодированием линий на сегодня самый быстрый для x86, то есть смысл в тройке [Сазерленда-Кохена -> Кузьмин -> Брезенхем] заменить им первый.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 16.8.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Забыл отметить еще одну деталь. При определении горизонтального или вертикального случая, с помощью векторного произведения, очень часто возникала проблема выхода координаты за пределы прямоугольника, я её решил простой тупой проверкой сазерланда, т.е. вычисляю код после опеределения координаты, а затем, если точка не входит в прямоугольник, пересчитываю координаты. Работает всегда, т. е. если не корректен горизонтальный случай, то корректен вертикальный и наоборот. По крайней мере, сбоев пока не обнаружено, но в ухдшем случае, для одной точки приходится расчитывать оба варианта.

демо-пример в приложении.

отрезок и прямоугольник можно перемещать мышью: левой - конечные точки , правой - отсечение.
красный - брезенхем,
зеленый - кузьмин.

PS: если проделать то же самое только брезенхемом, за зеленым будет мелькать красный при изменении угла

Это сообщение отредактировал(а) GremlinProg - 30.5.2008, 02:22

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Kuzmin.rar 28,35 Kb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 23.8.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



открытым текстом исходник не выкладываю, слишком много,
прикрепил во вложении

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

с тех пор я разработал еще две вариации на тему Кузьмина:

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

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

как руки дойдут, найду, выложу

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Kuzmin.cpp 18,41 Kb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
fsmoke
Дата 23.8.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



Огромное спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.