1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| Pautina |
12.09.2007 13:24
Сообщение
#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 - 14.09.2007 11:15 |
![]() ![]() |
| Lapp |
6.10.2007 6:48
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 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 Графика 12.09.2007 13:24
Pautina Помогите пожалуйста! на вас одна надежда! ... 14.09.2007 11:16
Pautina Добилась того, что программа рисует треугольник, а... 25.09.2007 17:14
Lapp
Координаты точек пересечения отрезков со сторонам... 5.10.2007 12:55
hardcase Какая графическая библиотека? 25.09.2007 17:32
Pautina Графический модуль graph.bgi 1.10.2007 21:50
Pautina УДАЛИТЕ МОЮ ТЕМУ!!!!!!... 3.10.2007 12:45
Pautina Lapp , спасибо огромное! все-таки мир не без д... 5.10.2007 21:27
Lapp
У меня вот какие соображения..
...
Посмотри, пож... 5.10.2007 23:09
Tan Pautina, так если ваша цель просто закрасить треуг... 6.10.2007 0:25
Lapp
Pautina, так если ваша цель просто закрасить треу... 6.10.2007 5:35
Pautina Lapp, спасибо огромное за помощь. Скажи, а как мн... 16.10.2007 20:07
Lapp Во-первых, не забывай, что ты ищешь минимальный Y,... 17.10.2007 7:09![]() ![]() |
|
Текстовая версия | 9.12.2025 3:09 |