Преглед на карта на играта MouseX,Y до Long,Latitude

Не съм сигурен как да формулирам това правилно, но работих върху програма за преглед на карти, която зарежда файл с растерно изображение на Direct2D повърхност. Искам обаче координатите X,Y на мишката за преглед на карти да съответстват на тези, подобни на координатите на играта.

Ето примерна снимка на това, което имам предвид:

http://i.stack.imgur.com/FOaxG.png

Левият преглед на карти е отделно приложение, опитвам се да имитирам това в моя собствен преглед на карти, но можете да видите, че съм в долния ляв ъгъл и на двата формуляра и координатите не съвпадат с дължината/широчината на моя преглед на карти .

Ние сме широки 4624 пиксела, долният ляв ъгъл трябва да се преобразува в Lon: 16384 Lat: 24577, докато горният десен ъгъл ще се преобразува в Lon: 90111 Lat: 98304

var
  BSize: TD2DSizeF;
  S4, S5: string;
  FPos: TPoint;
begin
  S4 := 'Longitude: '+FloatToStr((BSize.Width / 360) * (180 + FPos.X));
  S5 := 'Latitude: '+FloatToStr((BSize.Height / 180) * (90 - FPos.Y));

Може ли някой да ме насочи в правилната посока, за да реша това? Грешно ли разбирам концепцията?


person Joe    schedule 20.08.2014    source източник
comment
Бих изчислил първо число между 0-1, което е количеството напречно (x) или нагоре/надолу (Y) в цялото изображение - например 0 е отляво, 1 е отдясно. След това умножете това по ширината и добавете най-лявата координата и същото за височината и най-долната.   -  person David    schedule 20.08.2014


Отговори (1)


Ако съм те разбрал правилно, формулите трябва да бъдат:

Lon := 16384 + x / MaxX * (90111 - 16384);
Lat := 98304 - y / MaxY * (98304 - 24577);

Където MaxX и MaxY са пикселните координати на долния десен ъгъл (т.е. Width - 1 и Height - 1, съответно).

person adlabac    schedule 20.08.2014
comment
Подозирам, че ако изображението беше в Zoom, ще трябва да разделя тази формула на Zoom? Lon := (16384 + FPos.X) / (ClientWidth - 1) * (90111 - 16384) / FZoom; - person Joe; 21.08.2014
comment
Ако ширината и дължината на ъглите са едни и същи, единственото нещо, което се променя, е MAxX (т.е. NewWidth - 1) и MaxY (т.е. NewHeight - 1). - person adlabac; 22.08.2014
comment
Но подозирам, че чрез мащабиране предполагате, че прозорецът ще остане същият, докато ширината и дължината ще се променят. В такъв случай трябва просто да замените новия ъгъл Lat/Lon във формулите по-горе. - person adlabac; 22.08.2014