public override void Redraw(object sender, EventArgs e)
        {
            var calculatedZoom = CalculateZoom();
            var percent        = 1 / calculatedZoom;

            ProjectedPositionCalculator positionCalculator;
            RectangleF drawRectangle;

            if (_objects.MainObject != null)
            {
                var realCenter      = _objects.MainObject.GetMiddle();
                var projectedCenter = new Point((int)Math.Round((double)_panel.Width * percent / 2),
                                                (int)Math.Round((double)_panel.Height * percent / 2));
                drawRectangle      = CalculateDisplayRectangle(realCenter, projectedCenter, percent);
                positionCalculator =
                    new ProjectedPositionCalculator(_objects.MainObject.GetMiddle(), projectedCenter, calculatedZoom);
            }
            else
            {
                var projectedCenter = new Point((int)Math.Round((double)_panel.Width * percent / 2),
                                                (int)Math.Round((double)_panel.Height * percent / 2));
                drawRectangle      = CalculateDisplayRectangle(staticCenter, projectedCenter, percent);
                positionCalculator = new ProjectedPositionCalculator(staticCenter, projectedCenter, calculatedZoom);
            }


            _graphicsBuffer.Graphics.Clear(Color);
            _objects.ScreenObjects.ForEach(x => DrawObject(x, drawRectangle, positionCalculator));
            actualFramerate.FrameDrawn();
            _graphicsBuffer.Render(_panelGraphics);
        }
예제 #2
0
        private void DrawMainObjectPath(ProjectedPositionCalculator ppCalc)
        {
            var position = _objects.MainObject.Location;
            var speed    = _objects.MainObject.Speed;
            var mass     = _objects.MainObject.Mass;

            for (var i = 0; i < 300; i++)
            {
                var forces = new Force(Angle.Zero, 0);
                foreach (var planet in _objects.Terrains)
                {
                    var distance = PointCalculator.Distance(position, planet.Location);
                    var angle    = PointCalculator.CalculateAngle(position, planet.Location);
                    forces += GravityCalculator.CalculateGravity(mass, planet.Mass, distance, angle);
                }

                var acceleration = forces.GetAcceleration(mass);
                speed += acceleration.GetSpeed(new TimeSpan(0, 0, 0, 10));

                if (speed.Value > 50000)
                {
                    break;
                }

                var flownDistance = speed.GetDistance(new TimeSpan(0, 0, 0, 10)).CalculateXAndY();
                position.X += (float)flownDistance.X;
                position.Y += (float)flownDistance.Y;
                var projectedPosition = ppCalc.ProjectPoint(position);
                _graphicsBuffer.Graphics.FillRectangle(new SolidBrush(Color.White), projectedPosition.X,
                                                       projectedPosition.Y, 1, 1);
            }
        }
예제 #3
0
        public void DrawSimple(Graphics g, ProjectedPositionCalculator ppCalc)
        {
            var start = ppCalc.ProjectPoint(new PointF(Location.X - radius, Location.Y - radius));
            var end   = ppCalc.ProjectPoint(new PointF(Location.X + radius, Location.Y + radius));
            var rect  = new RectangleF(start.X, start.Y, end.X - start.X, end.Y - start.Y);

            g.FillEllipse(new SolidBrush(color), rect);
        }
예제 #4
0
        public void Draw(Graphics g, ProjectedPositionCalculator ppCalc, RectangleF screen)
        {
            var points = new List <PointF>();

            var lastPoint    = new PointF();
            var pointOutside = false;

            var pointDistance   = allPoints.Count / 720;
            var distanceCounter = 0;
            var realPoints      = 0;

            foreach (var point in allPoints)
            {
                if (screen.Contains(point))
                {
                    distanceCounter = 0;
                    if (pointOutside)
                    {
                        pointOutside = false;
                        points.Add(ppCalc.ProjectPoint(lastPoint));
                        realPoints++;
                    }
                    else
                    {
                        points.Add(ppCalc.ProjectPoint(point));
                    }
                }
                else
                {
                    if (!pointOutside)
                    {
                        pointOutside = true;
                        points.Add(ppCalc.ProjectPoint(point));
                    }

                    if (distanceCounter > pointDistance)
                    {
                        points.Add(ppCalc.ProjectPoint(point));
                        distanceCounter = 0;
                    }

                    distanceCounter++;
                }

                lastPoint = point;
            }

            var b = new SolidBrush(color);

            if (points.Count == 0)
            {
                return;
            }

            g.FillPolygon(b, points.ToArray());
        }
