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

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

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

Существует три системы координат. Обычно программист работает и держит данные о геометрических объектах в мировых координатах. Для повышения реалистичности при подготовке к выводу изображения на экран данные об объектах из мировых координат переводят в видовые координаты. И только в момент вывода изображения непосредственно на экран дисплея переходят к экранным координатам, которые представляют собой номера пикселов экрана.

Первые две системы могут использоваться в многомерных системах координат, но последняя только в двухмерной. Операции являются необратимыми, то есть из двухмерной картинки-проекции невозможно восстановить трехмерное изображение.

Матрица общего перспективного преобразования

В этой матрице элементы a , d , е отвечают за масштабирование, m , n , L — за смещение, p , q , r — за проецирование, s — за комплексное масштабирование, х — за вращение.

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

Необходимо отметить отдельно предположение, что на всех исходных изображениях запечатлена одна и та же сцена, т.е. каждое изображение является видом сцены с какой-то определенной камеры. Поэтому для удобства описания вводится понятие вида, как изображение с ассоциированной с ним моделью камеры, с которой оно было получено.

Перспективная проекция

Модель перспективной проекции соответствует идеальной камере-обскуре. Эта модель довольно точно соответствует процессу построения изображения в большинстве современных фото- и видеокамер. Однако из-за ограничений современной оптики реальный процесс несколько отличается от модели камеры-обскуры. Отличия реального процесса от модели называются искажениями и моделируются отдельно.

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

Простейшая модель перспективной проекции

Рассмотрим простейший случай, когда центр проекции камеры (фокус) помещен в начало системы координат, и плоскость изображения совпадает с плоскостью Z=1. Пусть (X,Y,Z) - координаты точки в 3-х мерном пространстве, а (x,y) - проекция этой точки на изображение I. Перспективная проекция в этом случае описывается следующими уравнениями:

В матричной форме с использованием однородных координат эти уравнения переписываются в следующем виде:

(2.2)

Плоскость, расположенная на расстоянии 1 от центра проекции, и перпендикулярная оптической оси называется идеальной плоскостью изображения. Оптическая ось пересекает идеальную плоскость изображения в точке с, называемой принципиальной точкой. Иллюстрация простейшего случая перспективной проекции приведена на рис. 1.

Внутренняя калибровка камеры

Простейший случай перспективной проекции практически всегда не соответствует реальной камере. Расстояние от центра проекции до плоскости изображения, т.е. фокусное расстояние, обозначаемое f, обычно не равно 1. Также координаты точки в плоскости изображения могут не совпадать с абсолютными координатами. При использовании цифровой камеры, соотношение между координатами точки в изображении и абсолютными координатами точки на идеальной плоскости, определяется формой и размерами пикселов матрицы.

Обозначим размеры пиксела матрицы цифровой камеры за p x , p y , угол наклона пиксела за α, а принципиальную точку за , рис.2. Тогда координаты точки (x,y) в изображении, соответствующей точке (x R , y R) на идеальной плоскости, определяются выражением:

(2.3)

Если за f x ,f y обозначить фокусное расстояние f, измеренное в ширинах и высотах пикселей, а tan(α)*f/p y обозначить как s, то формула 2.3 преобразуется в:

(2.4)

Матрица K называется матрицей внутренней калибровки камеры. В большинстве случаев у реальных цифровых камер угол наклона пикселей близок к прямому, т.е. параметр s=0, а ширина и высота пикселя равны. Принципиальная точка обычно располагается в центре изображения. Поэтому матрица K может быть записана в виде:

(2.5)

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

Внешняя калибровка камеры

Пусть M - точка сцены в 3-х мерном пространстве. Любое движение является евклидовым преобразованием пространства, поэтому в однородных координатах оно выражается как:

(2.6)

где R - матрица вращения, T= T - вектор переноса.

Движение камеры относительно сцены эквивалентно обратному движению точек сцены относительно камеры, поэтому равно:

(2.7)

где R, T - матрица вращения и вектор перемещения камеры относительно сцены. Матрица С называется матрицей внешней калибровки камеры. Матрица C -1 называется матрицей движения камеры . Таким образом, матрица внешней калибровки камеры переводит координаты точек сцены из системы координат сцены в систему координат, связанную с камерой.

Полная модель перспективной проекции

Из выражений 2.1, 2.4, 2.7 можно вывести выражение произвольной перспективной проекции для любой камеры с произвольной ориентацией и положением в пространстве:

