void LL_to_BearRange(double Lat_TP, double Long_TP, double Lat_Pnt, double Long_Pnt, double *Bearing, double *Range) { double pos_X, pos_Y; xLL_to_XY(Lat_TP, Long_TP, Lat_Pnt, Long_Pnt, &pos_X, &pos_Y); double bea; double ran; xXY_Brg_Rng(0,0,pos_X, pos_Y, &bea, &ran); *Bearing = bea; *Range = ran; }
// Used by dlgTarget only // A note about this function. We are changing map drawing parameters here, but we paint from the winmain thread. // We are NOT using this from drawthread! the dialog target pan is sort of an hack, and not a good example. // Do not consider emulating the target dialog, because it should be moved to draw thread somehow. void MapWindow::SetTargetPan(bool do_pan, int target_point, DWORD dlgSize /* = 0 */) { static double old_latitude; static double old_longitude; if(dlgSize) targetPanSize = dlgSize; if (!mode.Is(Mode::MODE_TARGET_PAN) || (TargetPanIndex != target_point)) { targetMoved = false; } TargetPanIndex = target_point; if (do_pan && !mode.Is(Mode::MODE_TARGET_PAN)) { old_latitude = PanLatitude; old_longitude = PanLongitude; mode.Special(do_pan ? Mode::MODE_SPECIAL_TARGET_PAN : Mode::MODE_SPECIAL_PAN, true); zoom.SwitchMode(); } if (do_pan) { LockTaskData(); if (ValidTaskPoint(target_point)) { PanLongitude = WayPointList[Task[target_point].Index].Longitude; PanLatitude = WayPointList[Task[target_point].Index].Latitude; if (target_point==0) { TargetZoomDistance = max(2e3, (double)StartRadius*2); } else if (!ValidTaskPoint(target_point+1)) { TargetZoomDistance = max(2e3, (double)FinishRadius*2); } else if (AATEnabled) { if (Task[target_point].AATType == SECTOR) { const double start = Task[target_point].AATStartRadial; const double finish = Task[target_point].AATFinishRadial; const double xs = fastsine(start); const double ys = fastcosine(start); const double xf = fastsine(finish); const double yf = fastcosine(finish); // calculate rectangle area taken by the sector const double top = AngleInRange(start, finish, 0, true) ? 1 : max(max(ys, yf), 0.0); const double right = AngleInRange(start, finish, 90, true) ? 1 : max(max(xs, xf), 0.0); const double bottom = AngleInRange(start, finish, 180, true) ? -1 : min(min(ys, yf), 0.0); const double left = AngleInRange(start, finish, 270, true) ? -1 : min(min(xs, xf), 0.0); // get area center const double radius = Task[target_point].AATSectorRadius; const double x = (left + right) / 2; const double y = (top + bottom) / 2; double bearing, range; xXY_Brg_Rng(0, 0, x, y, &bearing, &range); // find area center geographic data FindLatitudeLongitude(WayPointList[Task[target_point].Index].Latitude, WayPointList[Task[target_point].Index].Longitude, bearing, range * radius, &PanLatitude, &PanLongitude); TargetZoomDistance = max(2e3, max(right - left, top - bottom) * radius); } else { TargetZoomDistance = max(2e3, Task[target_point].AATCircleRadius*2); } } else { TargetZoomDistance = max(2e3, (double)SectorRadius*2); } } UnlockTaskData(); } else if (mode.Is(Mode::MODE_TARGET_PAN)) { PanLongitude = old_longitude; PanLatitude = old_latitude; mode.Special(Mode::MODE_SPECIAL_TARGET_PAN, do_pan); zoom.SwitchMode(); } mode.Special(Mode::MODE_SPECIAL_TARGET_PAN, do_pan); }