Сфера из двух треугольников.

Сферический треугольник и его применение.

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

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

Свойства сферического треугольника:

  1. Помимо трёх признаков равенства плоских треугольников, для сферических треугольников верен ещё один: два сферических треугольника равны, если их соответствующие углы равны.
  2. Для сторон сферического треугольника выполняются 3 неравенства треугольника: каждая сторона меньше суммы двух других сторон и больше их разности.
  3. Сумма всех сторон a + b + c всегда меньше 2πR.
  4. Величина 2πR − (a + b + c) называется сферическим дефектом
  5. Сумма углов сферического треугольника s = α + β + γ всегда меньше 3π и больше π
  6. Величина называется сферическим избытком или сферическим эксцессом
  7. Площадь сферического треугольника определяется по формуле.
  8. В отличие от плоского треугольника, у сферического треугольника может быть два, и даже три угла по 90° каждый.

Среди всех сферических многоугольников наибольший интерес представляет сферический треугольник. Три больших окружности, пересекаясь попарно в двух точках, образуют на сфере восемь сферических треугольников. Зная элементы (стороны и углы) одного из них, можно определить элементы все остальных, поэтому рассматривают соотношения между элементами одного из них, того, у которого все стороны меньше половины большой окружности. Стороны треугольника измеряются плоскими углами трехгранного угла ОАВС, углы треугольника – двугранными углами того же трехгранного угла см на рис.

Свойства сферических треугольников во многом отличаются от свойств треугольников на плоскости. Так, к известным трем случаям равенства прямолинейных треугольников добавляется еще и четвертый: два треугольника АВС и А`В`С` равны, если равны соответственно три угла РА = РА`, РВ = РВ`, РС = РС`. Таким образом, на сфере не существует подобных треугольников, более того, в сферической геометрии нет самого понятия подобия, т.к. не существует преобразований, изменяющих все расстояния в одинаковое (не равное 1) число раз. Эти особенности связаны с нарушением евклидовой аксиомы о параллельных прямых и также присущи геометрии Лобачевского. Треугольники, имеющие равные элементы и различную ориентацию, называются симметричными, таковы, например, треугольники АС`С и ВСС`

Сумма углов всякого сферического треугольника всегда больше 180°. Разность РА+РВ +РС – p = d (измеряемая в радианах) – величина положительная и называется сферическим избытком данного сферического треугольника. Площадь сферического треугольника: S = R2 d где R – радиус сферы, а d – сферический избыток. Эта формула впервые была опубликована голландцем А.Жираром в 1629 и названа его именем.

Если рассматривать двуугольник с углом a, то при 226 = 2p/n (n – целое число) сферу можно разрезать ровно на п копий такого двуугольника, а площадь сферы равна 4пR2 = 4p при R = 1, поэтому площадь двуугольника равна 4p/n = 2a. Эта формула верна и при a = 2pт/п и, следовательно, верна для всех a. Если продолжить стороны сферического треугольника АВС и выразить площадь сферы через площади образующихся при этом двуугольников с углами А, В, С и его собственную площадь, то можно прийти к вышеприведенной формуле Жирара.

Под сферическим треугольником подразумевается треугольник на поверхности сферы, составленный из дуг больших кругов – т. е. таких окружностей, центром которых является центр сферы. Углы сферического треугольника – это углы между касательными к его сторонам, проведенными в его вершинах. Как и углы обычного треугольника, они меняются от 0 до 180°. В отличие от плоского треугольника, у сферического сумма углов не равна 180°, а больше: в этом нетрудно убедиться, рассмотрев, например, треугольник, образованный дугами двух меридианов и экватора на глобусе: хотя меридианы сходятся в полюсе, оба они перпендикулярны экватору, а значит, у этого треугольника два прямых угла!

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

