//-------------------------------------------------------------------------
 // Makes sure the lat/lon point is visible in the current map view, if not
 // centre the view on the co-ordinates without changing the zoom level.
 public void EnsurePointIsInView(double latitudeDeg, double longitudeDeg)
 {
     if (CurrentMapPosition == null || !CurrentMapPosition.CanSeePoint(latitudeDeg, longitudeDeg))
     {
         CentreMap(latitudeDeg, longitudeDeg);
     }
 }
        public void runonce()
        {
            // rotate left
            if (fKeyLeft)
            {
                if ((fPlayerArc -= ANGLE10) < ANGLE0)
                {
                    fPlayerArc += ANGLE360;
                }
            }
            // rotate right
            else if (fKeyRight)
            {
                if ((fPlayerArc += ANGLE10) >= ANGLE360)
                {
                    fPlayerArc -= ANGLE360;
                }
            }

            //  _____     _
            // |\ arc     |
            // |  \       y
            // |    \     |
            //            -
            // |--x--|
            //
            //  sin(arc)=y/diagonal
            //  cos(arc)=x/diagonal   where diagonal=speed
            double playerXDir = fCosTable[fPlayerArc];
            double playerYDir = fSinTable[fPlayerArc];

            // move forward
            if (fKeyUp)
            {
                fPlayerX += (int)(playerXDir * fPlayerSpeed);
                fPlayerY += (int)(playerYDir * fPlayerSpeed);
            }
            // move backward
            else if (fKeyDown)
            {
                fPlayerX -= (int)(playerXDir * fPlayerSpeed);
                fPlayerY -= (int)(playerYDir * fPlayerSpeed);
            }


            // get walls

            ClipPlayer();
            showStatus(CurrentMapPosition.ToString());



            //render();
        }
        //-------------------------------------------------------------------------
        public void ChangeView(double centreLatDeg, double centreLonDeg, double widthDeg, double heightDeg)
        {
            RaiseChangeViewEvent(new ChangeViewEventEventArgs(centreLatDeg, centreLonDeg, widthDeg, heightDeg));

            double level = 1.0;

            if (Map?.TileProvider != null)
            {
                level = Map.TileProvider.Level;
            }

            CurrentMapPosition.Update(centreLatDeg, centreLonDeg, widthDeg, heightDeg, level);
        }
        //*******************************************************************//
        //* Running thread
        //*******************************************************************//
        public void run()
        {
            requestFocus();
            // create offscreen buffer
            fOffscreenImage    = createImage(getSize().width, getSize().height);
            fOffscreenGraphics = fOffscreenImage.getGraphics();

            while (fThread != null)
            {
                // rotate left
                if (fKeyLeft)
                {
                    if ((fPlayerArc -= ANGLE10) < ANGLE0)
                    {
                        fPlayerArc += ANGLE360;
                    }
                }
                // rotate right
                else if (fKeyRight)
                {
                    if ((fPlayerArc += ANGLE10) >= ANGLE360)
                    {
                        fPlayerArc -= ANGLE360;
                    }
                }

                //  _____     _
                // |\ arc     |
                // |  \       y
                // |    \     |
                //            -
                // |--x--|
                //
                //  sin(arc)=y/diagonal
                //  cos(arc)=x/diagonal   where diagonal=speed
                double playerXDir = fCosTable[fPlayerArc];
                double playerYDir = fSinTable[fPlayerArc];

                // move forward
                if (fKeyUp)
                {
                    fPlayerX += (int)(playerXDir * fPlayerSpeed);
                    fPlayerY += (int)(playerYDir * fPlayerSpeed);
                }
                // move backward
                else if (fKeyDown)
                {
                    fPlayerX -= (int)(playerXDir * fPlayerSpeed);
                    fPlayerY -= (int)(playerYDir * fPlayerSpeed);
                }


                // get walls

                ClipPlayer();
                showStatus(CurrentMapPosition.ToString());



                render();
                try
                {
                    Thread.sleep(50);
                }
                catch //(System.Exception sleepProblem)
                {
                    showStatus("Sleep problem");
                }
            }
        }