Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Алгоритмы и теория программирования


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Роман Селиверстов
Статус: Советник
Рейтинг: 4749
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2498
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2310
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Алгоритмы и теория программирования

Номер выпуска:160
Дата выхода:19.05.2012, 15:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:171 / 83
Вопросов / ответов:1 / 1

Консультация # 186055: Здравствуйте, уважаемые эксперты. Постигая азы компьютерной графики столкнулся с такой проблемой: Существует алгоритм закраски многоугольника, как раз с этим алгоритмом, точнее с его реализацией и возникли трудности. Я написал программу, которая, по идее, должна закрасить треугольник, но она некорректно работает. Если я правльно разобр...


Консультация # 186055:

Здравствуйте, уважаемые эксперты. Постигая азы компьютерной графики столкнулся с такой проблемой:
Существует алгоритм закраски многоугольника, как раз с этим алгоритмом, точнее с его реализацией и возникли трудности.
Я написал программу, которая, по идее, должна закрасить треугольник, но она некорректно работает.

Если я правльно разобрался, то алгоритм состоит из 3 шагов: на первом шаге ищутся точки пересечения сканирующей строки с ребрами, причем, как я понял можно искать точки пересечения сначала для первого ребра, потом для второго и т.д. ( как написано в книге Роджерса "Алгоритмечесие основы растровой графики" или Иванова и соавт. "алгоритмические основы растровой машинной графики" ), а можно найти точки пересечения сканирующей строки сразу со всеми ребрами ( что и рекомендует сделать Сиденко "Компьютерная графика и геометрическое моделирование" и Порев "Компьютерная графика" ). Я выбрал первый вариант, а чтоб у ж было совсем просто отслеживать шаги выполнения программы, то в качестве многоугольника выбрал прямоугольный треугольник. И для каждого ребра занес х-координаты точек пересечения в массив.
На 2 шаге отсорировал массив, содержащий координаты точек в неубывающем порядке.
Ну, а на 3 шаге, вывел координаты тех линий, которые, по идее, должны закрасить треугольник. Разумеется координаты не верны.
С одной стороны, если создать два массива и заносить в первый массив х-координаты пересечения сканирующей строки с первым ребром, а во второй со вторым, а потом на 3 шаге выводить линию, взяв первую х-координату из первого массива, а второй х-координту из второго массива, то программа работает корректно, для данного случая, но ведь это не выход, ибо, если, скажем, будет 10 ребер, то в функцию надо будет дописать 10 массивов...
С другой стороны, что-то мне подсазыват, что надо использовать двумерный массив, который и будет являться той самой таблицей ребер, где в строке будет находиться y-координата сканирующей строки, а в столбце - x-координаты пересечения данной сканирующей строки с ребрами, но ведь двумерный массив необходимо инициализировать заранее, что весьма трудно, так как неизвестно число сканирующих строк...

Собственно мой вопрос в следующем: как мне реализовать таблицу ребер. Заранее спасибо.

Дата отправки: 16.05.2012, 14:20
Вопрос задал: Александр (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует coremaster1 (Профессор):

Здравствуйте, Александр!
Ваша ошибка в том, что вы пытаетесь сохранять координаты точек пересечения ребер и сканирующей линии. Этого не нужно делать.
Могу предложить такой вариант алгоритма заполнения:
1) Сформировать массив все рёбер многоугольника. Как я понял на вход подаётся N точек, значит должен получиться массив из N пар точек.
2) Найти минимальную и максимальную Y-координату фигуры. Это будет диапазон прохода горизонтальной скан-линии.
3) Для каждой скан-линии найти точки пересечения со всеми рёбрами. В случае выпуклого многоугольника должно получиться ровно две таких точки. Провести линию от левой точки до правой.

Для оптимизации поиска можно отсортировать массив рёбер по Y-координате.

Желаю успехов smile

Консультировал: coremaster1 (Профессор)
Дата отправки: 18.05.2012, 14:35
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное