Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2018, 13:40   #1
adminsamara
Пользователь
 
Регистрация: 05.02.2014
Сообщений: 13
По умолчанию Перевести на delphi

Помогите перевести:

Код:
Friend Sub LatLongToPixelXYOSM(ByVal latitude As Double, ByVal longitude As Double, ByVal zoomLevel As Integer, ByRef pixelX As Integer, ByRef pixelY As Integer)
        Dim MinLatitude = -85.05112878
        Dim MaxLatitude = 85.05112878
        Dim MinLongitude = -180
        Dim MaxLongitude = 180
        Dim mapSize = Math.Pow(2, zoomLevel) * 256

        latitude = Clip(latitude, MinLatitude, MaxLatitude)
        longitude = Clip(longitude, MinLongitude, MaxLongitude)

        Dim p As PointF = New Point()
        p.X = CSng((longitude + 180.0) / 360.0 * (1 << zoomLevel))
        p.Y = CSng((1.0 - Math.Log(Math.Tan(latitude * Math.PI / 180.0) + 1.0 / Math.Cos(toRadians(latitude))) / Math.PI) / 2.0 * (1 << zoomLevel))

        Dim tilex As Integer = CInt(Math.Truncate(p.X))
        Dim tiley As Integer = CInt(Math.Truncate(p.Y))
        pixelX = ClipByRange((tilex * 256) + ((p.X - tilex) * 256), mapSize - 1)
        pixelY = ClipByRange((tiley * 256) + ((p.Y - tiley) * 256), mapSize - 1)
    End Sub

Friend Sub PixelXYToLatLongOSM(ByVal pixelX As Integer, ByVal pixelY As Integer, ByVal zoomLevel As Integer, ByRef latitude As Double, ByRef longitude As Double)
        Dim mapSize = Math.Pow(2, zoomLevel) * 256
        Dim tileX As Integer = Math.Truncate(pixelX / 256)
        Dim tileY As Integer = Math.Truncate(pixelY / 256)

        Dim p As PointF = New Point()
        Dim n As Double = Math.PI - ((2.0 * Math.PI * (ClipByRange(pixelY, mapSize - 1) / 256)) / Math.Pow(2.0, zoomLevel))

        longitude = CSng(((ClipByRange(pixelX, mapSize - 1) / 256) / Math.Pow(2.0, zoomLevel) * 360.0) - 180.0)
        latitude = CSng(180.0 / Math.PI * Math.Atan(Math.Sinh(n)))
    End Sub

Private Function ClipByRange(ByVal n As Double, ByVal range As Double)
        Return n Mod range
End Function

Private Function Clip(ByVal n As Double, ByVal minValue As Double, ByVal maxValue As Double)
      Return Math.Min(Math.Max(n, minValue), maxValue)
End Function
adminsamara вне форума Ответить с цитированием
Старый 15.08.2018, 14:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

да вроде бы ничего сложного - одна чистая математика, которая переписывается один в один.
возможно, что будут проблемы с точностью - это связанно с разным представлением вещественных чисел в VB и Delphi
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.08.2018, 14:51   #3
adminsamara
Пользователь
 
Регистрация: 05.02.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да вроде бы ничего сложного - одна чистая математика, которая переписывается один в один.
возможно, что будут проблемы с точностью - это связанно с разным представлением вещественных чисел в VB и Delphi
Я сталкивался только с delphi и не знаю, что значат команды:
Pow(2, zoomLevel)
(1 << zoomLevel)
и т.д. Не смог найти вот это: <<
adminsamara вне форума Ответить с цитированием
Старый 15.08.2018, 14:55   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от adminsamara Посмотреть сообщение
Я сталкивался только с delphi и не знаю, что значат команды
Pow, т.е. Power не знаете? Вы точно сталкивались?

Цитата:
Сообщение от adminsamara Посмотреть сообщение
(1 << zoomLevel)
и т.д. Не смог найти вот это: <<
Вас в гугле забанили или вы на уличце искали?
https://docs.microsoft.com/en-us/dot...shift-operator
p51x на форуме Ответить с цитированием
Старый 15.08.2018, 15:03   #5
adminsamara
Пользователь
 
Регистрация: 05.02.2014
Сообщений: 13
По умолчанию

Хорошо, с вышесказанным все понятно.

Что делают эти функции?
Код:
Private Function ClipByRange(ByVal n As Double, ByVal range As Double)
        Return n Mod range
End Function

Private Function Clip(ByVal n As Double, ByVal minValue As Double, ByVal maxValue As Double)
      Return Math.Min(Math.Max(n, minValue), maxValue)
End Function
adminsamara вне форума Ответить с цитированием
Старый 15.08.2018, 15:06   #6
adminsamara
Пользователь
 
Регистрация: 05.02.2014
Сообщений: 13
По умолчанию

Как перевести это на делфи? зачем
Код:
Выполняет арифметический сдвиг влево по битовому шаблону.
Код:
<<
adminsamara вне форума Ответить с цитированием
Старый 15.08.2018, 15:09   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от adminsamara Посмотреть сообщение
Что делают эти функции?
Mod, Min, Max все это было в делфи и паскале тоже, но все легко гуглится https://docs.microsoft.com/en-us/dot...s/mod-operator
Clip тоже более-менее устоявшиеся имя для этой операции
p51x на форуме Ответить с цитированием
Старый 15.08.2018, 15:09   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

mod остаток от деления
min и max
<< - shl
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.08.2018, 15:17   #9
adminsamara
Пользователь
 
Регистрация: 05.02.2014
Сообщений: 13
По умолчанию

Щас переведу отпишусь, проверите?!
adminsamara вне форума Ответить с цитированием
Старый 15.08.2018, 15:19   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Так запустите и проверьте...
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевести код программы из Pascal в Delphi 7 - Delphi ParkerVans Помощь студентам 2 29.05.2018 20:06
Delphi перевести в C++ hiypman C++ Builder 0 09.12.2017 17:04
Перевести на DELPHI felicita_091 БД в Delphi 15 25.10.2013 08:33
перевести с С++ на Delphi Ennchik Общие вопросы C/C++ 2 04.03.2013 23:52
Перевести с С++ на Delphi DeFaber Общие вопросы C/C++ 2 12.01.2008 06:02