В более краткой форме с учетом предыдущих обозначений эта формула может быть записана как:

Матрица P называется матрицей проекции камеры.

По аналогии с общим перспективным преобразованием рассмотрим вначале простейший случай перспективного преобразования плоскости. Пусть плоскость p совпадает с плоскостью Z=0, тогда однородные трехмерные координаты любой ее точки M=. Для любой камеры с матрицей проекции P, перспективное преобразование плоскости описывается матрицей размерности 3*3:


Поскольку любую плоскость в 3-х мерном пространстве можно перевести в плоскость Z = 0 евклидовым преобразованием поворота и переноса, что эквивалентно домножению матрицы камеры P на матрицу преобразования L, то перспективное отображение произвольной плоскости в пространстве описывается линейным преобразованием с матрицей размерности 3*3.

Перспективное преобразование плоскости также называется гомографией . В матричной форме перспективное преобразование плоскости записывается как m=HM .

Геометрия двух изображений

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

Перспективное преобразование плоскости

Если центры двух камер совпадают, то точки на плоскостях изображения обеих камер переводятся друг в друга перспективным преобразованием плоскости. В этом случае, преобразование точек между изображениями не зависит от формы 3-х мерной сцены, а зависит только от взаимного положения плоскостей изображений.

Если вся сцена или ее часть представляет собой плоскость, то ее изображения на разных видах с несовпадающими центрами камер, можно перевести друг в друга преобразованием гомографии. Пусть p - наблюдаемая плоскость, H 1 - преобразование гомографии между плоскостью p и изображением I 1 , H 2 - преобразование гомографии между плоскостью p и изображением I 2 . Тогда преобразование гомографии H 12 между изображениями I 1 и I 2 можно вывести следующим образом:

H 12 не зависит от параметризации плоскости p, а значит не зависит и от системы координаты в пространстве

Большинство методов определения координат 3х мерных точек по их проекциям и методов реконструкции 3-х мерной сцены, опираются на предположение о движении центра камеры между видами. Поэтому при совпадении центров камер нескольких видов эти методы будут давать некорректные результаты. Такие конфигурации камер должны обнаруживаться и обрабатываться специальным образом.

Поскольку преобразование гомографии записано в однородных координатах, то матрица H определена с точностью до масштаба. Она имеет 8 степеней свободы, и параметризируется 8 переменными. Каждое известная пара соответствующих точек m 1 и m 2 на первом и втором изображении соответственно дает 2 линейных уравнения от элементов матрицы H. Поэтому 4-х известных пар соответствующих точек достаточно для составления системы линейных уравнений из 8 уравнений с 8 неизвестными. По этой системе гомография H может быть однозначно определена, если никакие три из точек не лежат на одной прямой.

Фундаментальная матрица

Рассмотрим случай, когда центры камер двух видов не совпадают. Пусть C 1 и C 2 - центры двух камер, M - 3-х мерная точка сцены, m 1 и m 2 - проекции точки M на первое и второе изображение соответственно. Пусть П - плоскость, проходящая через точку M и центры камер C 1 и C 2 . Плоскость П пересекает плоскости изображений первого и второго видан по прямым l 1 и l 2 . Поскольку лучи C 1 M и C 2 M лежат в плоскости П, то очевидно, что точки m 1 и m 2 лежат на прямых l 1 и l 2 соответственно. Можно дать более общее утверждение, что проекции любой точки M", лежащей в плоскости П, на оба изображения должны лежать на прямых l 1 и l 2 . Эти прямые называются эпиполярными линиями. Плоскость П называются эпиполярной плоскостью.

Два вида одной и той же сцены называются стереопарой, а отрезок C 1 C 2 , соединяющий центры камер, называется базой стереопары (baseline) или стереобазой. Любая эпиполярная плоскость проходит через отрезок C 1 C 2 . Пусть C 1 C 2 пересекает первое и второе изображение в точках e 1 и e 2 соответственно. Точки e 1 и e 2 называются эпиполярными точками или эпиполями. Все эпиполярные линии пересекаются в точках e 1 и e 2 на первом и втором изображении соответственно. Множество эпиполярных плоскостей представляет собой пучок, пересекающийся по стереобазе C 1 C 2 . Множество эпиполярных линий на обоих изображений также представляют собой пучки прямых, пересекающихся в e 1 и e 2 .

