WPF εφαρμογή σχεδίασης γωνιών με C#
Στο προηγούμενο μέρος του άρθου WPF εφαρμογή σχεδίασης γωνιών είδαμε την δημιουργία του περιβάλλοντος χρήστη μέσω XAML και τον ορισμό των μεταβλητών για την C# που θα χρησιμοποιήσουμε στον κυρίως κομμάτι του προγράμματος.
WPF εφαρμογή σχεδίασης γωνιών: Χτίσιμο κώδικα C#
Για τις ανάγκες αυτού του οδηγού και για να περιορίσουμε τις εισαγωγές από το χρήστη θα ορίσουμε πως ο εξωτερικός πλανήτης θα έχει την διπλάσια τροχία του εσωτερικού και οι 2 τροχιές είναι τέλειοι κύκλοι και θα αλλάζει η θέση μόνο του εξωτερικού πλανήτη σύμφωνα με τις μοίρες που δίνει ο χρήστης.
Δημιουργία του άστρου στο κέντρο του Canvas:
Ellipse Sun = new Ellipse(); Sun.SnapsToDevicePixels = true; Sun.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); Sun.Visibility = Visibility.Visible; Sun.Stroke = Brushes.Yellow; Sun.Fill = Brushes.Yellow; Sun.StrokeThickness = 3; Sun.Height = 50; Sun.Width = 50; Sun.Margin = new Thickness(((WindowHeight / 2) - (Sun.Width / 2)), ((WindowHeight / 2) - (Sun.Height / 2)), 0, 0); window.DrawCanvas.Children.Add(Sun);
Δημιουργία εσωτερικής και εξωτερικής τροχιάς:
Ellipse OuterOrbit = new Ellipse(); OuterOrbit.SnapsToDevicePixels = true; OuterOrbit.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); OuterOrbit.Visibility = Visibility.Visible; OuterOrbit.StrokeThickness = 3; OuterOrbit.Height = WindowHeight; OuterOrbit.Width = WindowWidth; OuterOrbit.Stroke = Brushes.Green; window.DrawCanvas.Children.Add(OuterOrbit); Ellipse InnerOrbit = new Ellipse(); InnerOrbit.SnapsToDevicePixels = true; InnerOrbit.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); InnerOrbit.Visibility = Visibility.Visible; InnerOrbit.Stroke = Brushes.LightGreen; InnerOrbit.StrokeThickness = 3; InnerOrbit.Height = WindowHeight / 2; InnerOrbit.Width = WindowWidth / 2; InnerOrbit.Margin = new Thickness(((WindowHeight / 2) - (InnerOrbit.Width / 2)), ((WindowHeight / 2) - (InnerOrbit.Height / 2)), 0, 0); window.DrawCanvas.Children.Add(InnerOrbit);
Δημιουργία εσωτερικού πλανήτη:
Ellipse InnerPlanet = new Ellipse(); InnerPlanet.SnapsToDevicePixels = true; InnerPlanet.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); InnerPlanet.Visibility = Visibility.Visible; InnerPlanet.Stroke = Brushes.Blue; InnerPlanet.Fill = Brushes.Blue; InnerPlanet.StrokeThickness = 3; InnerPlanet.Height = 30; InnerPlanet.Width = 30; InnerPlanet.Margin = new Thickness((((WindowHeight / 2) + InnerOrbit.Width / 2) - (InnerPlanet.Width / 2)), ((WindowHeight / 2) - (InnerPlanet.Height / 2)), 0, 0); window.DrawCanvas.Children.Add(InnerPlanet);
Δημιουργία εξωτερικού πλανήτη μετατοπισμένου πάνω στην εξωτερική τροχιά όσες μοίρες όρισε ο χρήστης:
Ellipse OuterPlanet = new Ellipse(); OuterPlanet.SnapsToDevicePixels = true; OuterPlanet.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); OuterPlanet.Visibility = Visibility.Visible; OuterPlanet.Stroke = Brushes.Orange; OuterPlanet.Fill = Brushes.Orange; OuterPlanet.StrokeThickness = 3; OuterPlanet.Height = 30; OuterPlanet.Width = 30; OuterPlanet.Margin = new Thickness((line2.X2 - (OuterPlanet.Width / 2)), (line2.Y2 - (OuterPlanet.Height / 2)), 0, 0); window.DrawCanvas.Children.Add(OuterPlanet);
Δημιουργία γωνίας μεταξύ εσωτερικού πλανήτη άστρου και εξωτερικού πλανήτη:
Line line = new Line(); Line line = new Line(); line.SnapsToDevicePixels = true; line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); line.Visibility = System.Windows.Visibility.Visible; line.StrokeThickness = 3; line.Stroke = System.Windows.Media.Brushes.Cyan; line.X1 = WindowWidth / 2; line.Y1 = WindowHeight / 2; line.X2 = (WindowWidth / 2) + (InnerOrbit.Width / 2); line.Y2 = WindowHeight / 2; window.DrawCanvas.Children.Add(line); Line line2 = new Line(); line2.SnapsToDevicePixels = true; line2.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); line2.Visibility = System.Windows.Visibility.Visible; line2.StrokeThickness = 3; line2.Stroke = System.Windows.Media.Brushes.Cyan; line2.X1 = WindowWidth / 2; line2.Y1 = WindowHeight / 2; line2.X2 = (WindowWidth / 2) + Math.Cos(angle) * (OuterOrbit.Width / 2); line2.Y2 = (WindowHeight / 2) - Math.Sin(angle) * (OuterOrbit.Height / 2); window.DrawCanvas.Children.Add(line2);
Δημιουργία τόξου που εμπεριέχεται στην παραπάνω γωνία
PathGeometry ArcPath = new PathGeometry(); PathFigure ArcFigure = new PathFigure(); ArcFigure.StartPoint = new Point((WindowWidth / 2) + (InnerOrbit.Width / 4), (WindowHeight / 2)); if (AngleDegrees <= 180) { ArcFigure.Segments.Add( new ArcSegment( new Point( ((WindowWidth / 2) + Math.Cos(angle) * (InnerOrbit.Width / 4)), ((WindowHeight / 2) - Math.Sin(angle) * (InnerOrbit.Width / 4))), new Size((InnerOrbit.Width / 4), (InnerOrbit.Width / 4)), 90, false, SweepDirection.Counterclockwise, true ) ); } else { ArcFigure.Segments.Add( new ArcSegment( new Point( ((WindowWidth / 2) + Math.Cos(angle) * (InnerOrbit.Width / 4)), ((WindowHeight / 2) - Math.Sin(angle) * (InnerOrbit.Width / 4))), new Size((InnerOrbit.Width / 4), (InnerOrbit.Width / 4)), 90, false, SweepDirection.Clockwise, true ) ); } ArcPath.Figures.Add(ArcFigure); Path path = new Path(); path.Data = ArcPath; path.SnapsToDevicePixels = true; path.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); path.Visibility = Visibility.Visible; path.Stroke = Brushes.Brown; path.StrokeThickness = 3; window.DrawCanvas.Children.Add(path);
Αξίζει εδώ να σημειώσουμε πως αλλάζουμε την κατεύθυνση σχηματισμού του τόξου σε Counterclockwise όταν η γωνία είναι μεγαλύτερη από 180 μοίρες. Ακολουθούμε την παραπάνω τακτική γιατί στην περίπτωση που η γωνία είναι παραπάνω από 180 μοίρες ο εξωτερικός πλανήτης προηγείται του εσωτερικού και η γωνία θα πρέπει να αντιστοιχεί σε αρνητικό αριθμό εξ ου και η αλλαγή κατεύθυνσης σχηματισμού του τόξου.