예제 #5
0
        private void DrawObject(IScreenObject o, RectangleF panelBounds, ProjectedPositionCalculator positionCalculator)
        {
            var objectBounds = o.GetBounds();

            if (!panelBounds.IntersectsWith(objectBounds) && !panelBounds.Contains(objectBounds) &&
                !objectBounds.Contains(panelBounds))
            {
                return;
            }

            o.Draw(_graphicsBuffer.Graphics, positionCalculator, panelBounds);
        }
예제 #6
0
        private ProjectedPositionCalculator GetProjectedPositionCalculator()
        {
            var calculatedZoom = CalculateZoom(zoom);
            var percent        = 1 / calculatedZoom;

            var projectedCenter = new Point((int)Math.Round((double)_panel.Width * percent / 2),
                                            (int)Math.Round((double)_panel.Height * percent / 2));

            var center = fixOnMouse ? mouseCenter : _objects.MainObject.GetMiddle();

            return(lastPpCalc = new ProjectedPositionCalculator(center, projectedCenter, calculatedZoom));
        }
예제 #7
0
        private void DrawRocketAtAngle(Graphics g, ProjectedPositionCalculator ppCalc, AngularCalculator aCalc,
                                       int alpha = 255)
        {
            var spritePieces2 =
                _sprite.CalculatePolygons(Location, ppCalc, aCalc);

            foreach (var piece in spritePieces2)
            {
                var brush = new SolidBrush(Color.FromArgb(alpha, piece.Brush.Color.R, piece.Brush.Color.G, piece.Brush.Color.B));
                g.FillPolygon(brush, piece.Points.ToArray());
            }
        }
예제 #8
0
        public void Draw(Graphics g, ProjectedPositionCalculator ppCalc, RectangleF screen)
        {
            var aCalc        = new AngularCalculator((float)_angle.Degree * -1, Location);
            var spritePieces =
                _sprite.CalculatePolygons(Location, ppCalc, aCalc);

            foreach (var piece in spritePieces)
            {
                g.FillPolygon(piece.Brush, piece.Points.ToArray());
            }

            if (_engineRunning)
            {
                DrawFlames(g, ppCalc, aCalc);
            }
        }
예제 #9
0
        private void DrawFlames(Graphics g, ProjectedPositionCalculator ppCalc, AngularCalculator aCalc)
        {
            foreach (var thrustArea in _rocketInf.ThrustAreas)
            {
                var width = (thrustArea.Stop.X - Math.Abs(thrustArea.Start.X));

                var points = new List <PointF>
                {
                    ppCalc.ProjectPoint(aCalc.Turn(new PointF(Location.X + thrustArea.Start.X, Location.Y + thrustArea.Stop.Y))),
                    ppCalc.ProjectPoint(aCalc.Turn(new PointF(Location.X + thrustArea.Stop.X, Location.Y + thrustArea.Stop.Y))),
                    ppCalc.ProjectPoint(aCalc.Turn(new PointF(Location.X + width / 2, Location.Y + thrustArea.Stop.Y - Math.Abs(thrustArea.Stop.X - thrustArea.Start.X) * _thrustPercentage * (float)GetRandomNumber(3.5, 6))))
                };


                g.FillPolygon(new SolidBrush(Color.OrangeRed), points.ToArray());
            }
        }