Точки m 1 и m 2 называются соответствующими, если они являются проекциями одной и той же точки сцены M. Эпиполярные линии l 1 и l 2 называются соответствующими, если они лежат в одной и той же эпиполярной плоскости П. Если эпиполярная плоскость П проходит через точку m 1 , тогда эпиполярные линии l 1 и l 2 , лежащие в ней, называются соответствующими точке m 1 .

Ограничение на положение соответствующих точек m 1 и m 2 , вытекающей из эпиполярной геометрии, можно сформулировать следующим образом: точка m 2 , соответствующая m 1 , должна лежать на эпиполярной линии l 2 , соответствующей m 1 . Это условие называется эпиполярным ограничением. В однородных координатах условие того, что точка m лежит на линии l записывается как l T m=0 . Эпиполярная линия проходит также через эпиполярную точку. Уравнение прямой, проходящей через точки m 1 и e 1 можно записать как:

l 1 ∼ x m 1 ,

где x - антисимметричная матрица размерности 3*3 такая что, x m 1 - векторное произведение m 1 и e 1 .

Для соответствующих эпиполярные линий l 1 и l 2 верно:

где P + - псевдоинверсия матрицы P.

Матрица F называется фундаментальной матрицей. Она представляет собой линейный оператор, сопоставляющей каждой точке m 1 соответствующую ей эпиполярную линию l 2 . Для каждой пары соответствующих точек m 1 и m 2 верно

m T 2 Fm 1 =0

Это формулировка эпиполярного ограничения через фундаментальную матрицу.

Фундаментальная матрица имеет 7 степеней свободы. Каждая пара соответствующих точек m 1 и m 2 задает одно линейное уравнение на элементы матрицы, поэтому она может быть вычислена по известным 7 парам соответствующих точек.

Эпиполярное ограничение справедливо для любых пар соответствующих точек, расположенных на идеальных плоскостях двух видов. Если известны матрицы внутренней калибровки K 1 и K 2 камер обоих видов, то эпиполярное ограничение для соответствующих точек на идеальных плоскостях записывается как:

Матрица E называется существенной матрицей. Можно показать, что существенная матрица также может быть получена из взаимного расположения камер.

Пусть P 1 =(I|0) и P 2 =(R|-RT) - две матрицы проектирования с калибровкой K = I. Тогда уравнения проектирования на идеальную плоскость обеих камер записываются в виде:

Найдем эпиполярную линию на втором виде, соответствующую точке m" 1 на первом. Для этого достаточно спроектировать на второй вид две точки, лежащие на луче (C 1 ,m" 1) на второй вид, например центр первой камеры (0,0,0,1) T и точку на плоскости бесконечности (x" 1 ,y" 1 ,z" 1 ,0) T . Проекциями этих точек будут являться соответственно -RT, и R(x" 1 ,y" 1 ,z" 1 ,0) T . Уравнение эпиполярной линии l 2 , проходящей через обе этих точки задается как векторное произведение:

l 2 =RT×R(x" 1 ,y" 1 ,z" 1) T =R(T×(x" 1 ,y" 1 ,z" 1) T)

