public override object Clone() { MotorCar car = (MotorCar)base.Clone(); car.Acceleration = (Acceleration)Acceleration.Clone(); car.Motor = (Motor)Motor.Clone(); return(car); }
private double GetDeceleration(MotorCar car, double velocity) { const double AccelerationDueToGravity = 9.80665; const double AirDensity = 1.22497705587732; velocity /= 3.6; double mass = car.Mass * 1000.0; double frontalArea = Cars.IndexOf(car) == 0 ? car.ExposedFrontalArea : car.UnexposedFrontalArea; double f = frontalArea * car.Performance.AerodynamicDragCoefficient * AirDensity / (2.0 * mass); double a = AccelerationDueToGravity * car.Performance.CoefficientOfRollingResistance + f * Math.Pow(velocity, 2.0); return(a * 3.6); }
internal void DrawAccelerationImage(MotorCar car) { CultureInfo culture = CultureInfo.InvariantCulture; Bitmap image = new Bitmap(car.Acceleration.ImageWidth, car.Acceleration.ImageHeight); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image); g.CompositingQuality = CompositingQuality.HighQuality; g.InterpolationMode = InterpolationMode.High; g.SmoothingMode = SmoothingMode.AntiAlias; g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; g.Clear(Color.Black); Font font = new Font("MS UI Gothic", 7.0f); Pen grayPen = new Pen(Color.DimGray); Brush grayBrush = Brushes.DimGray; // vertical grid for (double v = 0.0; v < car.Acceleration.MaxVelocity; v += 10.0) { float x = (float)car.Acceleration.VelocityToX(v); g.DrawLine(grayPen, new PointF(x, 0.0f), new PointF(x, car.Acceleration.ImageHeight)); g.DrawString(v.ToString("0", culture), font, grayBrush, new PointF(x, 1.0f)); } // horizontal grid for (double a = 0.0; a < car.Acceleration.MaxAcceleration; a += 1.0) { float y = (float)car.Acceleration.AccelerationToY(a); g.DrawLine(grayPen, new PointF(0.0f, y), new PointF(car.Acceleration.ImageWidth, y)); g.DrawString(a.ToString("0", culture), font, grayBrush, new PointF(1.0f, y)); } DrawDecelerationCurve(g, car); foreach (Acceleration.Entry entry in car.Acceleration.Entries) { if (entry != car.Acceleration.SelectedEntry) { DrawAccelerationCurve(g, car, entry, false); } } DrawAccelerationCurve(g, car, car.Acceleration.SelectedEntry, true); car.Acceleration.Image = image; }
private void DrawDecelerationCurve(System.Drawing.Graphics g, MotorCar car) { if (!car.Acceleration.Resistance) { // curve Point[] points = new Point[car.Acceleration.ImageWidth]; for (int x = 0; x < car.Acceleration.ImageWidth; x++) { double velocity = car.Acceleration.XtoVelocity(x); double acceleration = GetDeceleration(car, velocity); int y = (int)Math.Round(car.Acceleration.AccelerationToY(acceleration)); points[x] = new Point(x, y); } g.DrawLines(Pens.DimGray, points); } }
internal TrailerCar(MotorCar car) { Mass = car.Mass; Length = car.Length; Width = car.Width; Height = car.Height; CenterOfGravityHeight = car.CenterOfGravityHeight; DefinedAxles = car.DefinedAxles; FrontAxle = car.FrontAxle; RearAxle = car.RearAxle; FrontBogie = car.FrontBogie; RearBogie = car.RearBogie; ExposedFrontalArea = car.ExposedFrontalArea; UnexposedFrontalArea = car.UnexposedFrontalArea; Performance = car.Performance; Delay = car.Delay; Move = car.Move; Brake = car.Brake; Pressure = car.Pressure; Reversed = car.Reversed; Object = car.Object; LoadingSway = car.LoadingSway; }
private void DrawAccelerationCurve(System.Drawing.Graphics g, MotorCar car, Acceleration.Entry entry, bool selected) { // curve Point[] points = new Point[car.Acceleration.ImageWidth]; for (int x = 0; x < car.Acceleration.ImageWidth; x++) { double velocity = car.Acceleration.XtoVelocity(x); double acceleration; if (car.Acceleration.Resistance) { acceleration = Math.Max(car.Acceleration.GetAcceleration(entry, velocity) - GetDeceleration(car, velocity), 0.0); } else { acceleration = car.Acceleration.GetAcceleration(entry, velocity); } int y = (int)Math.Round(car.Acceleration.AccelerationToY(acceleration)); points[x] = new Point(x, y); } double hue; if (car.Acceleration.Entries.Count <= 1) { hue = 1.0; } else { hue = 0.5 * car.Acceleration.Entries.IndexOf(entry) / (car.Acceleration.Entries.Count - 1); } Color color = Utilities.GetColor(hue, selected); g.DrawLines(new Pen(color), points); // points { double v1 = entry.V1; double a1 = entry.A1; if (car.Acceleration.Resistance) { a1 -= GetDeceleration(car, v1); } int x1 = (int)Math.Round(car.Acceleration.VelocityToX(v1)); int y1 = (int)Math.Round(car.Acceleration.AccelerationToY(a1)); g.FillEllipse(new SolidBrush(color), new Rectangle(x1 - 2, y1 - 2, 5, 5)); double v2 = entry.V2; double a2 = car.Acceleration.GetAcceleration(entry, v2); if (car.Acceleration.Resistance) { a2 -= GetDeceleration(car, v2); } int x2 = (int)Math.Round(car.Acceleration.VelocityToX(v2)); int y2 = (int)Math.Round(car.Acceleration.AccelerationToY(a2)); g.FillEllipse(new SolidBrush(color), new Rectangle(x2 - 2, y2 - 2, 5, 5)); } }