예제 #10
0
        public void Draw(Graphics g, ProjectedPositionCalculator ppCalc, RectangleF screen)
        {
            if (Math.Abs(_angle.Degree - targetAngle.Degree) > 0.1)
            {
                var aCalc2 = new AngularCalculator((float)targetAngle.Degree * -1, Location);
                DrawRocketAtAngle(g, ppCalc, aCalc2, 100);
            }

            var aCalc = new AngularCalculator((float)_angle.Degree * -1, Location);

            DrawRocketAtAngle(g, ppCalc, aCalc);

            if (_engineRunning)
            {
                DrawFlames(g, ppCalc, aCalc);
            }
        }
예제 #11
0
        public List <RocketSpritePiece> CalculatePolygons(PointF pos, ProjectedPositionCalculator ppCalc, AngularCalculator aCalc)
        {
            var spritePieces = new List <RocketSpritePiece>();

            foreach (var spritePiece in _spritePieces)
            {
                var calculatedSpritePieces = new List <PointF>();
                foreach (var spritePiecePoint in spritePiece.Points)
                {
                    var x = (decimal)pos.X + (decimal)spritePiecePoint.X;
                    var y = (decimal)pos.Y + (decimal)spritePiecePoint.Y;
                    calculatedSpritePieces.Add(TurnAndProject(x, y, ppCalc, aCalc));
                }
                spritePieces.Add(new RocketSpritePiece(calculatedSpritePieces, spritePiece.Brush));
            }

            return(spritePieces);
        }
예제 #12
0
        private void DrawAllObjects(ProjectedPositionCalculator ppCalc)
        {
            foreach (var planet in _objects.Terrains)
            {
                planet.DrawSimple(_graphicsBuffer.Graphics, ppCalc);
            }

            var mainObject = _objects.MainObject;
            var loc        = mainObject.Location;
            var point1     = ppCalc.ProjectPoint(loc);
            var aCalc      = new AngularCalculator((float)mainObject._angle.Degree, point1);
            var point2     = aCalc.Turn(new PointF(point1.X, point1.Y - 10));
            var point3     = aCalc.Turn(new PointF(point1.X + 5, point1.Y + 5));
            var point4     = aCalc.Turn(new PointF(point1.X - 5, point1.Y + 5));
            var polygon    = new List <PointF> {
                point2, point3, point4
            };

            _graphicsBuffer.Graphics.FillPolygon(new SolidBrush(Color.LightGray), polygon.ToArray());
        }
예제 #13
0
        private void DrawMainObjectPath(ProjectedPositionCalculator ppCalc)
        {
            var points = OrbitPredictionCalculator.GetPredictedPointList(_objects.MainObject, _objects.Terrains,
                                                                         new TimeSpan(0, 60, 0), false);
            var point2s = OrbitPredictionCalculator.GetPredictedPointList(_objects.MainObject, _objects.Terrains,
                                                                          new TimeSpan(0, 60, 0), true);

            foreach (var point in points)
            {
                var projectedPosition = ppCalc.ProjectPoint(point);
                _graphicsBuffer.Graphics.FillRectangle(new SolidBrush(Color.White), projectedPosition.X,
                                                       projectedPosition.Y, 1, 1);
            }

            foreach (var point in point2s)
            {
                var projectedPosition = ppCalc.ProjectPoint(point);
                _graphicsBuffer.Graphics.FillRectangle(new SolidBrush(Color.Orange), projectedPosition.X,
                                                       projectedPosition.Y, 1, 1);
            }
        }
예제 #14
0
 private static PointF TurnAndProject(decimal x, decimal y, ProjectedPositionCalculator p, AngularCalculator aCalc)
 {
     return(p.ProjectPoint(aCalc.Turn(x, y)));
 }
예제 #15
0
 private static PointF TurnAndProject(float x, float y, ProjectedPositionCalculator p, AngularCalculator aCalc)
 {
     return(p.ProjectPoint(aCalc.Turn(new PointF(x, y))));
 }