Μαθήματα Πληροφορικής & Προγραμματισμού

WPF εφαρμογή σχεδίασης γωνιών με C# (μέρος 2/2)

WPF εφαρμογή σχεδίασης γωνιών με C#

WPF εφαρμογή σχεδίασης γωνιών

Στο προηγούμενο μέρος του άρθου  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 μοίρες ο εξωτερικός πλανήτης προηγείται του εσωτερικού και η γωνία θα πρέπει να αντιστοιχεί σε αρνητικό αριθμό εξ ου και η αλλαγή κατεύθυνσης σχηματισμού του τόξου.

Αφήστε ένα Σχόλιο

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.