Посоветуйте книги по графике...

Тема в разделе "WASM.BOOKS и WASM.BLOGS", создана пользователем _Serega_, 5 янв 2007.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    masquer
    для начала хотя бы прочти дано: "векторный круг (заливка без контура)..."
    Окружность заданной толщины песня отдельная :))
    Ты исходил из того чтобы каждую точку "быстро" проверять на попадание в экран, а оптимизация заключается в том чтобы свести количество таких проверок к минимуму и рисовать нужные участки с полной уверенностью, что они в экране, не тратя время на проверку каждого пикселя ;) .
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Есть еще книжки.
    Graphics_Gems_1,ed_A.Glassner.pdf
    Graphics_Gems_2,ed_J.Arvo.pdf
    Graphics_Gems_3,ed_D.Kirk.pdf
    Там много чего расписанно.

    Y_Mur
    Хочешь код? Пусть будет код.
    Вот достаточно быстро рисуется под ДОС 320X200 на 256 цветов
    10 000 окружностей за пару секунд рисуется проц. 2400МГЦ.
    Windows GDI рисует примерно с такой же скоростью.
    Мерил на глазок на Си код работает быстрее раза в 4, но вверху и внизу видны артефакты, в паскале их нет(не замечал). Почему не знаю писал без дебагера.
    PS. Если кто знает, как исправить напишите личное сообщение.
    PPS. Винда отсечет, но всеже лучше отбросить лишее используя дерья BPS или 4-ричные или 8-ричные деревья.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Pavia
    Ага самое оно - про что и говорил - куча проверок внутри цикла :)))
    Оптимизированный алгоритм:
    1. Проверка на полное попадание круга в экран
    действие: рисуем без проверок
    2. Проверка на малый радиус
    действие: установка пиксела\крестика\и т.п.
    3. Проверка на полное попадание экрана в круг
    действие: сплошная заливка экрана
    (кстати формулы такой проверки сходу сообразишь? - мне помедитировать потребовалось ;)
    4. Проверка на обрезку только сверху\снизу
    действие: коррекция Y диапазона, дальше как в 1
    5. Наличие обрезки слева\справа
    действие: найти точки пересечения окружности с границами экрана, разбить горизонтальными хордами, проходящими через эти точки и либо рисовать диапазон по Y без проверки, либо заливать блок строк целиком, либо заливать с ограничением с одной строны (опять таки без внутрицикловых проверок).
    При реализации 5 не хилое деревце вырастает ;) и не все проверки сходу сообразишь - приходится карандашиком порисовать ;)
    И это всего лишь круг - фигура простейшая...
    А ты говоришь - всё в графике очевидно и писать не о чем.


    Ух-ты а гугл на Graphics_Gems_1,ed_A.Glassner.pdf любопытную коллекцию вывалил, правда с регистрацией они что-то перемудрили :dntknw:
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Y_Mur
    Я и не писал что это самый быстрый. Разумеется можно проверить.
    1. if (((xc>=+r)&&(xc<Width-r)&&(yc>=+r)&&(yc<Hight-r)))
    3. Тут просто если все точки внутри круга. Проверяется как длина от центра круга до точки экране меньше радиуса.
    4. Есть у меня проверка на наличие обрезку только сверху\снизу.
    5. Есть у меня проверка на наличие обрезки слева\справа. Правда с ошибкой была, ошибку исправил, приведением типов.

    Думаю что 1 и 3 пункты можно добавить.

    Да, проверок внутри цикла куча. Но это вспомогательный цикл, он служит для просчета боковых точек, а заливка идет без проверок. =)
    Ты предлагаешь вынести проверки из цикла. Думается, что прирост будет, но алгоритм через чур усложниться. А усложнение алгоритма не всегда приводит к желаемому результату. Нужно пробовать.

    Сам попробуй сделать быстрее. :derisive:

    PS. Вот архив, исправил ошибку с артефактами.