Пред.
След.
Макеты страниц
Распознанный текст, спецсимволы и формулы могут содержать ошибки, поэтому с корректным вариантом рекомендуем ознакомиться на отсканированных изображениях учебника выше Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике ДЛЯ СТУДЕНТОВ И ШКОЛЬНИКОВ ЕСТЬ
ZADANIA.TO
5.2. ВХОДНЫЕ ДАННЫЕ И ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕРебро объекта может закрываться полностью или частично одной или несколькими гранями этого же объекта. Каждое ребро — это конечный отрезок прямой линии. Объект может состоять из нескольких частей, не обязательно соединяющихся между собой. На рис. 5.1 изображены тетраэдр и куб с вершинами, обозначенными числами
Рис. 5.1. Тетраэдр и куб Составим такую программу, которая прочтет данные, описывающие точку наблюдения и объекты. Для любой (реальной) точки наблюдения графический вывод будет представлять собой изображение объекта. В противовес главе 4 будем считать объект непрозрачным. Как и в параграфе 4.5, пользователь должен задать две входные строки данных, определяющие точку О в прямоугольной системе координат и сферические координаты
Не будем здесь уделять много внимания удобству пользователя, а лучше введем концепцию кодирования вершин: поскольку каждая вершина потребуется несколько раз, то было бы очень нецелесообразно многократно задавать ее координаты. В данном примере для каждой вершины будем задавать ее номер от 0 до 11 вместе со значениями координат по осям
Как и в параграфе 4.5, точка О объекта является началом системы мировых координат, используемой в программе (обратите внимание на различие между буквой О и цифрой 0). Поскольку она имеет координаты (2.5, 1, 1), то внутри программы координаты точек с 0 по 14 будут уменьшены на эти значения. Так, например, точке 9 будут присвоены значения координат Каждая грань объекта может быть описана в виде любой конечной области плоскости с границами в виде отрезков прямых линий. В качестве примера такой области можно назвать полигон, в котором допустимы также и отверстия. Чтобы программа была проще, пользователь должен сам разбить такие области на треугольники. Эти треугольники затем будут использоваться для определения, не закрывают ли они отрезки прямых линий. По причинам, которые поясним ниже, номера вершин в каждом треугольнике перечисляются в порядке обхода против часовой стрелки при рассматривании их с внешней стороны объекта. Каждая грань куба разбивается на два треугольника. Эту часть входных данных опять завершает символ
Теперь необходимо задать каждое ребро объекта. Хотя эти ребра уже известны как стороны треугольников, их следует описать снова. Во-первых, не все стороны треугольников являются ребрами объекта и, во-вторых, желательно иметь возможность вычерчивания дополнительных отрезков, не принадлежащих сплошному телу. Для иллюстрации вычертим части положительных координат полуосей, как показано на рис. 5.1. Как это ни курьезно, но в данном примере количество входных строк не увеличится, поскольку ребра объекта, лежащие на координатных осях, не нужно задавать повторно. Следовательно, имеем 17 входных строк:
Программа выполнит считывание всех входных данных из файла, имя которого передается в качестве аргументов программы
Как мы уже знаем, точка Е — начало системы видовых координат, и направление наблюдения совпадает с направлением оси z. Следовательно, все значения Список треугольников запоминается в массиве
Вместе с номерами вершин для каждого треугольника записываются коэффициенты а, b, с, h уравнения плоскости
в которой расположен треугольник. Конечно, их можно было бы рассчитывать каждый раз, когда они оказываются необходимыми, но это означало бы напрасную трату времени, поскольку они требуются довольно часто. (Здесь четвертый коэффициент обозначен через
Тогда уравнение (5.1) можно записать в виде скалярного произведения
где
Так называемый вектор нормали Скалярное произведение было введено в параграфе 3.2. Заметим, что здесь мы используем систему видовых координат с точкой Е в качестве начала системы координат и отрезок
Это уравнение можно переписать в виде
В программе коэффициенты а, А, с, А вычисляются по формулам:
Однократное вычисление коэффициентов а, 6, с, А, вместо их определения при каждой проверке отрезка на видимость, позволяет значительно сократить время вычислений. Если программа действительно должна быть по возможности проще, то необходимо было бы запоминать все треугольники по мере их ввода. Однако те треугольники, которые находятся сзади, сохранять не требуется и их можно проигнорировать. Рассмотрим треугольник 123 на рис. 5.1. На картинке он закрыт треугольником 130. Поскольку последний треугольник закрывает часть отрезка 45, то можно проигнорировать тот факт, что предыдущий треугольник делает то же самое. Задние грани закрываются видимыми гранями. Хотя задние грани могут закрывать от глаза некоторые точки, эти же точки закрываются и видимыми гранями. Бот почему задние грани можно проигнорировать. Самый простой способ идентификации задних граней основан на ориентации вершин. Если мы посмотрим на грань 123 на рис. 5.1. в трехмерном пространстве извне (то есть со стороны отрицательной полуоси определении входной последовательности. Однако на рис. 5.1 порядрк обхода 123 соответствует движению часовой стрелки. Это означает, что на картинке эта грань видна через тело объекта, а не извне. Таким образом, грань 123 — задняя. Применение этого способа определения положения граней для других треугольников на рис. 5.1 может послужить хорошим упражнением. Обращаясь к концу параграфа 3.4, можно обнаружить, что в этом случае требуется найти значение детерминанта
где
Так как значения С помощью векторного произведения можно убедиться, что треугольник ABC - задний, из условия
|
1 |
Оглавление
|