void MapWindow::Event_PanCursor(int dx, int dy) { int X= (MapRect.right+MapRect.left)/2; int Y= (MapRect.bottom+MapRect.top)/2; double Xstart, Ystart, Xnew, Ynew; Screen2LatLon(X, Y, Xstart, Ystart); X+= (MapRect.right-MapRect.left)*dx/4; Y+= (MapRect.bottom-MapRect.top)*dy/4; Screen2LatLon(X, Y, Xnew, Ynew); if(mode.AnyPan()) { PanLongitude += Xstart-Xnew; PanLatitude += Ystart-Ynew; } RefreshMap(); }
rectObj MapWindow::CalculateScreenBounds(double scale, const RECT& rc) { // compute lat lon extents of visible screen rectObj sb; if (scale>= 1.0) { POINT screen_center; LatLon2Screen(PanLongitude, PanLatitude, screen_center); sb.minx = sb.maxx = PanLongitude; sb.miny = sb.maxy = PanLatitude; unsigned int dx, dy; unsigned int maxsc=0; dx = screen_center.x-rc.right; dy = screen_center.y-rc.top; maxsc = max(maxsc, dx*dx+dy*dy); dx = screen_center.x-rc.left; dy = screen_center.y-rc.top; maxsc = max(maxsc, dx*dx+dy*dy); dx = screen_center.x-rc.left; dy = screen_center.y-rc.bottom; maxsc = max(maxsc, dx*dx+dy*dy); dx = screen_center.x-rc.right; dy = screen_center.y-rc.bottom; maxsc = max(maxsc, dx*dx+dy*dy); maxsc = isqrt4(maxsc); for (int i=0; i<10; i++) { double ang = i*360.0/10; POINT p; double X, Y; p.x = screen_center.x + iround(fastcosine(ang)*maxsc*scale); p.y = screen_center.y + iround(fastsine(ang)*maxsc*scale); Screen2LatLon(p.x, p.y, X, Y); sb.minx = min(X, sb.minx); sb.miny = min(Y, sb.miny); sb.maxx = max(X, sb.maxx); sb.maxy = max(Y, sb.maxy); } } else { double xmin, xmax, ymin, ymax; int x, y; double X, Y; x = rc.left; y = rc.top; Screen2LatLon(x, y, X, Y); xmin = X; xmax = X; ymin = Y; ymax = Y; x = rc.right; y = rc.top; Screen2LatLon(x, y, X, Y); xmin = min(xmin, X); xmax = max(xmax, X); ymin = min(ymin, Y); ymax = max(ymax, Y); x = rc.right; y = rc.bottom; Screen2LatLon(x, y, X, Y); xmin = min(xmin, X); xmax = max(xmax, X); ymin = min(ymin, Y); ymax = max(ymax, Y); x = rc.left; y = rc.bottom; Screen2LatLon(x, y, X, Y); xmin = min(xmin, X); xmax = max(xmax, X); ymin = min(ymin, Y); ymax = max(ymax, Y); sb.minx = xmin; sb.maxx = xmax; sb.miny = ymin; sb.maxy = ymax; } return sb; }