Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Комбинированный алгоритм Кузьмина, обсуждение и исправление 
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, отсюда и ошибка растеризации.

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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
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.0432 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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