Уже у индийца Варахамихиры (V–VI вв.), у арабских математиков и астрономов начиная с IX в. (Сабит ибн Корра, ал-Баттани), а у западных математиков начиная с Региомонтана (XV в.) встречается в различных формулировках замечательная теорема о сферических треугольниках. Вот как она может быть сформулирована в современных обозначениях:

cosa = cosbcosc + sinbsinccosA. Сферическая теорема косинусов очень важна и для астрономии, и для географии. Эта теорема позволяет по координатам двух городов A и B находить расстояние между ними. Кроме того, математикам стран ислама сферическая теорема косинусов помогала в решении другой практической задачи: в городе с данными координатами находить направление на священный город Мекку (всякий правоверный мусульманин должен пять раз день молится в направлении Мекки). При решении этой задачи, считая город B Меккой, требовалось найти угол A того же треугольника.

Страница из «Собрания правил науки астрономии», XI в., автор неизвестен.

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

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

Купол на парусах Роспись паруса

ДжорджНельсон (George Nelson)

"Дизайнер может несколько расслабиться и развлечься; в результате может возникнуть шутка, забава. Удивительно, как часто это бывает очень значительная забава" Джордж Нельсон

Джордж Нельсон – американский дизайнер, архитектор, критик и теоретик дизайна. (1908, Хартфорд, Коннектикут – 1986, Нью-Йорк)

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

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

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

ДжорджНельсон (George Harold Nelson, 1908-1986 гг.)

гравюра Эшера

Концентрические сферы.1935г.Торцовая гравюра 24 на 24 см.

Четыре полые концентрические сферы освещены центральным источником света. Каждая сфера состоит из сетки, образованной девятью большими пересекающимися кольцами; они членят сферическую поверхность на 48 подобных сферических треугольников. Ма́уриц Корне́лис Э́шер (нидерл. Maurits Cornelis 17 июня 1898, Леуварден, Нидерланды - 27 марта 1972, Ларен, Нидерланды) - нидерландский художник-график.

Применение сферического треугольника:

  1. Использование в трехмерной графике сферических треугольников
  2. В астрономии
  3. В географии. Теорема сферического треугольника позволяет по координатам двух городов A и B находить расстояние между ними.
  4. В архитектруе
  5. В дизайне в виде стула от Джорджа Нельсона
  6. В гравюре

Сферический треугольник и основные формулы сферической тригонометрии

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

Сферическим треугольником называется фигура АВС на поверхности сферы, образованная дугами трех больших кругов (рис. 15).

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

Обычно рассматриваются треугольники, углы и стороны которых меньше 180°. Для таких сферических треугольников сумма углов всегда больше 180°, но меньше 540°, а сумма сторон всегда меньше 360°. Разность между суммой трех углов сферического треугольника и 180° называется сферическим избытком σ , т.е.

σ = DA +DB +DC - 180°.

Площадь сферического треугольника s равна

Где R - радиус сферы, на поверхности которой образован треугольник.

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

Возьмем сферический треугольник АВС (рис. 15), образованный на сфере радиуса R и с центром в точке О.

Из вершины А проведем касательные AD и АЕ к сторонам b и с до пересечения их с продолжениями радиусов ОС и 0В, лежащих в одной плоскости с соответствующей касательной. Соединив прямой точки пересечения D и Е, получим два плоских косоугольных треугольника ADE и ODE с общей стороной DE. Применяя к этим треугольникам теоремы элементарной геометрии, напишем:

DE 2 = OD 2 + ОЕ 2 - 2OD× ОЕ × cos a,

DE 2 = AD 2 + АЕ 2 - 2AD× АЕ× cos A.

Вычитанием второго равенства из первого получим:

2OD × ОЕ× cos a = OD 2 - AD 2 + ОЕ 2 - АЕ 2 + 2AD × АЕ × cos A. (1.31)

Из прямоугольных плоских треугольников ОАЕ и ОАD следует:

OD 2 -AD 2 =R 2 ;OE 2 -AE 2 =R 2 ;

AD = R tg b ; АЕ = R tg с;

