Исходник программы, показывающей пример отображения отбрасываемой тени от вертикального стержня, когда солнце находится на заданном азимуте и высоте.
Можно изменять точку обзора, регулируя азимут, высоту и расстояние от основания стержня.
Немного позднее была добавлена возможность построить «аналемму» - фигуру, представляющую путь солнца, наблюдаемый из фиксированного места и времени суток в течение всего года. Поскольку земля наклонена относительно пути вокруг Солнца, и поскольку его путь немного эллиптический, аналемма или ее теневая версия отображает кривую фигуру 8. Точки азимута и высоты можно вводить индивидуально и нажимать кнопку «Построить точку тени». Лучшим методом является создание текстового файла значений азимута и высоты, по одной паре на строку, и использование кнопки «Загрузить аналемму» для загрузки и построения данных. Файл «Образец Analemma.txt», включенный в загрузку, содержит 24 значения полудня 1 и 15 числа каждого месяца для моего родного города.
Заметки для программистов
Я хотел бы дать вам краткий анализ математики, лежащей в основе рисования трехмерного теневого вида, но факт в том, что для рисования изображений было много проб и ошибок. Всего существует шесть параметров: азимут и высота определяют направление солнца от определенного места на земной поверхности в «горизонтальной системе координат». Азимут - это угол по часовой стрелке от севера, а высота - это угол над горизонтом. Третий параметр, влияющий на истинное положение кончика тени вертикального стержня (или человека) - это высота стержня. Для заданной высоты и высоты стержня (R) длину тени (L) можно получить, рассматривая прямоугольный треугольник, образованный стержнем, его тенью и солнечным лучом. Касательная (высота) = R / L, по которой мы можем определить круг с радиусом L, на котором будет лежать кончик тени. Азимутальный угол определяет, где именно на окружности лежит точка. Процедура RecalcBaseCircle делает это каждый раз, когда изменяется один из трех параметров позиции.
Базовый круг представляет точки кончика тени, как если бы мы стояли прямо над стержнем и смотрели прямо вниз. Когда мы удаляемся от стержня в заданном направлении на заданное расстояние с нашим глазом на заданной высоте, видимое положение тени изменяется. Эти три параметра «Глаз» определяют видимое расположение кончика тени на эллипсе. Этот набор точек рассчитывается процедурой RecalcVisualCircle. Он вызывается при изменении положения глаз или при изменении базовой окружности.
Третий набор тригонометрических вычислений явился результатом моего, возможно, глупого решения отображать буквы направления N, E, W, S, обозначающие положение нашего глаза по пеленгу (направлению) от стержня. Поскольку на самом деле мы не можем повернуть экран монитора, когда мы обходим стержень, мы должны вращать круг обзора и эти буквы на экране. Чтобы буквы выглядели так, как если бы они были нарисованы на земле, я решил вращать их, когда они движутся по кругу, концентрическому с кругом обзора, так, чтобы основание буквы всегда было обращено к стержню. Это выполняется процедурой SetFontAngle. Код для рисования букв содержится в процедуре PaintFigure, которая перерисовывает все изображение.