using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace CtrEditor.ObjetosSim.UserControls { /// /// Interaction logic for GearControl.xaml /// public partial class GearControl : UserControl { public static readonly DependencyProperty TeethCountProperty = DependencyProperty.Register("TeethCount", typeof(int), typeof(GearControl), new PropertyMetadata(10, OnGearPropertyChanged)); public static readonly DependencyProperty InnerRadiusProperty = DependencyProperty.Register("InnerRadius", typeof(double), typeof(GearControl), new PropertyMetadata(40.0, OnGearPropertyChanged)); public static readonly DependencyProperty OuterRadiusProperty = DependencyProperty.Register("OuterRadius", typeof(double), typeof(GearControl), new PropertyMetadata(60.0, OnGearPropertyChanged)); public static readonly DependencyProperty ToothWidthRatioProperty = DependencyProperty.Register("ToothWidthRatio", typeof(double), typeof(GearControl), new PropertyMetadata(0.5, OnGearPropertyChanged)); public int TeethCount { get { return (int)GetValue(TeethCountProperty); } set { SetValue(TeethCountProperty, value); } } public double InnerRadius { get { return (double)GetValue(InnerRadiusProperty); } set { SetValue(InnerRadiusProperty, value); } } public double OuterRadius { get { return (double)GetValue(OuterRadiusProperty); } set { SetValue(OuterRadiusProperty, value); } } public double ToothWidthRatio { get { return (double)GetValue(ToothWidthRatioProperty); } set { SetValue(ToothWidthRatioProperty, value); } } public GearControl() { InitializeComponent(); DrawGear(); } private static void OnGearPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as GearControl; control?.DrawGear(); } private void DrawGear() { GearCanvas.Children.Clear(); double centerX = ActualWidth / 2; double centerY = ActualHeight / 2; double angleStep = 360.0 / TeethCount; double toothWidthAngle = angleStep * ToothWidthRatio; // Draw inner circle Ellipse innerCircle = new Ellipse { Width = InnerRadius * 2, Height = InnerRadius * 2, Stroke = Brushes.Black, StrokeThickness = 2, Fill = Brushes.Gray }; Canvas.SetLeft(innerCircle, centerX - InnerRadius); Canvas.SetTop(innerCircle, centerY - InnerRadius); GearCanvas.Children.Add(innerCircle); // Draw the zero angle marker double zeroAngle = 0; double radianZero = zeroAngle * Math.PI / 180; double markerLength = InnerRadius * 1.2; // Length of the marker line extending outside the inner circle Line zeroAngleMarker = new Line { X1 = centerX, Y1 = centerY, X2 = centerX + markerLength * Math.Cos(radianZero), Y2 = centerY - markerLength * Math.Sin(radianZero), Stroke = Brushes.Red, StrokeThickness = 2 }; GearCanvas.Children.Add(zeroAngleMarker); for (int i = 0; i < TeethCount; i++) { // Offset the angle to center the first tooth on the 0 angle double angle = i * angleStep; double radianStart = (angle - toothWidthAngle / 2) * Math.PI / 180; double radianEnd = (angle + toothWidthAngle / 2) * Math.PI / 180; Point p1 = new Point(centerX + InnerRadius * Math.Cos(radianStart), centerY + InnerRadius * Math.Sin(radianStart)); Point p2 = new Point(centerX + OuterRadius * Math.Cos(radianStart), centerY + OuterRadius * Math.Sin(radianStart)); Point p3 = new Point(centerX + OuterRadius * Math.Cos(radianEnd), centerY + OuterRadius * Math.Sin(radianEnd)); Point p4 = new Point(centerX + InnerRadius * Math.Cos(radianEnd), centerY + InnerRadius * Math.Sin(radianEnd)); Polygon tooth = new Polygon { Fill = Brushes.Black, Points = new PointCollection { p1, p2, p3, p4 } }; GearCanvas.Children.Add(tooth); } } } }