/// <summary> /// Draws specific divisions on the dial face /// </summary> /// <param name="canvas">Control's canvas</param> /// <param name="dialFace">Info about the dial face</param> /// <param name="divisionCount">Total count of divisions</param> /// <param name="divisionLength">Length of the single division</param> /// <param name="divisionColor">Color of the single division</param> private void DrawDivision( PaintEventArgs canvas, DialFaceInfo dialFace, int divisionCount, int divisionLength, Color divisionColor) { var additionToLength = (dialFace.Diameter / 2) - divisionLength; var currentAngle = 0.0; var divisionPen = new Pen(divisionColor, divisionThickness); for (int i = 0; i < divisionCount; ++i) { var firstPoint = this.ConvertPolarToCartesian( additionToLength, currentAngle, new Point(dialFace.CenterX, dialFace.CenterY)); var secondPoint = this.ConvertPolarToCartesian( additionToLength + divisionLength, currentAngle, new Point(dialFace.CenterX, dialFace.CenterY)); canvas.Graphics.DrawLine(divisionPen, firstPoint, secondPoint); currentAngle += 2 * Math.PI / divisionCount; } }
/// <summary> /// Draws all types of divisions on the dial face /// </summary> /// <param name="canvas">Control's canvas</param> /// <param name="dialFace">Info about the dial face</param> protected void DrawAllDivisions(PaintEventArgs canvas, DialFaceInfo dialFace) { // I don't know how to fix arrow overlapping without crutches this.DrawDivision( canvas, dialFace, 60, dialFace.Diameter / minuteDivisionsLengthPart, this.minuteDivisionColor); // For "12", "3", "6", "9" hours this.DrawDivision( canvas, dialFace, 4, dialFace.Diameter / hourMultipleOfThreeLengthPart, this.hourDivisionColor); this.DrawDivision( canvas, dialFace, 12, dialFace.Diameter / hourDivisionsLengthPart, this.hourDivisionColor); }
/// <summary> /// Draws a bold dot where the arrows connect to each other /// </summary> /// <param name="canvas">Control canvas</param> /// <param name="dialFace">Properties of the dial face</param> protected void DrawPointOfAttachment( PaintEventArgs canvas, DialFaceInfo dialFace) { var pointDiameter = dialFace.Diameter / pointOfAttachmentDiameterPart; var pointBrush = new SolidBrush(this.pointOfAttachmentColor); canvas.Graphics.FillEllipse( pointBrush, dialFace.CenterX - (pointDiameter / 2), dialFace.CenterY - (pointDiameter / 2), pointDiameter, pointDiameter); }
/// <summary> /// Draws arrows of the watch /// </summary> /// <param name="canvas">Control canvas</param> /// <param name="dialFace">Parameters of the dial face</param> protected void DrawArrows(PaintEventArgs canvas, DialFaceInfo dialFace) { // TODO: Implement smooth moving of the arrows var hourArrowLength = dialFace.Diameter / hourArrowLengthPart; var minuteArrowLength = dialFace.Diameter / minuteArrowLengthPart; var secondArrowLength = dialFace.Diameter / secondArrowLengthPart; var secondArrowCounterweightLength = dialFace.Diameter / secondArrowCounterweightPart; double hourArrowAngle = 2 * Math.PI / 12 * (this.currentDateTime.Hour % 12); this.DrawSingleArrow( canvas, dialFace, new ArrowInfo( hourArrowLength, this.hourArrowColor, hourArrowThickness, hourArrowAngle)); double minuteArrowAngle = 2 * Math.PI / 60 * this.currentDateTime.Minute; this.DrawSingleArrow( canvas, dialFace, new ArrowInfo( minuteArrowLength, this.minuteArrowColor, minuteArrowThickness, minuteArrowAngle)); double secondArrowAngle = 2 * Math.PI / 60 * this.currentDateTime.Second; this.DrawSingleArrow( canvas, dialFace, new ArrowInfo( secondArrowLength, this.secondArrowColor, secondArrowThickness, secondArrowAngle, secondArrowCounterweightLength)); }
/// <summary> /// Draws single arrow on watches /// </summary> /// <param name="canvas">Control canvas</param> /// <param name="dialFace">Parameters of the dial face</param> /// <param name="arrow">Parameters of arrow</param> private void DrawSingleArrow( PaintEventArgs canvas, DialFaceInfo dialFace, ArrowInfo arrow) { // Because arrow.Angle is clockwise diviation from x = 0 var realAngle = (Math.PI / 2) - arrow.Angle; var firstPoint = this.ConvertPolarToCartesian( arrow.CounterweightLength, realAngle + Math.PI, new Point(dialFace.CenterX, dialFace.CenterY)); var secondPoint = this.ConvertPolarToCartesian( arrow.MainPartLength, realAngle, new Point(dialFace.CenterX, dialFace.CenterY)); var arrowPen = new Pen(arrow.ArrowColor, arrow.Thickness); canvas.Graphics.DrawLine(arrowPen, firstPoint, secondPoint); }