Подставив эти соотношения в формулу (1.31) и произведя соответствующие сокращения и переносы, получим

cos а = cos b cos с + sin b sin с cos A , (1.32)

т.е. косинус стороны сферического треугольника равен произведению косинусов двух других его сторон плюс произведение синусов тех же сторон на косинус угла между ними.

Формулу (1.32) можно написать для любой стороны треугольника. Напишем ее, например, для стороны b:

cos b = cos с cos a + sin с sin a cos B

и, подставив в нее cos aиз формулы (1.32), получим

cos b = cos с (cos b cos с + sin b sin с cos A) + sin с sin a cos B.

Раскрыв скобки и перенеся первый член правой части в левую, будем иметь:

cos b (1 - cos 2 с) = sin b sin с cos с cos A + sin c sin a cos B.

Заменив (1 - cos 2 с) на sin 2 с и сократив все на sin c, окончательно получим

sin a cos В = sinc cos b - cos c sin b cos A, (1.33)

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

Формула (1.33) называется формулой пяти элементов. Ее можно написать по аналогии и для произведений sin a cos С, sin b cos A, sin b cos С, sin с cos A и sin с cos В.

Решим теперь равенство (1.32) относительно cos A:

Возведя обе части последнего равенства в квадрат и вычтя их из 1, получим:

Раскрыв скобки и разделив обе части этого выражения на sin 2 а, получим

Полученное выражение совершенно симметрично относительно a, b и с, и заменяя A на В, а на b или A на С и а на с, напишем

т.е. синусы сторон сферического треугольника пропорциональны синусам противолежащих им углов; или отношение синуса стороны сферического треугольника к синусу противолежащего угла есть величина постоянная.

Три выведенных соотношения (1.32), (1.33), (1.34) между сторонами и углами сферического треугольника являются основными; из них можно получить много других формул сферической тригонометрии. Мы ограничимся выводом одной только формулы для прямоугольного сферического треугольника. Положим А = 90°; тогда sin А = 1, cos A = 0, и из формулы (1.33) получим

sin a cos В = sin с cos b.

Разделив обе части этого равенства на sin b и заменивна, согласно (1.34), будем иметь:

ctg B = sin c ctg b

т.е. отношение тангенса одного катета прямоугольного сферического треугольника к тангенсу противолежащего угла равно синусу другого катета.

Мастер-класс новогодней поделки из бумаги «Новогодние шары»

Новогодние украшения интерьера и ёлки из бумаги

Автор : Погожева Валентина Петровна, воспитатель, МБДОУ «Усть-Сертинский детский сад «Теремок»», с. Усть-Серта, Кемеровской области, Чебулинского района.

Мастер – класс рассчитан на детей старшего дошкольного возраста, школьного возраста, педагогов и родителей.
Назначение : Поделка является украшением для интерьера новогоднего зала, новогодней игрушкой для украшения елки, а также может служить подарком на Новый год.
Цель . Научить детей создавать шар из бумаги, используя разные виды бумаги, отражать новогоднюю тематику.
Задачи:
- Создание условий для творческих проявлений детей, вызывать чувства радости воспитывать эмоционально-эстетические чувства;
- развивать творческие способности детей, воображение;
- проявлять потребность создавать прекрасное и украшать им дом, детский сад, дарить близким;
- воспитывать аккуратность в работе;
- учить делать объемные шары.
Материалы . Картон цветной, старые открытки или обложки глянцевых журналов, ножницы, карандаш, клей, трафарет круга и треугольника, или циркуль.

