Графика, Заливка треугольника одним цветом |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Графика, Заливка треугольника одним цветом |
Pautina |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
Помогите, пожалуйста, с решением данной задачи!
рис1 Из рисунка1 следует, что изображение треугольника на экране – это набор горизонтальных отрезков оси абсцисс, при чем каждой строке экрана соответствует один отрезок, проведенный между точками пересечения отрезков со сторонами треугольника AB и AC, затем BC и AC. Составим математическую модель. Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам: X = Ax + (Bx – Ax) / (By – Ay) * (By – Ay) X2 (1) = Ay + (Sy – Ay) / (Bx – Ax) / (By – Ay) X1 = Ax + (Sy – Ay) * (Cx – Ax) / (By – Ay) X2 (2) = Bx + (Sy – By) * (Cx – Bx) / (Cy – By) Далее приведем словесное описание алгоритма будущей программы. рис2 После проведения сортировки координат вершин данного треугольника необходимо организовать цикл, обеспечивающий рисование линий для ординаты Y, которая изменяется от Ymin до Ymax. В теле цикла необходимо определить координаты точек X1 и X2 и затем провести между ними линию заданного цвета. Сообщение отредактировано: Pautina - |
Pautina |
Сообщение
#2
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
Помогите пожалуйста! на вас одна надежда! Заранее огромное спасибо!
|
Pautina |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
Добилась того, что программа рисует треугольник, а вот с закраской возникли проблемы и еще не совсем понимаю, как использовать формулы
Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам: X = Ax + (Bx – Ax) / (By – Ay) * (By – Ay) X2 (1) = Ay + (Sy – Ay) / (Bx – Ax) / (By – Ay) X1 = Ax + (Sy – Ay) * (Cx – Ax) / (By – Ay) X2 (2) = Bx + (Sy – By) * (Cx – Bx) / (Cy – By) Помогите, пожалуйста советом! Прикрепленные файлы TREYG.PAS ( 452 байт ) Кол-во скачиваний: 248 |
hardcase |
Сообщение
#4
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Какая графическая библиотека?
-------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Pautina |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
Графический модуль graph.bgi
|
Pautina |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
УДАЛИТЕ МОЮ ТЕМУ!!!!!!!!!!!!!!! РАЗ НИКТО НЕ МОЖЕТ ПОМОЧЬ МНЕ!!!!!!!!!!!!
|
Lapp |
Сообщение
#7
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам: X = Ax + (Bx – Ax) / (By – Ay) * (By – Ay) X2 (1) = Ay + (Sy – Ay) / (Bx – Ax) / (By – Ay) X1 = Ax + (Sy – Ay) * (Cx – Ax) / (By – Ay) X2 (2) = Bx + (Sy – By) * (Cx – Bx) / (Cy – By) Pautina, не сердись, все будет Ок, разберемся. Я пока не понимаю твои формулы.. Смотри, например, первая. В правой части стоят только координаты вершин треугольника - верно? Тогда что это за Х? Зачем он такой нужен?.. Он же не имеет отношения к отрезку.. И он, вроде, не участвует в последующих вычислениях.. И еще - что такое Sy? На рисунке нету точки S.. Формулы должны делать зависимость между Y (уровень отрезка) и координатами его концов X1 и Х2.. Хлоп! а, понял.. Sy - это и есть уровень, о котором я говорил, да? Но все равно остается вопрос, что есть Х в первой формуле. Что-то я не врубаюсь.. наверное, долго отдыхал . Ответь, плз. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Pautina |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
|
Lapp |
Сообщение
#9
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
У меня вот какие соображения.. ... Посмотри, пожалуйста, как на твой взгляд - правильно это или нет.. После беглого взгляда могу сказать только одно: ошибки есть.. Более детально постараюсь к утру. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Tan |
Сообщение
#10
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Pautina, так если ваша цель просто закрасить треугольник, то почему бы не воспользоваться floodfill при условии, что мы знаем одну из точек внутри него и цвет границы? Или всё, что описано в 1м посте это строго задание ? Просто мне показалось, что это личные размышления
Сообщение отредактировано: Tan - -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Lapp |
Сообщение
#11
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Pautina, так если ваша цель просто закрасить треугольник, то почему бы не воспользоваться floodfill при условии, что мы знаем одну из точек внутри него и цвет границы? Или всё, что описано в 1м посте это строго задание ? Просто мне показалось, что это личные размышления По всей видимости, это все же и есть условие . Кстати, Pautina, я думаю, что если бы ты подчеркнула, что тебе нужно не просто заполнить треугольник, но реализовать алгоритм заполнения, то тебе, возможно, не пришлось бы прибегать к крайним мерам и упрекам. Народ просто тебя не понял, и, ты уж извини - виновата ты сама. Согласна? У меня у самого были некоторые сомнения, но последний пост Наташи меня убедил (там написано, что формулы даны). Народ, еще не поздно подключиться - помогайте! -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
Сообщение
#12
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Итак, по делу..
Ты извини, но мне было проще привести свое решение с нуля. Попробуй с ним разобраться - ладно? Спрашивай, если что неясно. Сначала рассмотрим рисунок: Принципиально различных случая я вижу два (возможную параллельность сторон осям координат пока не рассматриваем): синий и зеленый. Процесс заполнения также делится на две стадии: красную (от А до первой встреченной по У вершины) и рыжий (остальное). 1. Сначала находим вершину с минимальным Y и называем ее А. 2. Затем две оставшиеся упорядочиваем по Х: В и С, Вх<Cx. 3. Находим минимум и максимум из чисел Ву и Су и запоминаем их соответственно в переменных d и е. 4. Проходим по Y от Ау до d, вычисляя х1 и х2 исходя из пересечения линии на уровне у, параллельной оси Х, и соответствующего отрезка. 5. То же самое, что и 4, но для других отрезков, от d до е. Формулы будут такие.. Дано: y. Найти х1 и х2. Синий случай: Красная фаза: x1 = Ax+(Bx-Ax)*(y-Ay)/(By-Ay) Рыжая фаза: x1 = Bx+(Cx-Bx)*(y-By)/(Cy-By) х2 в обеих фазах одинаковый: x2 = Ax+(Cx-Ax)*(y-Ay)/(Cy-Ay) Зеленый случай: х1 в обеих фазах одинаковый: x1 = Ax+(Bx-Ax)*(y-Ay)/(By-Ay) Красная фаза: x2 = Ax+(Сx-Ax)*(y-Ay)/(Сy-Ay) Рыжая фаза: x2 = Cx+(Bx-Cx)*(y-Cy)/(By-Cy) Эти формулы выведены из простых соотношений пропорции, исходя из подобия треугольников. Они однотипны, и при кодировании можно достичь немалой экономии, если использовать функции. Теперь достаточно сделать два цикла: один от Ах до d, второй от d до е (или один цикл от Ах до е с проверкой условия), где собственно и отрисовываем отрезки. Случаи, когда равны нулю знаменатели в формулах (стороны параллельны оси Х), нужно рассмотреть отдельно. Фактически это означает выпадение красной или рыжей фазы (или обеих). Вроде, все.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Pautina |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: 0 |
Lapp, спасибо огромное за помощь. Скажи, а как мне после нахождения вершины с минимальным y
a1:=random(640); упорядочить остальные вершины по x? |
Lapp |
Сообщение
#14
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Во-первых, не забывай, что ты ищешь минимальный Y, а не максимальный. Так что знаки неравенств надо поменять.
При упорядочивании нужно перекладывать координаты (и X, и Y) через буфер:
Эту операцию нужно проделать с парами точек 2 и 3 (как в приведенном фрагменте), потом 1 и 2, а потом снова 2 и 3. Хочешь мои соображения "на тему"? Странно, что ты х и у обозначила как a и b. И вообще, грамотнее было бы работать с массивами и записями, а не с отдельными переменными. Так получится яснее и проще. Конечно, в такой простой программе и так сойдет, но я бы все же рекомендовал. Прирно так: - сделать отдельный тип для точки - треугольник представлять как массив такого типа. type Тогда, например, перекладывание выглядело бы проще:
А если сделать для этого процедурку - то и того проще.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 26.04.2024 5:38 |