internal static void DrawAltitudeTape(Graphics g, float indicatedAltitudeAboveMeanSeaLevelInDecimalFeet, float barometricPressure, AltimeterUnits altimeterUnits, float altitudeIndexInFeet) { //******************************* //* ALTITUDE TAPE //******************************* var altitudeStripBoundingBox = new Rectangle(new Point(535, 99), new Size(70, 278)); var altitudeIndexBox = new Rectangle(new Point(altitudeStripBoundingBox.Left, altitudeStripBoundingBox.Top - 19), new Size(altitudeStripBoundingBox.Width, 19)); var altitudeIndexTextBox = new Rectangle(new Point(altitudeStripBoundingBox.Left, altitudeStripBoundingBox.Top - 20), new Size(altitudeStripBoundingBox.Width, 25)); var barometricPressureBox = new Rectangle(new Point(altitudeStripBoundingBox.Left, altitudeStripBoundingBox.Bottom + 1), new Size(altitudeStripBoundingBox.Width, 19)); var greenColor = Color.FromArgb(0, 255, 0); var indexTextColor = Color.FromArgb(255, 128, 255); Brush purpleBrush = new SolidBrush(indexTextColor); Brush greenBrush = new SolidBrush(greenColor); var whitePen = new Pen(Color.White); var blackPen = new Pen(Color.Black); var altitudeIndexFont = new Font("Lucida Console", 13, FontStyle.Bold); var barometricPressureFont = new Font("Lucida Console", 10, FontStyle.Bold); var altitudeFeetTextFont = new Font("Lucida Console", 14, FontStyle.Bold); var indicatedAltitude = (indicatedAltitudeAboveMeanSeaLevelInDecimalFeet); var altitudeTapeBitmap = AltitudeTapeBitmapFactory.GetAltitudeTapeBitmap(indicatedAltitude, altitudeStripBoundingBox.Width - 1, altitudeStripBoundingBox.Height, altitudeIndexInFeet); g.DrawImageFast( altitudeTapeBitmap, altitudeStripBoundingBox.Left + 1, altitudeStripBoundingBox.Top + 1, new Rectangle( new Point(0, 0), new Size(altitudeTapeBitmap.Width, altitudeStripBoundingBox.Height) ), GraphicsUnit.Pixel ); //trace the outline of the altitude tape with black g.DrawRectangleFast(blackPen, altitudeStripBoundingBox); //draw altitude index box var altitudeIndexFormat = new StringFormat(StringFormatFlags.NoWrap) { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.FillRectangle(Brushes.Black, altitudeIndexBox); //add altitude index text to altitude index box var altitudeIndex = string.Format("{0:00000}", altitudeIndexInFeet); if (altitudeIndex[0] == '-') { altitudeIndex = altitudeIndex.Substring(1, altitudeIndex.Length - 1); } g.DrawStringFast(altitudeIndex, altitudeIndexFont, purpleBrush, altitudeIndexTextBox, altitudeIndexFormat); //draw white line under altitude index box whitePen.Width = 2; g.DrawLineFast(whitePen, altitudeIndexBox.Left, altitudeIndexBox.Bottom, altitudeIndexBox.Right, altitudeIndexBox.Bottom); //draw white line at bottom of altitude strip whitePen.Width = 2; g.DrawLineFast(whitePen, altitudeStripBoundingBox.Left, altitudeStripBoundingBox.Bottom, altitudeStripBoundingBox.Right, altitudeStripBoundingBox.Bottom); //draw barometric pressure box var baroPressureFormat = new StringFormat(StringFormatFlags.NoWrap) { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.FillRectangle(Brushes.Black, barometricPressureBox); //add barometric pressure text to barometric pressure box g.DrawStringFast(string.Format("{0:00.00}{1}", barometricPressure, (altimeterUnits == AltimeterUnits.Hg) ? "IN": "MB"), barometricPressureFont, greenBrush, barometricPressureBox, baroPressureFormat); //draw altitude counter var pointA = new Point(546, 221); var pointB = new Point(546, 233); var pointC = new Point(539, 239); var pointD = new Point(546, 244); var pointE = new Point(546, 255); var pointF = new Point(581, 255); var pointG = new Point(581, 265); var pointH = new Point(608, 265); var pointI = new Point(608, 210); var pointJ = new Point(581, 210); var pointK = new Point(581, 221); whitePen.Width = 1; var points = new[] { pointA, pointB, pointC, pointD, pointE, pointF, pointG, pointH, pointI, pointJ, pointK }; g.FillPolygon(Brushes.Black, points); g.DrawPolygon(whitePen, points); //draw altitude counter digits var altitudeString = string.Format("{0:00000}", indicatedAltitude); if (altitudeString[0] == '-') { altitudeString = altitudeString.Substring(1, altitudeString.Length - 1); } var tenThousandsDigitBitmap = SingleDigitBitmapFactory.GetSingleDigitBitmap(Int32.Parse(new String(altitudeString[0], 1))); var thousandsDigitBitmap = SingleDigitBitmapFactory.GetSingleDigitBitmap(Int32.Parse(new String(altitudeString[1], 1))); var hundredsDigitBitmap = SingleDigitBitmapFactory.GetSingleDigitBitmap(Int32.Parse(new String(altitudeString[2], 1))); var tensDigitFrac = (Int32.Parse(new String(altitudeString[4], 1)) / 10.0f); float tensDigitsVal = (Int32.Parse(new String(altitudeString[3], 1))); var tensDigits = tensDigitsVal + tensDigitFrac; var tensDigitsBitmap = SingleDigitBitmapFactory.GetSingleDigitBitmap(tensDigits, true); var onesDigitBitmap = SingleDigitBitmapFactory.GetSingleDigitBitmap(0); var tenThousandsDigitRectangle = new Rectangle(new Point(547, 230), new Size(tenThousandsDigitBitmap.Width, tenThousandsDigitBitmap.Height)); var thousandsDigitRectangle = new Rectangle(new Point(558, 230), new Size(thousandsDigitBitmap.Width, thousandsDigitBitmap.Height)); var hundredsDigitRectangle = new Rectangle(new Point(569, 230), new Size(hundredsDigitBitmap.Width, hundredsDigitBitmap.Height)); var tensDigitsRectangle = new Rectangle(new Point(581, 218), new Size(tensDigitsBitmap.Width, 47)); var onesDigitRectangle = new Rectangle(new Point(592, 230), new Size(onesDigitBitmap.Width, onesDigitBitmap.Height)); g.DrawImageFast(tenThousandsDigitBitmap, tenThousandsDigitRectangle); g.DrawImageFast(thousandsDigitBitmap, thousandsDigitRectangle); g.DrawImageFast(hundredsDigitBitmap, hundredsDigitRectangle); g.DrawImageFast(tensDigitsBitmap, tensDigitsRectangle); g.DrawImageFast(onesDigitBitmap, onesDigitRectangle); var altitudeFeetTextRectangle = new Rectangle(new Point(540, 210), new Size(45, 10)); var altitudeFeetTextFormat = new StringFormat(StringFormatFlags.NoWrap) { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; altitudeFeetTextFormat.FormatFlags |= StringFormatFlags.NoClip | StringFormatFlags.FitBlackBox; var path = new GraphicsPath(); path.AddString("FEET", altitudeFeetTextFont.FontFamily, (int)altitudeFeetTextFont.Style, altitudeFeetTextFont.SizeInPoints, altitudeFeetTextRectangle, altitudeFeetTextFormat); g.DrawPathFast(blackPen, path); g.FillPathFast(Brushes.White, path); }
internal static void DrawAirspeedTape(Graphics g, float indicatedAirspeedInDecimalFeetPerSecond, float airspeedIndexInKnots) { //************************************ //AIRSPEED TAPE //************************************ var airspeedIndexFont = new Font("Lucida Console", 13, FontStyle.Bold); var airspeedKtsFont = new Font("Lucida Console", 14, FontStyle.Bold); var indexTextColor = Color.FromArgb(255, 128, 255); Brush purpleBrush = new SolidBrush(indexTextColor); //draw bounding box for airspeed tape var airspeedStripBoundingBox = new Rectangle(new Point(5, 100), new Size(54, 279)); var airspeedIndexBox = new Rectangle(new Point(airspeedStripBoundingBox.Left, airspeedStripBoundingBox.Top - 19), new Size(airspeedStripBoundingBox.Width, 19)); var airspeedIndexTextBox = new Rectangle(new Point(airspeedStripBoundingBox.Left, airspeedStripBoundingBox.Top - 20), new Size(airspeedStripBoundingBox.Width, 25)); var airspeedFps = indicatedAirspeedInDecimalFeetPerSecond; var airspeedKnots = (float)(Math.Round((airspeedFps / Common.Math.Constants.FPS_PER_KNOT), 1)); float airspeedIndexKnots = airspeedIndexInKnots; var airspeedBitmap = AirspeedTapeBitmapFactory.GetAirspeedTapeBitmap(airspeedKnots, airspeedStripBoundingBox.Width, airspeedStripBoundingBox.Height, airspeedIndexKnots); g.DrawImageFast( airspeedBitmap, airspeedStripBoundingBox.Left, airspeedStripBoundingBox.Top, new Rectangle( new Point(0, 0), new Size(airspeedBitmap.Width, airspeedStripBoundingBox.Height) ), GraphicsUnit.Pixel ); //trace the outline of the airspeed tape with black g.DrawRectangleFast(new Pen(Color.Black), airspeedStripBoundingBox); //draw airspeed index box var airspeedIndexFormat = new StringFormat(StringFormatFlags.NoWrap) { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.FillRectangle(Brushes.Black, airspeedIndexBox); //add airspeed index text to index box g.DrawStringFast(string.Format("{0:000}", airspeedIndexKnots), airspeedIndexFont, purpleBrush, airspeedIndexTextBox, airspeedIndexFormat); //draw white line under airspeed index box var whitePen = new Pen(Color.White) { Width = 2 }; g.DrawLineFast(whitePen, airspeedIndexBox.Left, airspeedIndexBox.Bottom, airspeedIndexBox.Right, airspeedIndexBox.Bottom); //draw white line at bottom of airspeed strip whitePen.Width = 2; g.DrawLineFast(whitePen, airspeedStripBoundingBox.Left, airspeedStripBoundingBox.Bottom, airspeedStripBoundingBox.Right, airspeedStripBoundingBox.Bottom); //draw airspeed counter box var pointA = new Point( 2, 222); var pointB = new Point( 2, 255); var pointC = new Point( 26, 255); var pointD = new Point( 26, 267); var pointE = new Point( 47, 267); var pointF = new Point( 47, 243); var pointG = new Point( 54, 239); var pointH = new Point( 47, 234); var pointI = new Point( 47, 212); var pointJ = new Point( 26, 212); var pointK = new Point( 26, 222); whitePen.Width = 1; var points = new[] { pointA, pointB, pointC, pointD, pointE, pointF, pointG, pointH, pointI, pointJ, pointK }; g.FillPolygon(Brushes.Black, points); g.DrawPolygon(whitePen, points); var airspeedString = string.Format("{0:0000}", Math.Truncate(airspeedKnots)); var hundredsDigit = SingleDigitBitmapFactory.GetSingleDigitBitmap(Int32.Parse(new String(airspeedString[1], 1))); var tensDigit = SingleDigitBitmapFactory.GetSingleDigitBitmap(Int32.Parse(new String(airspeedString[2], 1))); var onesVal = Int32.Parse(new String(airspeedString[3], 1)); var onesFrac = (float)Math.Round((onesVal + (airspeedKnots - Math.Truncate(airspeedKnots))), 1); var onesDigits = SingleDigitBitmapFactory.GetSingleDigitBitmap(onesFrac, true); var hundredsDigitRectangle = new Rectangle(new Point(5, 230), new Size(hundredsDigit.Width, hundredsDigit.Height)); var tensDigitRectangle = new Rectangle(new Point(18, 230), new Size(tensDigit.Width, tensDigit.Height)); var onesDigitsRectangle = new Rectangle(new Point(32, 217), new Size(onesDigits.Width, onesDigits.Height)); //draw airspeed counter digits g.DrawImageFast(hundredsDigit, hundredsDigitRectangle); g.DrawImageFast(tensDigit, tensDigitRectangle); g.DrawImageFast(onesDigits, onesDigitsRectangle); var airspeedKtsRectangle = new Rectangle(new Point(15, 200), new Size(40, 15)); var airspeedKtsFormat = new StringFormat(StringFormatFlags.NoWrap) { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; airspeedKtsFormat.FormatFlags |= StringFormatFlags.NoClip | StringFormatFlags.FitBlackBox; var path = new GraphicsPath(); path.AddString("KTS", airspeedKtsFont.FontFamily, (int)airspeedKtsFont.Style, airspeedKtsFont.SizeInPoints, airspeedKtsRectangle, airspeedKtsFormat); g.DrawPathFast(new Pen(Color.Black), path); g.FillPathFast(Brushes.White, path); }