Приятные новогодние хлопоты – это одна из самых замечательных составляющих зимнего праздника. Среди этих хлопот обязательно присутствует украшение дома и новогодней елки. Игрушки, гирлянды и прочие украшения можно купить в магазине. Ну, а если есть желание и небольшое количество времени, то можно взяться за самостоятельное изготовление оригинальных и удивительных украшений. Например, сделать из цветной бумаги елочные шары.
Такой разноцветный объемный шар украсит не только елку, но и стены, двери и окна.
Новый год - пора игры,
Здесь простор воображенью.
Что за чудо-украшенье
Новогодние шары!
Скажете, шары - привычный,
Вечный елочный наряд?
Это так, но на обычный,
Не совсем глубокий взгляд.
А фантазией заветной
Взгляд вы поменяйте свой:
Это ж - малые планеты
Из галактики иной
Здесь случайно оказались
.
Для работы необходимо приготовить :
Картон цветной, старые открытки, ножницы, карандаш, клей, трафарет круга и треугольника.


Делаем шар :
1. Берем картон (или открытки) и с помощью трафарета рисуем 20 кругов.


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



3. Аккуратно при помощи линейки сгибаем по сторонам ранее нарисованных треугольников.


4. Берем пять кругов и склеиваем их так, чтобы верх треугольников был в одной точке. У нас получился верх шара, который похож на цветок. В самом верху проделываем отверстие, продеваем ленточку и фиксируем ее узлом
Аналогично склеиваем 5 фрагментов. Это будет – дно шара.


5. Теперь делаем середину нашего шара. Склеиваем отдельные фрагменты в полосу и замыкаем ее в кольцо.



6. Теперь все три части нашего шара собираем в одно целое: верх, дно и середину.


Фото10.


7. Ну вот, наш шар готов, можно украшать елку или новогодний зал.



Можно сделать новогодний шар не такой большой, а поменьше используя восемь кругов.
1. Чертим и вырезаем восемь кругов.
2. В каждом круге рисуем равносторонние треугольники, затем отгибаем клапаны.
3. Затем склеиваем первые четыре заготовки вместе, после этого следующие четыре заготовки.


4. Соединяем две заготовки в одну, получился вот такой маленький шар.


Из таких – же заготовок можно сделать и еще такой шар :

Пошаговый процесс выполнения работы:

1. Из цветной бумаги при помощи трафарета вырезаем 8 кругов. И еще нужно вырезать два круга меньшего размера.


2.Берем большой круг, сворачиваем пополам, потом еще раз пополам.


3. Так делаем со всеми большими кругами.
4. Затем берем маленький круг и наклеиваем на него свернутые большие круги.


5.Так наклеиваем все четыре круга на маленький круг. Аналогично делаем вторую половину. У нас получилось две половинки.


6.Склеиваем две половинки, и аккуратно расправляем сложенные «кармашки» кругов.


7.Вот еще и такой у нас получился новогодний шар.


Вот такие шары из бумаги можно сделать на елку своими руками.




Украсьте готовыми игрушками ваш дом, группу, детский сад для создания новогоднего настроения.
Хорошего настроения и веселого праздника!

История этой демки такова: однажды один мой друг сделал для своей игры генератор карт планет и захотел, чтобы созданные таким образом карты показывались в виде вращающейся сферы. Однако, при этом он не хотел использовать 3D-графику, а вместо этого сгенерировал множество кадров с этой самой сферой, повёрнутой на разные углы. Количество используемой памяти было… скажем так, избыточным, ну а скорость генерации кадров (как и качество их исполнения) сильно страдала. Чуть подумав, мне удалось помочь ему оптимизировать этот процесс, но в целом меня не покидало справедливое ощущение того, что это задача для OpenGL, а вовсе не для 2D-графики.

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

И должен сказать, что у меня это получилось. Но обо всём по порядку.

Математика процесса

Для начала определимся с собственно задачей. Для каждой точки на экране у нас имеются две экранные координаты в декартовой системе координат, и нам необходимо найти для неё сферические координаты (фактически, широту и долготу), которые по сути и являются текстурными координатами для карты планеты.

Итак. Переход от декартовой системы координат к сферической задаётся системой уравнений (взято с Википедии):

а обратный переход - такими уравнениями:

