public static void RenderArcNeedle(this Graphics Graphics, Rectangle ClientRectangle, Point Center, Int32 Radius, Int32 Width, Single MinimumValue, Single MaximumValue, Int32 ArcStart, Int32 ArcSweep, NeedleTypeEnum NeedleType, Color ForeColor, Single Value) { Graphics.SetClip(ClientRectangle); Graphics.SmoothingMode = SmoothingMode.AntiAlias; Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; var brushAngle = (Int32)(ArcStart + (Value - MinimumValue) * ArcSweep / (MaximumValue - MinimumValue)) % 360; var needleAngle = brushAngle * Math.PI / 180; switch (NeedleType) { case NeedleTypeEnum.Beveled: using (var pen = new Pen(ForeColor, Width)) { var subcol1 = (Int32)(((brushAngle + 225) % 180) * 100 / 180); var subcol2 = (Int32)(((brushAngle + 135) % 180) * 100 / 180); var points = new PointF[3]; if (Math.Floor((Single)(((brushAngle + 225) % 360) / 180.0)) == 0) { using (var brush1 = new SolidBrush(Color.FromArgb(180 - subcol1, 180 - subcol1, 180 - subcol1))) using (var brush2 = new SolidBrush(Color.FromArgb(80 + subcol1, 80 + subcol1, 80 + subcol1))) { points[0].X = (Single)(Center.X + Radius * Math.Cos(needleAngle)); points[0].Y = (Single)(Center.Y + Radius * Math.Sin(needleAngle)); points[1].X = (Single)(Center.X - Radius / 20 * Math.Cos(needleAngle)); points[1].Y = (Single)(Center.Y - Radius / 20 * Math.Sin(needleAngle)); points[2].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle + Math.PI / 2)); points[2].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle + Math.PI / 2)); Graphics.FillPolygon(brush1, points); points[2].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle - Math.PI / 2)); points[2].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle - Math.PI / 2)); Graphics.FillPolygon(brush2, points); } } else { using (var brush1 = new SolidBrush(Color.FromArgb(80 + subcol1, 80 + subcol1, 80 + subcol1))) using (var brush2 = new SolidBrush(Color.FromArgb(180 - subcol1, 180 - subcol1, 180 - subcol1))) { points[0].X = (Single)(Center.X + Radius * Math.Cos(needleAngle)); points[0].Y = (Single)(Center.Y + Radius * Math.Sin(needleAngle)); points[1].X = (Single)(Center.X - Radius / 20 * Math.Cos(needleAngle)); points[1].Y = (Single)(Center.Y - Radius / 20 * Math.Sin(needleAngle)); points[2].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle + Math.PI / 2)); points[2].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle + Math.PI / 2)); Graphics.FillPolygon(brush1, points); points[2].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle - Math.PI / 2)); points[2].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle - Math.PI / 2)); Graphics.FillPolygon(brush2, points); } } if (Math.Floor((Single)(((brushAngle + 135) % 360) / 180.0)) == 0) { using (var brush3 = new SolidBrush(Color.FromArgb(80 + subcol2, 80 + subcol2, 80 + subcol2))) { points[0].X = (Single)(Center.X - (Radius / 20 - 1) * Math.Cos(needleAngle)); points[0].Y = (Single)(Center.Y - (Radius / 20 - 1) * Math.Sin(needleAngle)); points[1].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle + Math.PI / 2)); points[1].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle + Math.PI / 2)); points[2].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle - Math.PI / 2)); points[2].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle - Math.PI / 2)); Graphics.FillPolygon(brush3, points); } } else { using (var brush3 = new SolidBrush(Color.FromArgb(180 - subcol2, 180 - subcol2, 180 - subcol2))) { points[0].X = (Single)(Center.X - (Radius / 20 - 1) * Math.Cos(needleAngle)); points[0].Y = (Single)(Center.Y - (Radius / 20 - 1) * Math.Sin(needleAngle)); points[1].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle + Math.PI / 2)); points[1].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle + Math.PI / 2)); points[2].X = (Single)(Center.X - Radius / 5 * Math.Cos(needleAngle) + Width * 2 * Math.Cos(needleAngle - Math.PI / 2)); points[2].Y = (Single)(Center.Y - Radius / 5 * Math.Sin(needleAngle) + Width * 2 * Math.Sin(needleAngle - Math.PI / 2)); Graphics.FillPolygon(brush3, points); } } points[0].X = (Single)(Center.X - Radius / 20 * Math.Cos(needleAngle)); points[0].Y = (Single)(Center.Y - Radius / 20 * Math.Sin(needleAngle)); points[1].X = (Single)(Center.X + Radius * Math.Cos(needleAngle)); points[1].Y = (Single)(Center.Y + Radius * Math.Sin(needleAngle)); Graphics.DrawLine(pen, Center.X, Center.Y, points[0].X, points[0].Y); Graphics.DrawLine(pen, Center.X, Center.Y, points[1].X, points[1].Y); } break; case NeedleTypeEnum.Flat: using (var solidBrush = new SolidBrush(ForeColor)) using (var pen = new Pen(ForeColor, Width)) { var startPoint = new Point((Int32)(Center.X - Radius / 8 * Math.Cos(needleAngle)), (Int32)(Center.Y - Radius / 8 * Math.Sin(needleAngle))); var endPoint = new Point((Int32)(Center.X + Radius * Math.Cos(needleAngle)), (Int32)(Center.Y + Radius * Math.Sin(needleAngle))); Graphics.FillEllipse(solidBrush, Center.X - Width * 3, Center.Y - Width * 3, Width * 6, Width * 6); Graphics.DrawLine(pen, Center.X, Center.Y, endPoint.X, endPoint.Y); Graphics.DrawLine(pen, Center.X, Center.Y, startPoint.X, startPoint.Y); } break; } }
public static void RenderHorizontalNeedle(this Graphics Graphics, Rectangle ClientRectangle, Point Start, Single Length, Int32 NeedleLength, Int32 NeedleWidth, Single MinimumValue, Single MaximumValue, NeedleTypeEnum NeedleType, Color ForeColor, Single Value) { var valueAbsolute = Math.Abs(MaximumValue - MinimumValue); var scaleAdjustment = (Single)Math.Abs(Length / valueAbsolute); var scaleZeroAdjustment = (Single)(0 - MinimumValue) * scaleAdjustment; var adjustedNeedleValue = (Single)(Value * scaleAdjustment); Graphics.SetClip(ClientRectangle); Graphics.SmoothingMode = SmoothingMode.AntiAlias; Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; switch (NeedleType) { case NeedleTypeEnum.Beveled: { var drawArrowTip = true; var drawArrowBevels = true; var drawArrowButt = true; var brushAngle = 360; var subcol1 = (Int32)(((brushAngle + 225) % 180) * 100 / 180); var subcol2 = (Int32)(((brushAngle + 135) % 180) * 100 / 180); var x = (Single)(Start.X + scaleZeroAdjustment + adjustedNeedleValue); var y = Start.Y; if (drawArrowTip) { var points = new PointF[2]; points[0].X = (Single)(x); points[0].Y = (Single)(y); points[1].X = (Single)(x); points[1].Y = (Single)(y + NeedleLength); using (var pen = new Pen(ForeColor, 1)) { Graphics.DrawLine(pen, points[0].X, points[0].Y, points[1].X, points[1].Y); } } if (drawArrowBevels) { using (var brushLight = new SolidBrush(Color.FromArgb(180 - subcol1, 180 - subcol1, 180 - subcol1))) using (var brushDark = new SolidBrush(Color.FromArgb(80 + subcol1, 80 + subcol1, 80 + subcol1))) { var pointsDark = new PointF[3]; pointsDark[0].X = (Single)(x + (NeedleWidth * 2)); pointsDark[0].Y = (Single)(y + NeedleLength); pointsDark[1].X = (Single)(x); pointsDark[1].Y = (Single)(y + NeedleLength); pointsDark[2].X = (Single)(x); pointsDark[2].Y = (Single)(y); Graphics.FillPolygon(brushDark, pointsDark); var pointsLight = new PointF[3]; pointsLight[0].X = (Single)(x - (NeedleWidth * 2)); pointsLight[0].Y = (Single)(y + NeedleLength); pointsLight[1].X = (Single)(x); pointsLight[1].Y = (Single)(y + NeedleLength); pointsLight[2].X = (Single)(x); pointsLight[2].Y = (Single)(y); Graphics.FillPolygon(brushLight, pointsLight); } } if (drawArrowButt) { using (var brushButt = new SolidBrush(Color.FromArgb(180 - subcol2, 180 - subcol2, 180 - subcol2))) { var pointsBut = new PointF[3]; pointsBut[0].X = (Single)(x - (NeedleWidth * 2)); pointsBut[0].Y = (Single)(y + NeedleLength); pointsBut[1].X = (Single)(x + (NeedleWidth * 2)); pointsBut[1].Y = (Single)(y + NeedleLength); pointsBut[2].X = (Single)(x); pointsBut[2].Y = (Single)(y + NeedleLength - (NeedleWidth * 4)); Graphics.FillPolygon(brushButt, pointsBut); } } break; } case NeedleTypeEnum.Flat: { var x = (Single)(Start.X + scaleZeroAdjustment + adjustedNeedleValue); var y = (Single)(Start.Y - (NeedleWidth / 2)); var width = (Single)NeedleWidth; var height = (Single)NeedleLength; using (var solidBrush = new SolidBrush(ForeColor)) { Graphics.FillRectangle(solidBrush, new RectangleF((x - (width / 2)), (y + (height - (height / 4))), (width * 2), (height / 4))); Graphics.FillRectangle(solidBrush, new RectangleF(x, y, width, height)); } break; } } }