В матричной форме векторне произведение T×(x" 1 ,y" 1 ,z" 1) T можно записать с помощью матрицы S:

Тогда эпиполярное ограничение на точки в идеальной плоскости записывается как:

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

Геометрические свойства трех и более изображений

Пусть C 1 ,C 2 и C 3 - центры трех видов одной и той же трехмерной сцены. В этом случае, эпиполярные ограничения накладываются на соответствующие точки любой пары видов. Если известны проекции двух точек m 1 и m 2 на первый и второй вид, то положение проекции на третье изображение может быть найдено как пересечение двух эпиполярных видов, соответствующих точкам m 1 и m 2 .

По двум известным проекциям m 1 и m 2 на два изображения с известной калибровкой можно определить положение точки M в пространстве. Поэтому если известна калибровка третьего изображения, то проекция точки M на третий вид может быть определена простой проекцией.

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

Графический вывод обычно осущестсвляется в некоторую прямоугольную область экрана или окна. В OpenGL-визуализации эта область называется порт вывода. Именно в этой прямоугольной области будет размещено библиотекой сформированное изображение. Его размеры определяются относительно левого верхнего угла окна и измеряются в пикселах. Для определения порта вывода приложение должно отследить событие изменения размеров окна и определить порт вывода с использованием функции:

void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

Аргументы (x, y) определяют положение верхнего левого угла порта вывола, а width и height -- его размеры. По умолчанию библиотека растягивает порт вывода на всё OpenGL-окно.

Координатная система

Прежде чем быть отображённой на экране вершина, заданная в системе координат сцены должна пройти процесс проецирования. Для описания и проведения преобразований систем координат в библиотеке OpenGL используется матричный аппарат. Сама система координат и ее преобразования описываются матрицами в так называемых однородных координатах.

Во-первых, вершина преобразуется в матрицу 1X4, в которой первые три элемента представляют собой координаты x, y, z. Четвёртое число - масштабный коэффициент w, который обычно равен 1.0. Вершина домножается на видовую матрицу, которая описывает преобразования видовой системы координат. Получаем вершину в координатах вида. Она в свою очередь домножается на матрицу проекций и получаем вершину в координатах проекции. На этом этапе некоторве вершины отбрасываются (из-за непопадания в объём визуализации). Затем вершины нормализуются для передачи перспективы (если координата w не равна 1.0). Окончательное проецирование вершины на двумерную поверхность экрана выполняется библиотекой OpenGL самостоятельно и вмешаться в этот процесс нельзя.

Матрица проекций

Матрица проекций отвечает за то, какой объём пространства будет визуализироваться, каким образом вершины графических примитивов будут спроецированы на двумерную поверхность экрана монитора. Преобразования матрицы проекций ведут к тому, что все изображение будет изменяться (масштабироваться, перемещаться или вращаться). В OpenGL возможно использование двух режимов матрицы проекций: перспективная и ортографическая.

При перспективной проекции используется тот факт, что для человеческий глаз работает с предметом дальнего типа, размеры которого имеют угловые размеры. Чем дальше объект, тем меньше он нам кажется. Таким образом, объём пространства, который визуализируется представляет собой пирамиду.

Матрица преспективной проекции определяется с использованием функции:

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

(left, bottom, -near) и (right, top, -near) определяют координаты ближней отсекающей рамки; near и far имеют всегда положительные значения и определяют расстояние от точки зрения до ближней и дальней отсекающих рамок.

Для задания матрицы перспективной проекции также можно использовать функцию gluPerspective(), которая имеет другие аргументы

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);

Аргумент fovy (field of view) определяет поле зрения, а aspect -- отношение ширины отсекающей рамки к высоте. near и far имеют всегда положительные значения и определяют расстояние от точки зрения до ближней и дальней отсекающих рамок.

Перспективное проецирование обычно используется в играх и приложениях, где требуется добиться высокой реалистичности объектов, подожей на визуализацию глазом. Для двумерной и трехмерной визуализации научных и технических данных обычно используется ортографическая проекция. Рассмотрим установку ортографической проекции сначала для двумерной визуализации. При ортографической проекции объём пространства, который визуализируется представляет собой параллелепипед:

Особенностями ортографической проекции является то, что расстояние от камеры до объектов не влияет на итоговое изображение.

Для установки и последующего изменения матрицы проекций следует выполнить функцию glMatrixMode(GL_PROJECTION). Для начала также следует отменить все предыдущие установки и преобразования, сделав матрицу проекций единичной с помошью функции glLoadIdentity(). Матрица ортографической проекции устанавливается с использованием функции, которая имеет следующий прототип:

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

(left, bottom, -near) и (right, top, -near) -- точки, определяющие ближнюю отсекающую рамку. (left, bottom, -far) и (right, top, -far) -- точки, определяющие дальнюю отсекающую рамку. После применения этой команды направление проецирования параллельно оси z в сторону отрицательных значений

//Функция изменения размеров и установки координат
void Reshape(int width, int height)
{
//Установка порта вывода
glViewport(0, 0, width, height);

//Режим матрицы проекций
glMatrixMode(GL_PROJECTION);
//Единичная матрица
glLoadIdentity();

//Установка двумерной ортографической системы координат
glOrtho(-50., 50., -50., 50., -1., 1.);

//Режим видовой матрицы
glMatrixMode(GL_MODELVIEW);
}

Специально для двумерной визуализации можно использовать функцию, которая имеет следующий прототип:

void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