Координату Z мы легко можем получить из X и Y , зная радиус, а сам радиус мы можем принять равным единице.
В дальнейшем договоримся о том, что приведённые выше уравнения мы слегка изменим, поменяв местами понятия Y (у нас это будет экранная вертикаль) и Z (это будет глубина сцены).

Техническая часть

Реализация идеи потребует от нас применения квада (я уже писал о том, как его использовать, поэтому повторяться не буду, тем более что ниже приведена ссылка на полный исходный код проекта), а также двух текстур: собственно карты планеты (я использовал текстуру Земли размера 2048x1024) и карты текстурных координат. Код генерации второй текстуры аккуратно повторяет математику преобразования из декартовых координат в сферические:

Int texSize = 1024; double r = texSize * 0.5; int pixels = new int; for (int row = 0, idx = 0; row < texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x <= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }

Отметим, что координаты X и Y переводятся из диапазона в диапазон [-1..1], а текстурные координаты U и V переводятся из радианов в диапазон , после чего записываются соответственно в красную и зелёную компоненты 32-битной текстуры. Альфа-канал используется для сохранения «глубины» (координаты Z ), а синий пока остаётся незадействованным. Отключение билинейной фильтрации также не случайно: на данном этапе она не даёт какого-либо эффекта (соседние точки в любом случае имеют одни и те же значения, с довольно резкими скачками), а в том, что я собираюсь показать дальше, она и вовсе будет вредна. Но об этом ниже.

Private final String quadFS = "precision mediump float;n" + "uniform sampler2D uTexture0;n" + "uniform sampler2D uTexture1;n" + "uniform float uOffset;n" + "varying vec4 TexCoord0;n" + "void main() {n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);n" + " vec3 vOff = vTex.xyz * 255.0;n" + " float hiY = floor(vOff.y / 16.0);n" + " float loY = vOff.y - 16.0 * hiY;n" + " vec2 vCoord = vec2(n" + " (256.0 * loY + vOff.x) / 4095.0 + uOffset,n" + " (vOff.z * 16.0 + hiY) / 4095.0);n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));n" + "}n";

Ну это же совсем другое дело! С небольшими изменениями (добавив масштабирование «щипком» и вращение пальцем) я эту программу показывал своим друзьям и колегам, и при этом спрашивал, сколько, по их мнению, в этой сцене треугольников. Результаты варьировались, да и сам вопрос вызывал подозрение в наличии подвоха (в этом случае респонденты шутили «один», что было недалеко от истины), но правильный ответ стабильно удивлял. И все, как один, спрашивали: а почему сферу можно крутить вокруг одной оси, но нельзя наклонять?.. Хм.

Наклон

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

В сущности, задача сводится к тому, чтобы взять смещённую координату V , тогда как координата U не меняется: это происходит потому, что мы добавляем вращение вокруг оси X . План такой: преобразуем текстурные координаты в экранные (в диапазоне [-1..1]), применяем к ним матрицу поворота вокруг горизонтальной оси (для этого заранее запишем в новую константу uTilt синус и косинус угла наклона), а дальше воспользуемся новой координатой Y для выборки в нашей шаблонной текстуре. «Повёрнутая» координата Z нам тоже пригодится, с её помощью мы отзеркалим долготу для обратной стороны шарика). Экранную координату Z придётся посчитать явно, чтобы не делать две текстурных выборки из одной текстуры, заодно это повысит её точность.

