private static void DrawPointMass(IPointMass pointMass, Pen pen, Brush brush, Graphics g)
        {
            var triangle = new[] { new PointF(1, 0), new PointF(-0.7f, 0.7f), new PointF(-0.7f, -0.7f) };

            using (var m = new Matrix())
            {
                m.Translate(pointMass.Position.X, pointMass.Position.Y);
                m.Rotate((float)(Math.Atan2(pointMass.Velocity.Y, pointMass.Velocity.X) * 180 / Math.PI));
                m.Scale(pointMass.Radius*0.9f, pointMass.Radius*0.9f);
                m.TransformPoints(triangle);
            }

            g.FillPolygon(brush, triangle);
            g.DrawCircle(pen, pointMass.Position, pointMass.Radius);
        }
예제 #2
0
        public void DrawSpaceMap(Graphics g)
        {
            List<IDisposable> ListObjectsToDispose = new List<IDisposable>();

            #region INIT everything and DRAW Background

            int i, j, fleetNumber, podNumber, randomThreshold;
            double x, zy, z, xe, zye, ze, angle, radius1, radius2, radius3, angleStart, angleEnd;
            double sizeAnomaly, sizeVessel, sizeSelection,
                sizeNamelessBlackholeOuter, sizeNamelessBlackholeInner, sizeNamelessNebula, sizeNamelessAsteroid, sizeNamelessMineBright, sizeNamelessMineDark;
            string name;
            double screen_y_scale = Settings.Current.YScale * GetMapScale();

            //objects for every1
            Random rnd = new Random();

            //DRAW BACKGROUND
            g.Clear(Settings.Current.GetColor(MapColors.MapBackground));

            #endregion

            #region DRAW Nameless Objects

            // calculate sizes
            sizeNamelessNebula = Space.NebulaWidth * GetMapScale();
            sizeNamelessAsteroid = Space.AsteroidWidth * GetMapScale();
            sizeNamelessAsteroid = (sizeNamelessAsteroid < 7.0 ? 7.0 : sizeNamelessAsteroid);
            sizeNamelessMineBright = 9.0;
            sizeNamelessMineDark = 3.0;

            // nebulas
            Brush brushNebula = Settings.Current.GetBrush(MapColors.Nebula);
            ListObjectsToDispose.Add(brushNebula);
            Brush brushNebulaBG = Settings.Current.GetBrush(MapColors.NebulaBG);
            ListObjectsToDispose.Add(brushNebulaBG);
            Pen penNebula = new Pen(brushNebula, 1);
            ListObjectsToDispose.Add(penNebula);

            // astreoids
            Brush brushAsteroid = (sizeNamelessAsteroid > 12.5) ? Settings.Current.GetBrush(MapColors.AsteroidBright) : Settings.Current.GetBrush(MapColors.Asteroid);
            ListObjectsToDispose.Add(brushAsteroid);
            Brush brushAsteroidBG = Settings.Current.GetBrush(MapColors.AsteroidBG);
            ListObjectsToDispose.Add(brushAsteroidBG);
            Pen penAsteroid = new Pen(brushAsteroid, (int)Math.Round(sizeNamelessAsteroid / 5));
            ListObjectsToDispose.Add(penAsteroid);
            Pen penAsteroidBG = new Pen(brushAsteroidBG, (int)Math.Round(sizeNamelessAsteroid / 5));
            ListObjectsToDispose.Add(penAsteroidBG);

            // mines
            Brush brushMine = Settings.Current.GetBrush(MapColors.Mine);
            ListObjectsToDispose.Add(brushMine);
            Brush brushMineDark = Settings.Current.GetBrush(MapColors.MineDark);
            ListObjectsToDispose.Add(brushMineDark);
            Brush brushMineBG = Settings.Current.GetBrush(MapColors.MineBG);
            ListObjectsToDispose.Add(brushMineBG);
            Pen penMine = new Pen(brushMine, 1);
            ListObjectsToDispose.Add(penMine);
            Pen penMineDark = new Pen(brushMineDark, 1);
            ListObjectsToDispose.Add(penMineDark);
            Pen penMineBG = new Pen(brushMineBG, 1);
            ListObjectsToDispose.Add(penMineBG);

            //height
            Brush brushDarkHeight = Settings.Current.GetBrush(MapColors.MapNamelessHeightMarker);
            ListObjectsToDispose.Add(brushDarkHeight);
            Pen penDarkHeight = new Pen(brushDarkHeight, 1);
            ListObjectsToDispose.Add(penDarkHeight);

            // Background objects
            foreach (MapObjectNameless item in SpaceMap.BackgroundNamelessObjects)
            {
                randomThreshold = item._type == MapObjectNamelessType.asteroids ? 6 : 2; //random_threshold
                rnd = new Random(item.randomSeed);
                angleStart = item.A_Start_rad ?? 0.0;
                angleEnd = (item.A_End_rad ?? Math.PI * 2.0);
                if (angleStart > angleEnd)
                {
                    double tmp = angleEnd;
                    angleEnd = angleStart;
                    angleStart = tmp;
                }

                for (i = 0; i < item.count; i++)
                {
                    if (!DrawSpaceMap_GetPoint(screen_y_scale, rnd, item, i, angleStart, angleEnd, out x, out zy, out z))
                        continue;

                    if (!Settings.Current.UseYForNameless)
                        zy = z;

                    switch (item._type)
                    {
                        case MapObjectNamelessType.asteroids:
                            g.DrawCircle(penAsteroidBG, x, zy, sizeNamelessAsteroid);
                            break;
                        case MapObjectNamelessType.nebulas:
                            g.DrawCircle(penNebula, x, zy, sizeNamelessNebula);
                            g.FillCircle(brushNebulaBG, x, zy, sizeNamelessNebula);
                            break;
                        case MapObjectNamelessType.mines:
                            g.DrawCircle(penMineBG, x, zy, sizeNamelessMineBright);
                            break;
                    }
                }
            }

            foreach (MapObjectNameless item in SpaceMap.NamelessObjects)
            {
                randomThreshold = item._type == MapObjectNamelessType.asteroids ? 6 : 2; //random_threshold
                rnd = new Random(item.randomSeed);
                angleStart = item.A_Start_rad ?? 0.0;
                angleEnd = (item.A_End_rad ?? Math.PI * 2.0);
                if (angleStart > angleEnd)
                {
                    double tmp = angleEnd;
                    angleEnd = angleStart;
                    angleStart = tmp;
                }

                for (i = 0; i < item.count; i++)
                {
                    if (!DrawSpaceMap_GetPoint(screen_y_scale, rnd, item, i, angleStart, angleEnd, out x, out zy, out z))
                        continue;

                    if (!Settings.Current.UseYForNameless)
                        zy = z;

                    if (zy < z - randomThreshold)
                        DrawSpaceMap_DrawHeightLine(g, penDarkHeight, brushDarkHeight, x, zy, z);

                    switch (item._type)
                    {
                        case MapObjectNamelessType.asteroids:
                            g.DrawCircle(penAsteroid, x, zy, sizeNamelessAsteroid);
                            break;
                        case MapObjectNamelessType.nebulas:
                            g.FillCircle(brushNebula, x, zy, sizeNamelessNebula);
                            break;
                        case MapObjectNamelessType.mines:
                            g.DrawCircle(penMine, x, zy, sizeNamelessMineBright);
                            g.DrawCircle(penMineDark, x, zy, sizeNamelessMineDark);
                            break;
                    }
                    if (zy > z + randomThreshold)
                        DrawSpaceMap_DrawHeightLine(g, penDarkHeight, brushDarkHeight, x, zy, z);
                }
            }

            #endregion

            #region DRAW Grid and Quadrant captions

            Pen penGrid = new Pen(Settings.Current.GetColor(MapColors.MapGridLine), 1);
            ListObjectsToDispose.Add(penGrid);
            for (i = 0; i < 6; i++)
                g.DrawLine(penGrid,
                    PointXToScreen(i * 20000),
                    PointZToScreen(0),
                    PointXToScreen(i * 20000),
                    PointZToScreen(Space.MaxZ));
            for (i = 0; i < 6; i++)
                g.DrawLine(penGrid,
                    PointXToScreen(0),
                    PointZToScreen(i * 20000),
                    PointXToScreen(Space.MaxX),
                    PointZToScreen(i * 20000));

            //3. DRAW QUANDRANT CAPTIONS
            Brush brushQuadrant = Settings.Current.GetBrush(MapColors.MapGridLine);
            ListObjectsToDispose.Add(brushQuadrant);
            Font fontQuadrant = Settings.Current.GetFont(MapFonts.QuadrantText);
            if (fontQuadrant.Size > 2900.0 * GetMapScale())
            {
                fontQuadrant = new Font(fontQuadrant.FontFamily, (float)(2900.0 * GetMapScale()), fontQuadrant.Style);
                ListObjectsToDispose.Add(fontQuadrant);
            }
            for (i = 0; i < 5; i++)
                for (j = 0; j < 5; j++)
                    g.DrawString(Convert.ToChar(Convert.ToInt32('A') + j).ToString() + Convert.ToString(i + 1), fontQuadrant, brushQuadrant,
                        PointXToScreen(i * 20000 + 90),
                        PointXToScreen(j * 20000 + 20));

            #endregion

            #region INIT Named objects

            Brush brushHeight = Settings.Current.GetBrush(MapColors.MapHeightMarker);
            ListObjectsToDispose.Add(brushHeight);
            Pen penHeight = new Pen(brushHeight, 1);
            ListObjectsToDispose.Add(penHeight);

            //for all fonts that use center output
            StringFormat drawFormat = new StringFormat();
            ListObjectsToDispose.Add(drawFormat);
            drawFormat.Alignment = StringAlignment.Center;
            //for anomalies
            Brush brushAnomaly = Settings.Current.GetBrush(MapColors.Anomaly);
            ListObjectsToDispose.Add(brushAnomaly);
            sizeAnomaly = 1 + 100 * GetMapScale();
            //for vessels
            sizeVessel = 1 + 1500 * GetMapScale();
            sizeVessel = sizeVessel > 30 ? 30 : sizeVessel;
            Point vesselPoint0 = new Point(0, -70);
            Point vesselPoint1 = new Point(50, 50);
            Point vesselPoint2 = new Point(0, 05);
            Point vesselPoint3 = new Point(-50, 50);
            Point[] tp = new Point[4];
            //for enemies
            Brush brushEnemy = Settings.Current.GetBrush(MapColors.Enemy);
            ListObjectsToDispose.Add(brushEnemy);
            Brush brushEnemyBG = Settings.Current.GetBrush(MapColors.EnemyBG);
            ListObjectsToDispose.Add(brushEnemyBG);
            Pen penEnemyBG = new Pen(brushEnemyBG, 1);
            ListObjectsToDispose.Add(penEnemyBG);
            Font fontEnemy = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontEnemy.Size > sizeVessel / 2)
            {
                fontEnemy = new Font(fontEnemy.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f : (float)(sizeVessel / 2.0), fontEnemy.Style);
                ListObjectsToDispose.Add(fontEnemy);
            }
            Font fontFleet = Settings.Current.GetFont(MapFonts.FleetText);
            //for stations
            Brush brushStation = Settings.Current.GetBrush(MapColors.Station);
            ListObjectsToDispose.Add(brushStation);
            Pen penStation = new Pen(brushStation, RoundToNearestOddInt(sizeVessel / 5.0));
            ListObjectsToDispose.Add(penStation);
            Pen penStationBG = new Pen(Settings.Current.GetBrush(MapColors.StationBG), 1);
            ListObjectsToDispose.Add(penStationBG);
            Font fontStation = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontStation.Size > sizeVessel / 2)
            {
                fontStation = new Font(fontStation.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f : (float)(sizeVessel / 2.0), fontStation.Style);
                ListObjectsToDispose.Add(fontStation);
            }
            //for generics
            Brush brushGenericMesh = Settings.Current.GetBrush(MapColors.GenericMesh);
            ListObjectsToDispose.Add(brushGenericMesh);
            Pen penGenericMesh1 = new Pen(brushGenericMesh, RoundToNearestOddInt(sizeVessel / 5.0));
            ListObjectsToDispose.Add(penGenericMesh1);
            Pen penGenericMesh2 = new Pen(brushGenericMesh, FloorToIntNot2(sizeVessel / 10.0));
            ListObjectsToDispose.Add(penGenericMesh2);
            Brush brushGenericMeshSolid = new SolidBrush(Settings.Current.GetColor(MapColors.GenericMesh));
            ListObjectsToDispose.Add(brushGenericMeshSolid);
            Font fontGenericMesh = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontGenericMesh.Size > sizeVessel / 2)
            {
                fontGenericMesh = new Font(fontGenericMesh.FontFamily, sizeVessel / 2.0 < 8.0 ? 8 : (float)(sizeVessel / 2.0), fontGenericMesh.Style);
                ListObjectsToDispose.Add(fontGenericMesh);
            }
            Brush brushGenericMeshBG = Settings.Current.GetBrush(MapColors.GenericMeshBG);
            ListObjectsToDispose.Add(brushGenericMeshBG);
            Pen penGenericMeshBG = new Pen(brushGenericMeshBG, 1);
            ListObjectsToDispose.Add(penGenericMeshBG);
            //for monsters
            Brush brushMonster = Settings.Current.GetBrush(MapColors.Monster);
            ListObjectsToDispose.Add(brushMonster);
            Pen penMonster = new Pen(brushMonster, RoundToNearestOddInt(sizeVessel / 10.0));
            ListObjectsToDispose.Add(penMonster);
            Font fontMonster = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontMonster.Size > sizeVessel / 2)
            {
                fontMonster = new Font(fontMonster.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f : (float)(sizeVessel / 2.0), fontMonster.Style);
                ListObjectsToDispose.Add(fontMonster);
            }
            //for neutrals
            Brush brushNeutral = Settings.Current.GetBrush(MapColors.Neutral);
            ListObjectsToDispose.Add(brushNeutral);
            Font fontNeutral = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontNeutral.Size > sizeVessel / 2)
            {
                fontNeutral = new Font(fontNeutral.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f: (float)(sizeVessel / 2.0), fontNeutral.Style);
                ListObjectsToDispose.Add(fontNeutral);
            }
            Brush brushNeutralBG = Settings.Current.GetBrush(MapColors.NeutralBG);
            ListObjectsToDispose.Add(brushNeutralBG);
            Pen penNeutralBG = new Pen(brushNeutralBG, 1);
            ListObjectsToDispose.Add(penNeutralBG);
            //for player(s????)
            Brush brushPlayer = Settings.Current.GetBrush(MapColors.Player);
            ListObjectsToDispose.Add(brushPlayer);
            Font fontPlayer = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontPlayer.Size > sizeVessel / 2)
            {
                fontPlayer = new Font(fontPlayer.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f: (float)(sizeVessel / 2.0), fontPlayer.Style);
                ListObjectsToDispose.Add(fontPlayer);
            }
            Brush brushPlayerBG = Settings.Current.GetBrush(MapColors.PlayerBG);
            ListObjectsToDispose.Add(brushPlayerBG);
            Pen penPlayerBG = new Pen(brushPlayerBG, 1);
            ListObjectsToDispose.Add(penPlayerBG);
            //for whale(s????)
            Brush brushWhale = Settings.Current.GetBrush(MapColors.Whale);
            ListObjectsToDispose.Add(brushWhale);
            Font fontWhale = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontWhale.Size > sizeVessel / 2)
            {
                fontWhale = new Font(fontWhale.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f: (float)(sizeVessel / 2.0), fontWhale.Style);
                ListObjectsToDispose.Add(fontWhale);
            }
            Brush brushWhaleBG = Settings.Current.GetBrush(MapColors.WhaleBG);
            ListObjectsToDispose.Add(brushWhaleBG);
            Pen penWhaleBG = new Pen(brushWhaleBG, 1);
            ListObjectsToDispose.Add(penWhaleBG);
            //for BH
            sizeNamelessBlackholeOuter = 4750 * GetMapScale();
            sizeNamelessBlackholeInner = 550 * GetMapScale();
            Brush brushBlackHole = Settings.Current.GetBrush(MapColors.BlackHole);
            ListObjectsToDispose.Add(brushBlackHole);
            Pen penBlackHoleOuter = new Pen(brushBlackHole, RoundToNearestOddInt(sizeNamelessBlackholeOuter / 8.0));
            ListObjectsToDispose.Add(penBlackHoleOuter);
            Pen penBlackHoleInner = new Pen(brushBlackHole, (sizeNamelessBlackholeOuter < 275) ? RoundToNearestOddInt(sizeNamelessBlackholeOuter / 55.0) : 5);
            ListObjectsToDispose.Add(penBlackHoleInner);
            Font fontBlackHole = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontBlackHole.Size > sizeNamelessBlackholeOuter / 4)
            {
                fontBlackHole = new Font(fontBlackHole.FontFamily, sizeNamelessBlackholeOuter / 4.0 < 8.0 ? 8.0f : (float)(sizeNamelessBlackholeOuter / 4.0), fontBlackHole.Style);
                ListObjectsToDispose.Add(fontBlackHole);
            }
            Pen penBlackHoleBG = new Pen(brushBlackHole);
            ListObjectsToDispose.Add(penBlackHoleBG);
            Font fontAnomaly = Settings.Current.GetFont(MapFonts.ObjectText);
            if (fontAnomaly.Size > sizeVessel / 2)
            {
                fontAnomaly = new Font(fontAnomaly.FontFamily, sizeVessel / 2.0 < 8.0 ? 8.0f : (float)(sizeVessel / 2.0), fontAnomaly.Style);
                ListObjectsToDispose.Add(fontAnomaly);
            }

            #endregion

            #region DRAW Low priority Named Objects (black holes)

            foreach (MapObjectNamed mo in SpaceMap.NamedObjects)
            {
                x = PointXToScreen(mo.Coordinates.X_Scr);
                zy = PointZToScreen(mo.Coordinates.Z_Scr) - mo.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(mo.Coordinates.Z_Scr);

                if (!Settings.Current.UseYForNamed)
                    zy = z;

                switch (mo.TypeToString)
                {
                    case "blackHole":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        g.DrawCircle(penBlackHoleOuter, x , zy, sizeNamelessBlackholeOuter * 30.0 / 32);
                        g.DrawCircle(penBlackHoleInner, x , zy, sizeNamelessBlackholeInner * 32.0 / 32.0);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontBlackHole, brushBlackHole, x, zy - sizeNamelessBlackholeOuter * 16.0 / 32.0 - fontBlackHole.Size - RoundToNearestOddInt(sizeNamelessBlackholeOuter / 8.0) - 2.0, drawFormat);
                        break;
                }
            }

            foreach (MapObjectNamed mo in SpaceMap.BacgkroundNamedObjects)
            {
                x = PointXToScreen(mo.Coordinates.X_Scr);
                zy = PointZToScreen(mo.Coordinates.Z_Scr) - mo.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(mo.Coordinates.Z_Scr);

                if (!Settings.Current.UseYForNamed)
                    zy = z;

                switch (mo.TypeToString)
                {
                    case "blackHole":
                        g.DrawCircle(penBlackHoleBG, x, zy, sizeNamelessBlackholeOuter * 30.0 / 32.0);
                        break;
                }
            }

            #endregion

            #region DRAW BG Named Objects

            foreach (MapObjectNamed mo in SpaceMap.BacgkroundNamedObjects)
            {
                x = PointXToScreen(mo.Coordinates.X_Scr);
                zy = PointZToScreen(mo.Coordinates.Z_Scr) - mo.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(mo.Coordinates.Z_Scr);

                if (!Settings.Current.UseYForNamed)
                    zy = z;

                 switch (mo.TypeToString)
                {
                    case "enemy":
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel);
                        g.DrawPolygon(penEnemyBG, tp);
                        break;
                    case "player":
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel);
                        g.DrawPolygon(penPlayerBG, tp);
                        break;
                    case "whale":
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel * 0.8);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel * 0.8);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel * 0.8);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel * 0.8);
                        g.DrawPolygon(penWhaleBG, tp);
                        break;
                    case "neutral":
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel);
                        g.DrawPolygon(penNeutralBG, tp);
                        break;
                    case "station":
                        g.DrawCircle(penStationBG, x, zy, sizeVessel * 18.0 / 20.0);
                        break;
                    case "genericMesh":
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel * 0.8);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel * 0.8);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel * 0.8);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel * 0.8);
                        g.DrawCircle(penGenericMeshBG, x, zy, sizeVessel * 14.0 / 20.0);
                        break;

                }
            }

            #endregion

            #region DRAW Normal priority objects (all except anomalies and blackholes)

            foreach (MapObjectNamed mo in SpaceMap.NamedObjects)
            {
                x = PointXToScreen(mo.Coordinates.X_Scr);
                zy = PointZToScreen(mo.Coordinates.Z_Scr) - mo.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(mo.Coordinates.Z_Scr);
                if (!Settings.Current.UseYForNamed)
                    zy = z;

                switch (mo.TypeToString)
                {
                    case "enemy":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel);
                        g.FillPolygon(brushEnemy, tp);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontEnemy, brushEnemy, x, zy - fontEnemy.Size * 3.0 - 2.0, drawFormat);
                        bool fleetNumberNotInt = !Helper.IntTryParse(((MapObjectNamed_enemy)mo).fleetnumber, out  fleetNumber);
                        g.DrawStringD(fleetNumberNotInt  ? "x" : fleetNumber == -1 ? "" : fleetNumber >= 0 && fleetNumber <= 99 ? fleetNumber.ToString() : "<!>", fontFleet, brushEnemy, x + sizeVessel * 2.0 / 3.0 + 2.0, zy + sizeVessel * 2.0 / 3.0 + 2.0, StringFormat.GenericDefault);
                        break;
                    case "player":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel);
                        g.FillPolygon(brushPlayer, tp);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontPlayer, brushPlayer, x, zy - fontPlayer.Size * 3.0 - 2.0, drawFormat);
                        break;
                    case "whale":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel * 0.80);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel * 0.80);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel * 0.80);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel * 0.80);
                        g.FillPolygon(brushWhale, tp);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontWhale, brushWhale, x, zy - fontWhale.Size * 3.0 - 2.0, drawFormat);
                        bool podNumberNotInt = !Helper.IntTryParse(((MapObjectNamed_whale)mo).podnumber, out podNumber);
                        g.DrawStringD(podNumberNotInt ? "x" : (podNumber >= 0 && podNumber <= 9) ? podNumber.ToString() : "<!>", fontFleet, brushWhale, x + sizeVessel * 2.0 / 3.0 + 2.0, zy + sizeVessel * 2.0 / 3.0 + 2.0, StringFormat.GenericDefault);
                        break;
                    case "neutral":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel);
                        g.FillPolygon(brushNeutral, tp);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontNeutral, brushNeutral, x, zy - fontNeutral.Size * 3.0 - 2.0, drawFormat);
                        break;
                    case "station":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        g.DrawCircle(penStation, x, zy, sizeVessel * 18.0 / 20.0);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontStation, brushStation, x, zy - fontStation.Size * 3.0 - 2.0, drawFormat);
                        break;
                    case "genericMesh":
                        Pen penGenericMeshCurrent1, penGenericMeshCurrent2, penGenericMeshCurrent3;
                        Brush brushGenericMeshCurrent;
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        angle = ((MapObjectNamedA)mo).A_rad;
                        tp[0] = DrawSpaceMap_RotateScalePoint(vesselPoint0, x, zy, angle, sizeVessel * 0.80);
                        tp[1] = DrawSpaceMap_RotateScalePoint(vesselPoint1, x, zy, angle, sizeVessel * 0.80);
                        tp[2] = DrawSpaceMap_RotateScalePoint(vesselPoint2, x, zy, angle, sizeVessel * 0.80);
                        tp[3] = DrawSpaceMap_RotateScalePoint(vesselPoint3, x, zy, angle, sizeVessel * 0.80);
                        bool tooDark = false;
                        if (!Settings.Current.UseGenericMeshColor)
                        {
                            brushGenericMeshCurrent = brushGenericMeshSolid;
                            penGenericMeshCurrent1 = penGenericMesh1;
                            penGenericMeshCurrent2 = penGenericMesh2;
                            penGenericMeshCurrent3 = null;
                        }
                        else if (((MapObjectNamed_genericMesh)mo).Color_Blue * 0.0722 + ((MapObjectNamed_genericMesh)mo).Color_Green * 0.7152 + ((MapObjectNamed_genericMesh)mo).Color_Red * 0.2126 <= Settings.Current.MinimalLuminance)
                        {
                            //Code to mix the colors
                            //genericMeshBrushCurrent = new SolidBrush(((MapObjectNamed_genericMesh)mo).Color);
                            //genericMeshPenCurrent1 = new Pen(genericMeshBrushCurrent, __ro((db)s_v / 5));
                            //genericMeshPenCurrent2 = new Pen(genericMeshBrushCurrent, __rn2((db)s_v / 10));
                            //genericMeshPenCurrent3 = genericMeshPen1;
                            //genericMeshBrushCurrent = genericMeshSolidBrush;
                            //toodark = true;
                            brushGenericMeshCurrent = brushGenericMeshSolid;
                            penGenericMeshCurrent1 = penGenericMesh1;
                            penGenericMeshCurrent2 = penGenericMesh2;
                            penGenericMeshCurrent3 = null;
                        }
                        else
                        {
                            brushGenericMeshCurrent = new SolidBrush(((MapObjectNamed_genericMesh)mo).Color);
                            penGenericMeshCurrent1 = new Pen(brushGenericMeshCurrent, RoundToNearestOddInt(sizeVessel / 5.0));
                            penGenericMeshCurrent2 = new Pen(brushGenericMeshCurrent, FloorToIntNot2(sizeVessel / 10.0));
                            penGenericMeshCurrent3 = null;
                        }
                        if (tooDark)
                            g.DrawCircle(penGenericMeshCurrent3, x, zy, sizeVessel * 18.0 / 20.0);
                            g.DrawCircle(penGenericMeshCurrent1, x, zy, sizeVessel * 14.0 / 20.0);
                        g.DrawPolygon(penGenericMeshCurrent2, tp);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontGenericMesh, brushGenericMeshCurrent, x, zy - fontGenericMesh.Size * 3.0 - 2.0, drawFormat);
                        penGenericMeshCurrent1 = null;
                        penGenericMeshCurrent2 = null;
                        penGenericMeshCurrent3 = null;
                        break;
                    case "monster":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        g.DrawCircle(penMonster, x, zy, sizeVessel * 18.0 / 20.0);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontMonster, brushMonster, x, zy - fontMonster.Size * 3.0 - 2.0, drawFormat);
                        break;
                }
            }

            #endregion

            #region DRAW High priority named objects (anomalies)

            foreach (MapObjectNamed mo in SpaceMap.NamedObjects)
            {
                x = PointXToScreen(mo.Coordinates.X_Scr);
                zy = PointZToScreen(mo.Coordinates.Z_Scr) - mo.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(mo.Coordinates.Z_Scr);

                if (!Settings.Current.UseYForNamed)
                    zy = z;

                switch (mo.TypeToString)
                {
                    case "anomaly":
                        if (zy < z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        g.FillSquare(brushAnomaly, x, zy, sizeAnomaly);
                        if (zy > z)
                            DrawSpaceMap_DrawHeightLine(g, penHeight, brushHeight, x, zy, z);
                        name = string.IsNullOrEmpty(mo.name) ? "" : (string.IsNullOrWhiteSpace(mo.name) && Settings.Current.MarkWhitespaceNamesOnSpaceMap ? "<" + mo.name + ">" : mo.name);
                        g.DrawStringD(name, fontAnomaly, brushAnomaly, x, zy - fontAnomaly.Size * 3.0 - 2.0, drawFormat);
                        break;
                }
            }

            #endregion

            #region DRAW Selection brackets

            Pen penSelection = new Pen(Settings.Current.GetColor(MapColors.MapSelection));
            ListObjectsToDispose.Add(penSelection);
            Pen penSelectionDark = new Pen(Settings.Current.GetColor(MapColors.MapSelectionDark));
            ListObjectsToDispose.Add(penSelectionDark);
            sizeSelection = 10 + 1500 * GetMapScale();
            sizeSelection = sizeSelection > 40 ? 40 : sizeSelection;

            if (SpaceMap.SelectionNameless != null)
            {
                x = PointXToScreen(SpaceMap.SelectionNameless.CoordinatesStart.X_Scr);
                zy = PointZToScreen(SpaceMap.SelectionNameless.CoordinatesStart.Z_Scr) - SpaceMap.SelectionNameless.CoordinatesStart.Y_Scr * screen_y_scale;
                z = PointZToScreen(SpaceMap.SelectionNameless.CoordinatesStart.Z_Scr);
                xe = PointXToScreen(SpaceMap.SelectionNameless.CoordinatesEnd.X_Scr);
                zye = PointZToScreen(SpaceMap.SelectionNameless.CoordinatesEnd.Z_Scr) - SpaceMap.SelectionNameless.CoordinatesEnd.Y_Scr * screen_y_scale;
                ze = PointZToScreen(SpaceMap.SelectionNameless.CoordinatesEnd.Z_Scr);
                radius1 = (SpaceMap.SelectionNameless.radius + SpaceMap.SelectionNameless.randomRange) * GetMapScale();
                radius2 = SpaceMap.SelectionNameless.radius * GetMapScale();
                radius3 = radius2 * 2 - radius1;

                angleStart = SpaceMap.SelectionNameless.A_Start_deg ?? 0.0;
                angleEnd = SpaceMap.SelectionNameless.A_End_deg ?? 360.0;
                if (angleStart > angleEnd)
                {
                    double tmp = angleEnd;
                    angleEnd = angleStart;
                    angleStart = tmp;
                }
                angleEnd = angleEnd - angleStart;
                angleStart = angleStart - 90;

                //if (!_use_y_for_nameless)
                if (true)
                {
                    zy = z;
                    zye = ze;
                }

                if (SpaceMap.SelectionNameless.radius > 0)
                {
                    if (SpaceMap.SelectionNameless.A_Start_deg == null && SpaceMap.SelectionNameless.A_End_deg == null)
                    {
                        g.DrawCircle(penSelection, x, zy, radius2 * 2.0);
                    }
                    else
                    {
                        //Dark circle
                        g.DrawCircle(penSelectionDark, x, zy, radius2 * 2.0);
                        //Bright arc
                        g.DrawCircleArc(penSelection, x, zy, radius2 * 2.0, angleStart, angleEnd);
                        //Lines that show the arc boundaries
                        g.DrawLineD(penSelection, x, zy, x - (radius1 + sizeSelection * 1.5) * Math.Sin(Math.PI * 3.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0),
                                                        zy - (radius1 + sizeSelection * 1.5) * Math.Cos(Math.PI * 3.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0));
                        g.DrawLineD(penSelection, x, zy, x - (radius1 + sizeSelection * 1.5) * Math.Sin(Math.PI * 3.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0),
                                                        zy - (radius1 + sizeSelection * 1.5) * Math.Cos(Math.PI * 3.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0));
                        //Angles on the end of the arc boundaries
                        g.DrawLineD(penSelection,
                             x - (radius1 + sizeSelection * 1.5) * Math.Sin(Math.PI * 3.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0),
                            zy - (radius1 + sizeSelection * 1.5) * Math.Cos(Math.PI * 3.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0),
                             x - (radius1 + sizeSelection * 1.5) * Math.Sin(Math.PI * 3.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0) + sizeSelection / 4.0 * Math.Sin(Math.PI * 4.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0),
                            zy - (radius1 + sizeSelection * 1.5) * Math.Cos(Math.PI * 3.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0) + sizeSelection / 4.0 * Math.Cos(Math.PI * 4.0 / 2.0 - angleStart / 360.0 * Math.PI * 2.0));
                        g.DrawLineD(penSelection,
                             x - (radius1 + sizeSelection * 1.5) * Math.Sin(Math.PI * 3.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0),
                            zy - (radius1 + sizeSelection * 1.5) * Math.Cos(Math.PI * 3.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0),
                             x - (radius1 + sizeSelection * 1.5) * Math.Sin(Math.PI * 3.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0) + sizeSelection / 4.0 * Math.Sin(Math.PI * 2.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0),
                            zy - (radius1 + sizeSelection * 1.5) * Math.Cos(Math.PI * 3.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0) + sizeSelection / 4.0 * Math.Cos(Math.PI * 2.0 / 2.0 - (angleStart + angleEnd) / 360.0 * Math.PI * 2.0));
                    }

                    if (SpaceMap.SelectionNameless.randomRange > 0)
                    {
                        g.DrawCircle(penSelectionDark, x, zy, radius1 * 2.0);
                        if (radius3 > 0)
                            g.DrawCircle(penSelectionDark, x, zy, radius3 * 2.0);
                    }
                    //Crosshair on the rad2 of the circle
                    g.DrawLineD(penSelection, x, zy - radius2, x, zy - radius2 - sizeSelection / 2.0);
                    g.DrawLineD(penSelection, x, zy + radius2, x, zy + radius2 + sizeSelection / 2.0);
                    g.DrawLineD(penSelection, x - radius2, zy, x - radius2 - sizeSelection / 2.0, zy);
                    g.DrawLineD(penSelection, x + radius2, zy, x + radius2 + sizeSelection / 2.0, zy);
                }
                else
                {
                    //Get angle from start to end
                    // Negate X and Y values
                    double pxRes = x - xe;
                    double pyRes = zy - zye;
                    double angleSpan = 0.0;
                    // Calculate the angle
                    if (pxRes == 0.0)
                    {
                        if (pyRes == 0.0) angleSpan = 0.0;
                        else
                            if (pyRes > 0.0) angleSpan = System.Math.PI / 2.0;
                            else angleSpan = System.Math.PI * 3.0 / 2.0;
                    }
                    else if (pyRes == 0.0)
                    {
                        if (pxRes > 0.0) angleSpan = 0.0;
                        else angleSpan = System.Math.PI;
                    }
                    else
                    {
                        if (pxRes < 0.0)
                            angleSpan = System.Math.Atan(pyRes / pxRes) + System.Math.PI;
                        else
                            if (pyRes < 0.0) angleSpan = System.Math.Atan(pyRes / pxRes) + (2 * System.Math.PI);
                            else angleSpan = System.Math.Atan(pyRes / pxRes);
                    }

                    double angleLeft = (angleSpan - Math.PI / 2.0) * 360.0 / 2.0 / Math.PI;
                    double angleRight = (angleSpan + Math.PI / 2.0) * 360.0 / 2.0 / Math.PI;
                    while (angleLeft < 0.0) angleLeft += 360.0;
                    while (angleRight < 0.0) angleRight += 360.0;
                    while (angleLeft >= 360.0) angleLeft -= 360.0;
                    while (angleRight > 360.0) angleRight -= 360.0;

                    g.DrawLineD(penSelection, x, zy, xe, zye);
                    if (SpaceMap.SelectionNameless.randomRange > 0)
                    {
                        g.DrawLineD(penSelectionDark,
                              x + radius1 * Math.Cos(angleSpan + Math.PI / 2.0),
                             zy + radius1 * Math.Sin(angleSpan + Math.PI / 2.0),
                             xe + radius1 * Math.Cos(angleSpan + Math.PI / 2.0),
                            zye + radius1 * Math.Sin(angleSpan + Math.PI / 2.0));
                        g.DrawLineD(penSelectionDark,
                              x - radius1 * Math.Cos(angleSpan + Math.PI / 2.0),
                             zy - radius1 * Math.Sin(angleSpan + Math.PI / 2.0),
                             xe - radius1 * Math.Cos(angleSpan + Math.PI / 2.0),
                            zye - radius1 * Math.Sin(angleSpan + Math.PI / 2.0));
                        if (radius1 >= 1.0)
                        {
                            g.DrawCircleArc(penSelectionDark, x, zy, radius1 * 2.0, angleLeft, 180.0);
                            g.DrawCircleArc(penSelectionDark, xe, zye, radius1 * 2.0, angleRight, 180.0);
                        }
                    }

                    g.DrawLineD(penSelection, x, zy - radius2, x, zy - radius2 - sizeSelection / 2.0);
                    g.DrawLineD(penSelection, x, zy + radius2, x, zy + radius2 + sizeSelection / 2.0);
                    g.DrawLineD(penSelection, x - radius2, zy, x - radius2 - sizeSelection / 2.0, zy);
                    g.DrawLineD(penSelection, x + radius2, zy, x + radius2 + sizeSelection / 2.0, zy);
                    g.DrawLineD(penSelectionDark, xe, zye - radius2, xe, zye - radius2 - sizeSelection / 2.0);
                    g.DrawLineD(penSelectionDark, xe, zye + radius2, xe, zye + radius2 + sizeSelection / 2.0);
                    g.DrawLineD(penSelectionDark, xe - radius2, zye, xe - radius2 - sizeSelection / 2.0, zye);
                    g.DrawLineD(penSelectionDark, xe + radius2, zye, xe + radius2 + sizeSelection / 2.0, zye);
                }
            }
            else
            {
                foreach (MapObjectNamed mo in SpaceMap.GetSelectionNamed())
                {
                    x = PointXToScreen(mo.Coordinates.X_Scr);
                    zy = PointZToScreen(mo.Coordinates.Z_Scr) - mo.Coordinates.Y_Scr * screen_y_scale;
                    z = PointZToScreen(mo.Coordinates.Z_Scr);

                    if (!Settings.Current.UseYForNamed)
                        zy = z;

                    switch (mo.TypeToString)
                    {
                        case "anomaly":
                            g.DrawSquare(penSelection, x, zy, 20 + sizeAnomaly);
                            break;
                        case "blackHole":
                            g.DrawSquare(penSelection, x, zy, sizeNamelessBlackholeOuter * 36.0 / 32);
                            break;
                        default:
                            g.DrawSquare(penSelection, x, zy, sizeSelection);
                            break;
                    }
                }
            }

            #endregion

            #region DRAW Selection mean point and selection rectangle

            int vecx, vecy, vecz;
            if (SpaceMap.Selection_GetCenterOfMass(out vecx, out vecy, out vecz))
            {
                x = PointXToScreen(vecx);
                zy = PointZToScreen(vecz) - vecy * screen_y_scale;
                z = PointZToScreen(vecz);

                g.DrawLineD(penSelectionDark, x, z - sizeSelection / 2.0, x, z + sizeSelection / 2.0);
                g.DrawLineD(penSelectionDark, x - sizeSelection / 2.0, z, x + sizeSelection / 2.0, z);
            }

            //7. Draw selection rectangle when mass-selecting
            Brush brushSelectionRectangle = Settings.Current.GetBrush(MapColors.MapSelectionRectangle);
            ListObjectsToDispose.Add(brushSelectionRectangle);
            Pen penSelectionRectangle = new Pen(brushSelectionRectangle);
            ListObjectsToDispose.Add(penSelectionRectangle);

            if (GetFocused() && _beingSelected && (_curPointX != _selectPointX || _curPointY != _selectPointY))
            {
                xe = Math.Max(_curPointX, _selectPointX);
                ze = Math.Max(_curPointY, _selectPointY);
                x = Math.Min(_curPointX, _selectPointX);
                z = Math.Min(_curPointY, _selectPointY);

                g.DrawRectangleD(penSelectionRectangle, x, z, xe - x, ze - z);
            }

            #endregion

            #region DRAW Special Object

            if (SpaceMap.SelectionSpecial is SpecialMapObject_DestroyCircle)
            {
                SpecialMapObject_DestroyCircle item = (SpecialMapObject_DestroyCircle)SpaceMap.SelectionSpecial;
                Brush brushHeightSpecial = new HatchBrush(HatchStyle.WideDownwardDiagonal, penHeight.Color);
                ListObjectsToDispose.Add(brushHeightSpecial);
                Pen penHeightSpecial = new Pen(brushHeightSpecial);
                ListObjectsToDispose.Add(penHeightSpecial);

                x = PointXToScreen(item.Coordinates.X_Scr);
                zy = PointZToScreen(item.Coordinates.Z_Scr) - item.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(item.Coordinates.Z_Scr);
                radius2 = item.Radius * GetMapScale();

                if (!Settings.Current.UseYForSelection)
                    zy = z;

                if (zy < z)
                {
                    g.DrawLineD(penHeightSpecial, x - radius2, zy, x - radius2, z);
                    g.DrawLineD(penHeightSpecial, x + radius2, zy, x + radius2, z);
                }
                //Crosshair at the middle of the bg circle
                g.DrawLineD(penDarkHeight, x, z - sizeSelection / 4.0, x, z + sizeSelection / 4.0);
                g.DrawLineD(penDarkHeight, x - sizeSelection / 4.0, z, x + sizeSelection / 4.0, z);
                //Line from the middle of zy to the middle of the z
                g.DrawLineD(penHeightSpecial, x, zy, x, z);
                //Circle
                g.DrawCircle(penSelection, x, zy, radius2 * 2.0);
                //Crosshair around the radius
                g.DrawLineD(penSelection, x, zy - radius2, x, zy - radius2 - sizeSelection / 2.0);
                g.DrawLineD(penSelection, x, zy + radius2, x, zy + radius2 + sizeSelection / 2.0);
                g.DrawLineD(penSelection, x - radius2, zy, x - radius2 - sizeSelection / 2.0, zy);
                g.DrawLineD(penSelection, x + radius2, zy, x + radius2 + sizeSelection / 2.0, zy);
                //Crosshair at the middle of the circle
                g.DrawLineD(penSelection, x, zy - sizeSelection / 4.0, x, zy + sizeSelection / 4.0);
                g.DrawLineD(penSelection, x - sizeSelection / 4.0, zy, x + sizeSelection / 4.0, zy);
                if (zy > z)
                {
                    g.DrawLineD(penHeightSpecial, x - radius2, zy, x - radius2, z);
                    g.DrawLineD(penHeightSpecial, x + radius2, zy, x + radius2, z);
                }
                //y circle
                if (Settings.Current.UseYForSelection && radius2 >= 1.0)
                {
                    int num = 36;
                    for (i = 0; i < num; i++)
                        g.DrawCircleArc(penHeight, x, z, radius2 * 2.0, i * 360.0 / num, 360.0 / num / 4.0);
                }
            }

            if (SpaceMap.SelectionSpecial is SpecialMapObject_PointTarget)
            {
                SpecialMapObject_PointTarget item = (SpecialMapObject_PointTarget)SpaceMap.SelectionSpecial;
                Brush brushHeightSpecial = new HatchBrush(HatchStyle.WideDownwardDiagonal, penHeight.Color);
                ListObjectsToDispose.Add(brushHeightSpecial);
                Pen penHeightSpecial = new Pen(brushHeightSpecial);
                ListObjectsToDispose.Add(penHeightSpecial);

                x = PointXToScreen(item.Coordinates.X_Scr);
                zy = PointZToScreen(item.Coordinates.Z_Scr) - item.Coordinates.Y_Scr * screen_y_scale;
                z = PointZToScreen(item.Coordinates.Z_Scr);

                if (!Settings.Current.UseYForSelection)
                    zy = z;

                //Crosshair at the middle of the bg circle
                g.DrawLineD(penDarkHeight, x, z - sizeSelection / 4.0, x, z + sizeSelection / 4.0);
                g.DrawLineD(penDarkHeight, x - sizeSelection / 4.0, z, x + sizeSelection / 4.0, z);
                //Line from the middle of zy to the middle of the z
                g.DrawLineD(penHeightSpecial, x, zy, x, z);
                //Crosshair at the middle of the circle
                g.DrawLineD(penSelection, x, zy - sizeSelection / 4.0, x, zy + sizeSelection / 4.0);
                g.DrawLineD(penSelection, x - sizeSelection / 4.0, zy, x + sizeSelection / 4.0, zy);
            }

            if (SpaceMap.SelectionSpecial is SpecialMapObject_BoxSphere)
            {
                SpecialMapObject_BoxSphere item = (SpecialMapObject_BoxSphere)SpaceMap.SelectionSpecial;
                Brush brushHeightSpecial = new HatchBrush(HatchStyle.WideDownwardDiagonal, penHeight.Color);
                ListObjectsToDispose.Add(brushHeightSpecial);
                Pen penHeightSpecial = new Pen(brushHeightSpecial);
                ListObjectsToDispose.Add(penHeightSpecial);

                if (item.SphereBox == SphereBox.Sphere)
                {
                    x = PointXToScreen(item.CoordinatesStart.X_Scr);
                    zy = PointZToScreen(item.CoordinatesStart.Z_Scr) - item.CoordinatesStart.Y_Scr * screen_y_scale;
                    z = PointZToScreen(item.CoordinatesStart.Z_Scr);
                    radius2 = item.Radius * GetMapScale();
                    radius3 = sizeSelection / 2 > radius2 / 2 && item.InOut == InsideOutside.Outside ? radius2 / 2 : sizeSelection / 2;
                    radius3 = item.InOut == InsideOutside.Inside ? radius3 : -radius3;

                    if (!Settings.Current.UseYForSelection)
                        zy = z;

                    if (zy < z)
                    {
                        g.DrawLineD(penHeightSpecial, x - radius2, zy, x - radius2, z);
                        g.DrawLineD(penHeightSpecial, x + radius2, zy, x + radius2, z);
                    }
                    //Crosshair at the middle of the bg circle
                    g.DrawLineD(penDarkHeight, x, z - sizeSelection / 4.0, x, z + sizeSelection / 4.0);
                    g.DrawLineD(penDarkHeight, x - sizeSelection / 4.0, z, x + sizeSelection / 4.0, z);
                    //Line froDm the middle of zy to the middle of the z
                    g.DrawLineD(penHeightSpecial, x, zy, x, z);
                    //Circle
                    g.DrawCircle(penSelection, x, zy, radius2 * 2.0);
                    //Crosshair around the radius
                    g.DrawLineD(penSelection, x, zy - radius2, x, zy - radius2 - radius3);
                    g.DrawLineD(penSelection, x, zy + radius2, x, zy + radius2 + radius3);
                    g.DrawLineD(penSelection, x - radius2, zy, x - radius2 - radius3, zy);
                    g.DrawLineD(penSelection, x + radius2, zy, x + radius2 + radius3, zy);
                    //Crosshair at the middle of the circle
                    g.DrawLineD(penSelection, x, zy - sizeSelection / 4.0, x, zy + sizeSelection / 4.0);
                    g.DrawLineD(penSelection, x - sizeSelection / 4.0, zy, x + sizeSelection / 4.0, zy);
                    if (zy > z)
                    {
                        g.DrawLineD(penHeightSpecial, x - radius2, zy, x - radius2, z);
                        g.DrawLineD(penHeightSpecial, x + radius2, zy, x + radius2, z);
                    }
                    //y circle
                    if (Settings.Current.UseYForSelection && radius2 >= 1.0)
                    {
                        int num = 36;
                        for (i = 0; i < num; i++)
                            g.DrawCircleArc(penHeight, x, z, radius2 * 2.0, i * 360.0 / num, 360.0 / num / 4.0);
                    }
                }
                else
                {
                    x = PointXToScreen(Math.Min(item.CoordinatesStart.X_Scr, item.CoordinatesEnd.X_Scr));
                    z = PointZToScreen(Math.Min(item.CoordinatesStart.Z_Scr, item.CoordinatesEnd.Z_Scr));
                    xe = PointXToScreen(Math.Max(item.CoordinatesStart.X_Scr, item.CoordinatesEnd.X_Scr));
                    ze = PointZToScreen(Math.Max(item.CoordinatesStart.Z_Scr, item.CoordinatesEnd.Z_Scr));
                    radius2 = 3.5;
                    radius3 = sizeSelection / 2 > Math.Min(xe - x, ze - z) / 2 && item.InOut == InsideOutside.Outside ? Math.Min(xe - x, ze - z) / 2 : sizeSelection / 2;
                    radius3 = item.InOut == InsideOutside.Inside ? radius3 : -radius3;

                    g.DrawRectangleD(penSelection, x, z, xe - x, ze - z);

                    g.DrawLineD(penSelection, x, z / 2.0 + ze / 2.0, x - radius3, z / 2.0 + ze / 2.0);
                    g.DrawLineD(penSelection, x / 2.0 + xe / 2.0, z, x / 2.0 + xe / 2.0, z - radius3);
                    g.DrawLineD(penSelection, xe, z / 2 + ze / 2.0, xe + radius3, z / 2.0 + ze / 2.0);
                    g.DrawLineD(penSelection, x / 2.0 + xe / 2.0, ze, x / 2.0 + xe / 2.0, ze + radius3);

                    x = PointXToScreen(item.CoordinatesStart.X_Scr);
                    z = PointZToScreen(item.CoordinatesStart.Z_Scr);
                    xe = PointXToScreen(item.CoordinatesEnd.X_Scr);
                    ze = PointZToScreen(item.CoordinatesEnd.Z_Scr);

                    g.DrawCircle(penSelection, x, z, radius2 * 2.0);
                    g.DrawSquare(penSelection, xe, ze, radius2 * 2.0);
                }
            }
            #endregion

            #region Dispose
            foreach (IDisposable objectToDispose in ListObjectsToDispose)
                objectToDispose.Dispose();
            #endregion
        }
        private void DrawAxesAndCircle(Graphics g)
        {
            Pen myPen = new Pen(Color.Black, 2);

            DrawMathLine(g, myPen, -2, (0), (2), (0));
            DrawMathLine(g, myPen, (0), (-2), (0), (2));

            var x = MathXtoScreenX(0);
            var y = MathYtoScreenY(0);

            g.DrawCircle(myPen, x, y, (float)_radius);
        }