Эта функция аналогична glOrtho(), при вызове которой аргумент near=-1.0, а far=1.0. В процессе двумерной визуализации z-координата у вершин имеет значение 0, то есть объекты находятся на средней плоскости.

При необходимости сохранения пропорций установку системы координат необходимо осуществлять с учетом отношения ширины и высоты окна.

//Установка ортографической системы координат
double aspect=width/double(height);
if(width>=height)
{
gluOrtho2D(-50.*aspect, 50.*aspect, -50., 50.);
}
else
{
gluOrtho2D(-50., 50., -50./aspect, 50./aspect);
}

Видовая матрица

Видовая матрица отвечает за систему координат создаваемой трехмерной модели. В процессе создания модели видовая матрица может многократно изменяться для того, чтобы видоизменить изображение отдельных графических примитивов (превратить квадрат в прямоугольник, куб в параллелепипед, сферу в эллипсоид). Для установки и последующего изменения видовой матрицы следует выполнить функцию glMatrixMode(GL_MODELVIEW). Для начала также следует отменить все предыдущие установки и преобразования, сделав матрицу проекций единичной с помошью функции glLoadIdentity(). Если координаты вершин объекта задаются при его создании, то дополнительные преобразования системы координат не требуются. Однако часто это сложно или просто невозможно.

OpenGL предоставляет три функции для выполнения преобразования системы координат: glTranslated(), glRotated() и glScaled(). Эти команды генерируют матрицы переноса, поворота и масштабирования, которые домножаются на видовую матрицу с помощью функции glMultMatrix(). Как видите OpenGL берёт на себя матричные операции и выполняет их по специальным, быстрым алгоритмам с максимальной эффективностью. Например:

Перенос

Если аргумент больше 0, то объект при отображении будет смещён в сторону положительных значений вдоль оси. Если аргумент меньше 0, то объект при отображении будет смещён в сторону отрицательных значений вдоль оси.

Масштабированиe

Осуществляется с использованием функции, которая имеет следующий прототип:

Если аргумент больше 1, то объект при отображении будет увеличенным. Если аргумент меньше 1, то объект при отображении будет уменьшенным. Если аргумент отрицательный, то объект при отображении будет ещё и отраженным. Нулевое значение аргумента допускается, но будет приводить ктому, что размеры объекта будут нулевыми.

Поворот

Осуществляется с использованием функции, которая имеет следующий прототип:

void glRotated(double angle, double x, double y, double z); glRotated(30.,0.,0.,1.); //Поворот вокруг z
glBegin(GL_LINE_LOOP);
//Установка вершин
glVertex2d(-2., 2.);
glVertex2d(2., 2.);
glVertex2d(2., -2.);
glVertex2d(-2., -2.);
glEnd();

Первый аргумент определяет угол поворота, а остальные три -- координаты вектора, вокруг которого осуществляется вращение.

Стек матриц

Полезным механизмом при построении сложных изображений является стек матриц. С использованием функций glPushMatrix() и glPopMatrix() можно запомнить текущую матрицу в стеке и восстановить ее после каких либо изменений в системе координат.

Дисплейные списки

Интересным и очень эффективным механизмом при создании сцены являются списки. Это механизм, который позволяет запоминать последовательности команд OpenGL и выполнять их снова. Это может существенно повысить эффективность визуализации большого количества одинаковых объектов.

Каждый дисплейный список должен иметь идентификатор. Это может быть произвольное целое число, которое вы можете назначить сами. Во избежание конфликтов идентификаторов списков библиотека OpenGL рекомендует воспользоваться функцией

GLuint glGenLists(GLsizei range);

которая находит свободный идентификатор и возвращает его. В качестве аргумента функции указывается количество, следующих подряд, списков, для которых следует получить идентификаторы. Если свободных идентификаторов не осталось, то функция возвращает ноль.

Для того, чтобы начать формировать список, необходимо вызвать функцию

void glNewList (GLuint list, GLenum mode);

Первый аргумент задает идентификатор формируемого списка, а второй определяет будет ли список только сформирован (GL_COMPILE) или сразу же и отображен (GL_COMPILE_AND_EXECUTE). Далее могут следовать команды OpenGL которые требуется сохранить в списке. Не все команды могут быть в него включены.

Формирование списка заканчивается функцией:

void glEndList (void);

После формирования дисплейные списки сохраняются во внутренней структуре данных OpenGL-окна и будут удалены, когда окно будет закрыто или разрушено.

