Главная > Разное > Принципы программирования в машинной графике
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

4.5. ВЫЧЕРЧИВАНИЕ ПРОВОЛОЧНЫХ МОДЕЛЕЙ

Рассмотрим программу, которая может вычертить перспективное изображение любой проволочной модели, образованной из конечного числа отрезков прямых линий. Опуская определенные отрезки прямых линий, можно выполнить картинки для простых сплошных тел, что уже было показано для куба в параграфе 4.4. Как и ранее, будем использовать точку наблюдения Е и “объектную точку” О, которые определяют направление наблюдения. Конечно, для пользователя не всегда удобно, чтобы точка О совпадала с началом системы мировых координат. Поэтому будем требовать только, чтобы пользовательская ось z располагалась вертикально. Пользователь должен задать координаты объектной точки О, выраженные в своей системе координат. После считывания пользовательских координат они преобразуются в систему “внутренних мировых координат” х, у, z с точкой О как начало по следующему правилу:

Затем пользователь должен определить сферические координаты точки наблюдения Е относительно нового начала координат О, как на рис. 4.3. Также должно быть задано расстояние между точкой наблюдения и экраном. Тем самым определяется положение экрана, поскольку он перпендикулярен направлению наблюдения Для определения отрезков прямых линий нам опять придется представить перемещение в трехмерном пространстве, которое ассоциируется с соответствующим перемещением пера на картинке. Для каждого перемещения задаются коды

которые также уже применялись ранее в файле в параграфе 2.6. Для вычерчивания двух примыкающих друг к другу отрезков PQ и необходимо задать три входные строки следующей структуры:

Правая часть каждой строки является комментарием, ее наличие во входном файле не влияет на работу программы.

Перед представлением программы рассмотрим пример полного набора входных данных. Обратимся к рис. 4.10, который совсем не тривиален. Если вычерчивать этот рисунок вручную, то возникает проблема определения положения точки М на прямой линии такой, чтобы в трехмерном пространстве отрезок был перпендикулярен плоскости Выберем точку К в качестве начала пользовательской системы координат. Пусть положительная полуось у в этой системе проходит через точку а положительная полуось х - через точку В. Вид с положительной оси х на плоскость показан на рис. 4.17. В трехмерном пространстве точка К находится в середине отрезка длина которого равна 10. Теперь можно записать полный набор входных данных для картинки, которую собираемся начертить:

Рис. 4.17. Вид с положительной полуоси х

Для параметра было найдено значение 15 путем подстановки в формулу (4.14) значений размеру объекта Хотя до сих пор программа еще не представлена, покажем на рис. 4.18 результат ее работы на основании приведенных выше входных данных.

Программа будет считывать данные из файла, имя которого задается в качестве аргумента программы. При имени программы GPERS и имени файла это означает, что для запуска программы на выполнение необходимо набрать на клавиатуре строку

вместо ввода только имени GPERS в качестве команды для начала выполнения программы. Программа с аргументами содержит строку

в начале главной функции Имя программы, в данном случае это также рассматривается как аргумент. Параметр

Рис. 4.18. Пример работы программы GPERS

принимает значение, равное числу аргументов (в данном примере , а вектор аргументов содержит указатели на аргументы. В данном конкретном примере имеем

Видовые и перспективные преобразования выполняются так же, как в программе CUBE в параграфе 4.4:

(см. скан)

(см. скан)

Функция fscanf принимает неположительное значение, когда попытка чтения данных терпит неудачу, то есть когда достигается конец файла. Поэтому цикл чтения продолжается до тех пор, пока функция fscanf возвращает положительное значение.

Пользователь программы GPERS должен задать расстояние до экрана. По нескольким причинам такое решение неудовлетворительно:

1. Пользователю важен размер картинки, а не расстояние до экрана.

2. Параметр “размер_объекта” в формуле (4.14) имеет очень неопределенный смысл, поэтому трудно вычислить точное значение для параметра

3. Иногда желательно определить прямоугольную область вывода, занимающую лишь часть экрана, в которую картинка должна быть вписана целиком. В этом случае было бы очень

неудобно преобразовывать размеры области вывода в расстояние до экрана.

Есть несколько способов улучшения программ в этих направлениях, а именно:

1. Отсечение трехмерного объекта по пирамиде, вершина которой совпадает с точкой наблюдения Е, а основанием является определенное окно, заданное в мировых координатах. Описание такого способа, который здесь применяться не будет, можно найти в книге Ньюмена и Спрула (1979).

2. Отсечение картинки в двухмерном пространстве по заданной области вывода. Этот способ также не будем применять.

3. Автоматический подбор размера и позиции таким образом, чтобы картинка целиком входила в заданную область вывода. Этот способ мы уже применяли для двухмерных объектов в параграфе 2.6, где программа GENPLOT действовала в качестве постпроцессора. Эту же программу можно использовать и в данном случае. Более того, мы сможем воспользоваться последними тринадцатью строками программы из параграфа 2.6 для вывода данных для черчения в файл A SCRATCH.

Будем применять третий способ, используя два файла и две программы, как показано на рис. 4.19.

В программе GPERSF значение не вводится, а просто задается Это значение практически не нужно, поскольку размеры картинки, вычисляемые программой GENPLOT, зависят только от заданных размеров области вывода. Напомним, что программа GENPLOT запрашивает у пользователя границы области вывода. На этом этапе читатель может высказать предположение: а нельзя ли избавиться от необходимости задавать объектную точку О, поскольку точка О описывалась как центральная точка объекта и кажется, что положение такой точки может быть легко вычислено автоматически. Однако есть две причины, по которым следует оставить точку О как точку, определяемую пользователем. Эти причины обсудим ниже в параграфе 4.6.

Следующая программа GPERSF воспринимает тот же самый входной файл, как и программа но расстояние до экрана в конце второй строки исходных данных игнорируется и может быть опущено.

Рис. 4.19. Блок-сжема программ

(см. скан)

(см. скан)

Функция perspect в этой программе была получена на основе функции perspective из предыдущих программ CUBE и GPERS путем подстановки и выборе других значений содержимое файла A.SCRATCH будет иным, но картинка, сформированная программой GENPLOT, окажется точно такой же!)

<< Предыдущий параграф Следующий параграф >>
Оглавление