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); }
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); } }
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); }
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()); }
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); }
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)); }
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()); } }
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); } }
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()); } }
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); } }
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); }
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()); }
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); } }
private static PointF TurnAndProject(decimal x, decimal y, ProjectedPositionCalculator p, AngularCalculator aCalc) { return(p.ProjectPoint(aCalc.Turn(x, y))); }
private static PointF TurnAndProject(float x, float y, ProjectedPositionCalculator p, AngularCalculator aCalc) { return(p.ProjectPoint(aCalc.Turn(new PointF(x, y)))); }