Для выполнения дисплейного списка используется команда:

void glCallList (GLuint list);

которая в качестве аргумента принимает идентификатор списка.

Вызов функции glCallList() можно осуществить в любом мемте программы, когда требуется выполнение сохраненных в списке команд.

Рассмотрим пример:

void Draw(void)
{
//Очистка цветового буфера

glColor3d(1.0, 1.0, 0.0);

glBegin(GL_LINES);
glVertex2d(-50., .0);
glVertex2d(50., .0);

For(int i=-50; i<50; i++)
{
glVertex2d(i, .0);
if(i % 5)
{
glVertex2d(i, -1.);
}
else if(i % 10)
{
glVertex2d(i, -2.);
}
else
{
glVertex2d(i, -3.);
}
}
glEnd();

glBegin(GL_LINES);
glVertex2d(.0, -50.);
glVertex2d(.0, 50.);
for(int j=-50; j<50; j++)
{
glVertex2d(.0, j);
if(j % 5)
{
glVertex2d(-1., j);
}
else if(j % 10)
{
glVertex2d(-2., j);
}
else
{
glVertex2d(-3., j);
}
}
glEnd();
//Завершить выполнение команд
glFlush();
}

void Draw(void)
{
//Очистка цветового буфера
glClear(GL_COLOR_BUFFER_BIT);
//Установка цвета отображения
glColor3d(1.0, 1.0, 0.0);

//Формирование оси
int axis = glGenLists(1);
if (axis != 0)
{
glNewList(axis, GL_COMPILE);
glBegin(GL_LINES);
glVertex2d(0., .0);
glVertex2d(100., .0);

For(int i=0.; i<97; i++)
{
glVertex2d(i, .0);
if(i % 5)
{
glVertex2d(i, 1.);
}
else if(i % 10)
{
glVertex2d(i, 2.);
}
else
{
glVertex2d(i, 3.);
}
}
glEnd();
//Формирование стрелки можно добавить позже
glBegin(GL_LINE_STRIP);
glVertex2d(97., 1.);
glVertex2d(100.,.0);
glVertex2d(97., -1.);
glEnd();
glEndList();
}
//Рисование горизонтальной оси
glPushMatrix();
glTranslated(-50.,0.,0.);
glRotated(180.,1.,0.,0.);
glCallList(axis);
glPopMatrix();

//Рисование вертикальной оси
glPushMatrix();
glTranslated(0.,-50.,0.);
glRotated(90.,0.,0.,1.);
glCallList(axis);
glPopMatrix();

//Завершить выполнение команд
glFlush();
}

Барий -- элемент главной подгруппы второй группы, шестого периода периодической системы химических элементов Д. И. Менделеева, с атомным номером 56. Обозначается символом Ba (лат. Barium). Простое вещество барий (CAS-номер: 7440-39-3) -- мягкий, ковкий щёлочноземельный металл серебристо-белого цвета. Обладает высокой химической активностью.

Нахождение в природе

Редкие минералы бария: цельзиан или бариевый полевой шпат (алюмосиликат бария), гиалофан (смешанный алюмосиликат бария и калия), нитробарит (нитрат бария) и пр.

Получение Бария

Металл можно получить разными способами, в частности при электролизе расплавленной смеси хлористого бария и хлористого кальция. Можно получать барий и восстанавливая его из окиси алюмотермическим способом. Для этого витерит обжигают с углем и получают окись бария:

BaCO 3 + C > BaO + 2CO.

Затем смесь BaO с алюминиевым порошком нагревают в вакууме до 1250°C. Пары восстановленного бария конденсируются в холодных частях трубы, в которой идет реакция:

3BaO + 2Al > Al 2 O 3 + 3Ba.

Интересно, что в состав запальных смесей для алюмотермии часто входит перекись бария BaO 2 .

Получить окись бария простым прокаливанием витерита трудно: витерит разлагается лишь при температуре выше 1800°C. Легче получать BaO, прокаливая нитрат бария Ba(NO 3) 2:

2Ba (NO 3) 2 > 2BaO + 4NO 2 + O 2 .

И при электролизе и при восстановлении алюминием получается мягкий (тверже свинца, но мягче цинка) блестящий белый металл. Он плавится при 710°C, кипит при 1638°C, его плотность 3,76 г/см 3 . Все это полностью соответствует положению бария в подгруппе щелочноземельных металлов.