openstreetmap карты и 3D сфера.


/** Mercator projection */
inline double mercator(double x) {
    return 0.5*log((1.0+sin(x))/(1.0-sin(x)));
}

/** Mercator un-projection */
inline double unmercator(double x) {
    return 2.0*atan(tanh(0.5*x));
}

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

Работает всё это так: пусть есть координаты в радианах:

lat ϵ (-π/2, π/2)
lon ϵ (-π, π)

взяв

x = lon
y = mercator(lat)

получим координаты на плоскости:

x ϵ (-π, π)
y ϵ (-∞, ∞)

из-за того что y может получаться большим по модулю, входную широту обычно ограничивают до примерно (-85.05°, 85.05°). Если так сделать, на выходе будет квадрат (-π,-π) - (π, π), который уже можно нормировать как удобно, собственно его вы и видите на openstreetmap.org. Да - полюса туда не попадают, и если этот квадрат натянуть на сферу, на полюсах будут дырки.

Можете ещё глянуть https://github.com/AMDmi3/glosm - там геометрия заданная в lat/lon может сворачиваться как в сферу, так и в меркаторную плоскость (http://glosm.amdmi3.ru/). Правда, без текстурирования.

Это потому, что Вы неправильно считаете текстурные координаты.
Почитайте о проекции Меркатора. Вам нужно просто сделать обратную проекцию.

Это я уже понял. Я не могу найти, как пересчитать из проекции меркатора в сферическую.

./libglosm-server/glosm/geomath.h
./libglosm-client/MercatorProjection.cc
или
./libglosm-client/SphericalProjection.cc ?

Первое - сама математика которую я процитировал выше, второе и третье - собственно реализации проекций [lat lon высота] в [x y z], и MercatorProjection использует те самые функции из geomath.

Я непонятно написал, то что они используют geomath.h я увидел, но что из них? Просто там нет комментариев, а мои скудные знания в этой области мне не помогают=)
чем отличаются mercator и unmercator?
И что мне использовать для пересчёта из меркатора в сферические:
MercatorProjection::ProjectImpl
MercatorProjection::UnProjectImpl
SphericalProjection::ProjectImpl
SphericalProjection::UnProjectImpl ?

Вы уж извините, что я не понимаю в этом, зато может другим не придётся спрашивать, если тоже такой вопрос возникнет=)
Спасибо.

оно? нет? ))

http://www.webglearth.com/#ll=0.00000,0.00000;alt=10000000;h=0.000;t=0.000

тут исходники
https://github.com/webglearth/webglearth

просто картинка)
test

почти, но мне нужно не web=) попробую там поискать формулы перевода, мне большего не нужно=)
Спасибо.

Тогда забудьте про glosm, используйте функции mercator/unmercator. Что делает первая я расписал, а вторая выполняет в точности обратное преобразование.

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

У меня тукстурные координаты по Y задаются в диапазоне от 0 до 1 (радиус сферы равен 1).
Для быстрой проверки переписал функцию меркатор на питоне и получил результаты:

После таких результатов я даже не знаю, что туда передавать, градусы или радианы?

Всем спасибо за помощь, решено тут http://www.prog.org.ru/topic_23408_15.html

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

Вопрос какой-то странный.
На вход тригонометрических функций всегда подают радианы.
На выходе получаем масштабирующий коэффициент.

Калькулятор с вами не сгласен. Правильный ответ: в чём принимает используемая тригонометрическая функция, то и передавать, см. доки на язык/либу.

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

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

Так, не?

PS. Подумал - да, был не прав, принял написанное где-то (возможно, здесь http://livit.ru/plane-driving/bases-aviation-cartography/print:page,1,327-cilindricheskie-proekcii.html)) на веру. Собственно, масштабный коэффициент строится именно из равенства коэффициентов растяжения по обеим осям. А центральная проекция этим свойством не обладает.
Но что такое “точки, диаметральной точке касания проекции и сферы” так и не понял: проекция касается сферы по кольцу, а не в точке. Если цилиндр касающийся, а не секущий, точка, через которую проходит луч, вдоль которого проектируем, - лежит на экваторе. Но она не может там лежать в проекции Меркатора. Иначе бы не было проблем с отображением полюсов.

Градусы, радианы, грады — стандартный набор, на одном выбирается движковым переключателем, на другом кнопкой ДРГ. Если говорить о библиотечных функциях ЯП, то возможны и более экзотические варианты, как полный оборот / 256 :slight_smile:
Это в алгебре приняты радианы, точнее там вообще не приняты какие-либо единицы, там числовая функция от числа, к углам не имеющая отношения вообще. В в прочей науке и технике может быть в любых единицах. Популярные в прошлом тригонометрические таблицы (Брадиса например) и логарифмические линейки показывали исключительно в градусах. И да, считать тригонометрию тейлором это не актуально, нынче рулит кордик. :slight_smile:

Угу, такая проекция тоже есть, только это не меркатор. (Если отталкиваться от теории, линия равноугольной проекции должна протыкать исходную и проективную поверхности под равными углами (так -/-/- или так --/-) иначе искажения углов, у тут она под прямым углом к сфере и под косым к цилиндру)

Это если на плоскость проектируем, а не на цилиндр, проще на картинке увидеть. На цилиндр наверное похожий выкрутас, но не такой

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

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

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

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

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

Сдается мне, что рулит прежде всего сопроцессор. А лучше кордика - LUT :slight_smile:

Одно другое, кстати, не исключает - FPU тоже работает по определенным алгоритмам.
Другое дело, что использование в FPU именно CORDIC мне тоже внушает некоторые сомнения.