Пред.
След.
Макеты страниц
Распознанный текст, спецсимволы и формулы могут содержать ошибки, поэтому с корректным вариантом рекомендуем ознакомиться на отсканированных изображениях учебника выше Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике ДЛЯ СТУДЕНТОВ И ШКОЛЬНИКОВ ЕСТЬ
ZADANIA.TO
5.4. ПОЛИГОНЫ И ПИКСЕЛЫУлучшим теперь программу HIDLIN из параграфа 5.3 с целью повышения удобства для пользователя и увеличения эффективности. Дадим возможность пользователю определить грани объекта в виде полигонов, а программа сама будет
Рис. 5.10. Результат работы программы HIDUN преобразовывать эти полигоны в треугольники. Тогда список отрезков будет не длиннее, чем если бы они задавались отдельно как ребра полигонов, что обычно имеет место. В качестве примера рассмотрим объемную букву А, изображенную на рис. 5.11. Передняя и задняя грани не являются в полном смысле полигонами, поскольку содержат треугольные отверстия. Все остальные грани представляются в виде прямоугольников. Вершины на передней грани имеют номера от 0 до 9. Увеличение каждого номера на 10 приводит к получению номеров соответствующих вершин Задней грани. Во входном файле для нашей новой программы переднюю грань можно описать следующим образом:
Знак минус между обозначениями двух вершин 6 -9 и 9 -6 означает, что эта последовательность определяет невычерчиваемый отрезок. Такие последовательности служат только в качестве средства описания области на передней грани. Штриховая линия между точками 6 и 9 на рис. 5.11 может рассматриваться как два совпадающих ребра полигона. Передняя грань на рис. 5.11 будет получена, если расстояние
Рис. 5.11. Объемная буква А другая пара точек для соединения внешней и внутренней границ (только следует иметь в виду, что нельзя записать -0, поскольку такая запись не представляет отрицательного числа). Вершины должны быть перечислены в порядке обхода против часовой стрелки, за исключением внутренних частей, которые обходятся по часовой стрелке. Общее правило заключается в следующем. Если обходим все ребра от вершины к вершине в перечисленном порядке, каждый раз глядя в направлении следующей вершины, то определяемая область должна находиться с левой стороны. Вот почему за обозначением -9 в вышеприведенной последовательности следует номер 8. Если на рис. 5.11 будем двигаться от вершины 9 к вершине 8, глядя на вершину 8, то “тело” буквы А будет находиться слева от нас. Заметим, что входная последовательность интерпретируется циклически и конечная вершина (6) соединяется с первой вершиной (0).
Рис. 5.12. Полигон Потребуем, чтобы первые три вершины образовывали выпуклый угол. Например, из рис, 5.11 видно, что перечень
в начале последовательности будет неподходящим, а перечень
может быть приемлемым. За последней вершиной каждой последовательности должен немедленно следовать символ Такое соглашение позволяет использовать несколько входных строк для описания одной последовательности, что дает возможность задавать полигоны с очень большим числом вершин. Если последовательность содержит только две вершины, то она интерпретируется как отдельный отрезок прямой линии. Это свойство будет использовано, например, для вычерчивания координатных осей, как на рис. 5.10. Как и ранее, файл начинается с координат
центральной точки О, которая будет использована в качестве нового начала системы координат. Также потребуются сферические
(см. скан) Программа, которую предстоит разработать, будет гораздо удобнее программы HIDLIN из параграфа 5.3, поскольку вместо треугольника и отрезков прямых теперь можно будет задавать грани объекта со сложной формой. Однако это не единственное усовершенствование. В программе HIDLIN мы имели набор треугольников. Видимость каждого отрезка проверялась относительно каждого треугольника. Поэтому при повышении сложности объекта, например, оба списка удлиняются в два раза, затраты вычислительного времени возрастают в четыре раза. Будем говорить, что программа HIDLIN имеет квадратичную сложно Для сложных объектов наша новая программа будет работать значительно быстрее программы HIDLIN. Как и ранее, будем иметь набор отрезков и набор треугольников, но видимость каждого данного отрезка теперь будет проверяться только относительно части набора треугольников. Например, отрезок
Рис. 5.13. Приборно-независимые пикселы Такой элементарный прямоугольник назовем получены при Повышение эффективности основано на идее формирования списков треугольников для каждого пиксела. Такой список пикселов содержит только те треугольники, которые частично или полностью покрывают пиксел. Треугольник ABC на рис. 5.13 будет занесен в списки только для заштрихованных пикселов из колонок 5, 6, 7. Как и в программе После того, как будут сформированы все пикселные списки, можно начать вычерчивание отрезков прямых линий. Для каждого отрезка PQ начнем с построения наборов всех треугольников, ассоциированных с пикселами, содержащими точки отрезка В параграфе 5.3 координаты области вывода вычислялись не программой Экранные координаты всех точек объектов должны быть вычислены как можно раньше, чтобы обеспечить возможность вычисления их минимальных и максимальных значений (см. скан)
Затем можно вычислить видовые координаты
Интересно сравнить эти две формулы с параграфом 4.3, где утверждалось, что коэффициент масштабирования есть просто расстояние Координаты точек в области вывода будут использоваться только при вызовах действительных “команд черчения”, то есть в обращениях к функциям move и
Теоретически горизонтальный размер пиксела равен
(Скоро мы увидим, что практически полезно несколько скорректировать это уравнение.) Тогда число
до целого числа. Результат вычисления по этой формуле имеет неприятное следствие, которое заключается в том, что значение рационально, и поэтому будем настаивать на применении только
Каждый раз при необходимости определить пиксел, ассоциированный с точкой (
Заметим, что отсечение дробной части в языке Си выполняется неявно при любом присвоении значения с плавающей точкой целочисленной переменной. Поэтому вполне достаточно объявить тип Может также потребоваться и обратная операция
Так будет найдено значение X, соответствующее левой границе колонки пикселов с номером
Посмотрим теперь, как можно использовать пикселы для хранения информации о треугольниках, с которыми они ассоциированы. Будем использовать линейный список узлов, а каждый узел содержит номер треугольника Ради эффективности некоторым из треугольников, ассоциированных с пикселом, будет дана специальная трактовка. К этим специальным треугольникам отнесем те, которые полностью покрывают пиксел. (Треугольник полностью покрывает пиксел, если он весь лежит внутри треугольника.) Для данного пиксела проигнорированы, за исключением только одного, который расположен ближе всех к точке наблюдения! Здесь термины “близкий” и расстояние до треугольника” относятся к точке в трехмерном пространстве, в которой прямая линия, проходящая через точку Е и центр пиксела, пересекает плоскость треугольника. Если есть треугольники, полностью покрывающие пиксел, то номер, идентифицирующий ближний из них, также будет сохранен в массиве
Рис. 5-14. Пиксел и ассоциированные треугольники
Рис. 5.15. Структура данных для пиксела самом конце процесса. После окончания этого процесса список для каждого пиксела будет содержать все треугольники, ассоциированные с пикселом. Теперь нужно разобраться с другой интересной проблемой программирования. Для данного треугольника ABC с экранными координатами вершин
то есть 1 и 0 являются кодами для положения сверху и снизу, соответственно. Для аналитического определения этих значений используем точку, лежащую далеко внизу. Обозначим экранные координаты точки V как
Рис. 5.16. Нумерация сторон Если точки
где через
Аналогично вычисляются детерминанты
после чего получаем остальные элементы массива
Следующим шагом будет определение координат концевых точек слева Найдем номера
Вычислим наклон сторон треугольника
(В отличие от двух предыдущих вычислений здесь отсечения не будет, поскольку переменная slope имеет тип переменной с плавающей точкой.) Предположим, что при последовательных вычислениях от столбца
Рис. 5.17. Сторона треугольника и столбцы пикселов 5.17, в которой сторона треугольника пересекает границу между столбцами пикселов
Пусть
где функция
Рис. 5.18. Значение затерто результатом анализа стороны 1. Поэтому вначале присвоим всем элементам массива Теперь для треугольника ABC (данные для которого зафиксированы в массиве
не пуст и
Рис. 5.19. Расстояния в треугольнике Поскольку треугольники
Следовательно,
В поля
|
1 |
Оглавление
|