![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Pautina |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: ![]() ![]() ![]() |
Помогите, пожалуйста, с решением данной задачи!
рис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 |
![]() ![]() |
Pautina |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: ![]() ![]() ![]() |
Помогите пожалуйста! на вас одна надежда! Заранее огромное спасибо!
|
Pautina |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: ![]() ![]() ![]() |
Добилась того, что программа рисует треугольник, а вот с закраской возникли проблемы и еще не совсем понимаю, как использовать формулы
Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам: 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) Помогите, пожалуйста советом! Прикрепленные файлы ![]() |
hardcase |
![]()
Сообщение
#4
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
Какая графическая библиотека?
-------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Pautina |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: ![]() ![]() ![]() |
Графический модуль graph.bgi
|
Pautina |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Nataly Репутация: ![]() ![]() ![]() |
УДАЛИТЕ МОЮ ТЕМУ!!!!!!!!!!!!!!! РАЗ НИКТО НЕ МОЖЕТ ПОМОЧЬ МНЕ!!!!!!!!!!!!
|
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам: 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 Репутация: ![]() ![]() ![]() |
Lapp , спасибо огромное! все-таки мир не без добрых людей! :-)
Я, если честно, сама до конца не понимаю для чего даны эти формулы.. У меня вот какие соображения.. ![]() Посмотри, пожалуйста, как на твой взгляд - правильно это или нет.. ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!! Сообщение отредактировано: Pautina - 5.10.2007 21:29 |
Lapp |
![]()
Сообщение
#9
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
У меня вот какие соображения.. ... Посмотри, пожалуйста, как на твой взгляд - правильно это или нет.. После беглого взгляда могу сказать только одно: ошибки есть.. Более детально постараюсь к утру. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Tan |
![]()
Сообщение
#10
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: ![]() ![]() ![]() |
Pautina, так если ваша цель просто закрасить треугольник, то почему бы не воспользоваться floodfill при условии, что мы знаем одну из точек внутри него и цвет границы? Или всё, что описано в 1м посте это строго задание ? Просто мне показалось, что это личные размышления
![]() Сообщение отредактировано: Tan - 6.10.2007 0:26 -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Lapp |
![]()
Сообщение
#11
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Pautina, так если ваша цель просто закрасить треугольник, то почему бы не воспользоваться floodfill при условии, что мы знаем одну из точек внутри него и цвет границы? Или всё, что описано в 1м посте это строго задание ? Просто мне показалось, что это личные размышления ![]() По всей видимости, это все же и есть условие ![]() Народ, еще не поздно подключиться - помогайте! ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
![]()
Сообщение
#12
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Итак, по делу..
Ты извини, но мне было проще привести свое решение с нуля. Попробуй с ним разобраться - ладно? Спрашивай, если что неясно. Сначала рассмотрим рисунок: ![]() Принципиально различных случая я вижу два (возможную параллельность сторон осям координат пока не рассматриваем): синий и зеленый. Процесс заполнения также делится на две стадии: красную (от А до первой встреченной по У вершины) и рыжий (остальное). 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 Репутация: ![]() ![]() ![]() |
Lapp, спасибо огромное за помощь. Скажи, а как мне после нахождения вершины с минимальным y
a1:=random(640); упорядочить остальные вершины по x? |
Lapp |
![]()
Сообщение
#14
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Во-первых, не забывай, что ты ищешь минимальный Y, а не максимальный. Так что знаки неравенств надо поменять.
При упорядочивании нужно перекладывать координаты (и X, и Y) через буфер:
Эту операцию нужно проделать с парами точек 2 и 3 (как в приведенном фрагменте), потом 1 и 2, а потом снова 2 и 3. Хочешь мои соображения "на тему"? ![]() Странно, что ты х и у обозначила как a и b. И вообще, грамотнее было бы работать с массивами и записями, а не с отдельными переменными. Так получится яснее и проще. Конечно, в такой простой программе и так сойдет, но я бы все же рекомендовал. Прирно так: - сделать отдельный тип для точки - треугольник представлять как массив такого типа. type Тогда, например, перекладывание выглядело бы проще:
А если сделать для этого процедурку - то и того проще.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 0:36 |