Private final String quadFS = "precision mediump float;n" + "uniform sampler2D uTexture0;n" + "uniform sampler2D uTexture1;n" + "uniform float uOffset;n" + "uniform vec2 uTilt;n" + "varying vec4 TexCoord0;n" + "void main() {n" + " float sx = 2.0 * TexCoord0.x - 1.0;n" + " float sy = 2.0 * TexCoord0.y - 1.0;n" + " float z2 = 1.0 - sx * sx - sy * sy;n" + " if (z2 > 0.0) {;n" + " float sz = sqrt(z2);n" + " float y = (sy * uTilt.y - sz * uTilt.x + 1.0) * 0.5;n" + " float z = (sy * uTilt.x + sz * uTilt.y);n" + " vec4 vTex = texture2D(uTexture0, vec2(TexCoord0.x, y));n" + " vec3 vOff = vTex.xyz * 255.0;n" + " float hiY = floor(vOff.y / 16.0);n" + " float loY = vOff.y - 16.0 * hiY;n" + " vec2 vCoord = vec2(n" + " (256.0 * loY + vOff.x) / 4095.0,n" + " (vOff.z * 16.0 + hiY) / 4095.0);n" + " if (z < 0.0) { vCoord.x = 1.0 - vCoord.x; }n" + " vCoord.x += uOffset;n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;n" + " gl_FragColor = vec4(vCol * sz, 1.0);n" + " } else {n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);n" + " }n" + "}n";

Ура, наклон удался! Вот только странный шум на границе полушарий немного смущает. Увы, с этим мне пока не удалось справиться. Очевидно, проблема кроется в недостаточной точности адресации в граничных точках (точки на самой окружности соответствуют слишком большому диапазону координат, один тексель расползается на интервал довольно заметной длины), и с этим вряд ли что-то можно поделать. Что ж, зато можно приближать и скроллить шарик почти так же, как в Google Earth. С тем отличием, что здесь - всего-навсего два треугольника.

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

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

Иметь одну и ту же площадь;

Быть одинаковой формы;

Быть регулярно расположенными;

Обладать округлой формой;

Разбиение должно обеспечивать достаточно хорошее угловое разрешение;

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

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

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

Более подходящие разбиения можно получить путем проекции на единичную сферу правильных многогранников, центры которых совпадают с центром сферы. Грани правильного многогранника являются правильными многоугольниками (причем все они одинаковы). Следовательно, разбиение, полученное проекцией правильного многогранника, обладает тем свойством, что все ячейки обладают одной и той же формой и площадью. Кроме того, геометрическое расположение всех ячеек по отношению к соседям одинаково. К сожалению,

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

Рис. 16.14. (см. скан) Проектирование додекаэдра и икосаэдра на единичную сферу для получения разбиения на и ячеек.

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

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

Рис. 16.15. а - усеченный икосаэдр, представляющий собой полуправильный многогранник с 32 гранями; б - пента до декаэдр, состоящий из 60 треугольных граней. Более мелкие разбиеиия поверхности единичной сферы могут основываться на таких полуправильных многа-гранниках.

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

Каждая грань подразделяется на треугольные ячейки. Приведенная здесь сеть базируется на икосаэдре и имеет 12 вершин, к которым примыкают 5 ячеек. В остальных вершинах сходятся шесть ячеек.

форма некоторых граней уже перестает быть правильной. Пример разбиения, основанного на полуправильном многограннике, дает футбольный мяч (рис. 16.15, а). В качестве исходного здесь взят усеченный икосаэдр, т. е. тело, имеющее 12 пятиугольных и 20 шестиугольных граней. К сожалению, существует лишь 13 полуправильных многогранников (пять усеченных правильных многогранников, кубооктаэдр, икосододекаэдр, плосконосый куб, плосконосый икосододекаэдр, усеченный кубооктаэдр, ромбоокубоктаэдр, усеченный икосододекаэдр и ромбоикосододекаэдр). Они не приводят к достаточно мелким для наших целей разбиениям.

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

Действуя в том же направлении, можно подразделить каждый из полученных треугольников на четыре меньших треугольника в полном соответствии с хорошо известными в геодезии куполообразными конструкциями (рис. 16.16). Смягчением некоторых из перечисленных выше требований можно достичь высокого разрешения. На самом деле, лучше использовать двойственные конструкции, так как их грани в подавляющем большинстве являются (неправильными) шестиугольниками с рассредоточенными между ними 12 пятиугольниками (рис. 16.15, б). Этим способом можно обеспечить сколь угодно мелкие разбиения.

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

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

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

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