C# :: Aufgabe #180 :: Lösung #3
3 Lösungen

#180
Farben/Pixel sortieren
Fortgeschrittener - C#
von KawaiiShox
- 29.06.2017 um 11:39 Uhr
Es soll ein Programm erstellt werden, welches zufällig erstellte Pixel nach der Farbe sortieren kann.
Das Programm soll dabei ungefähr so aussehen, wie auf Bild1.
Im ersten Teil der Aufgabe soll es , durch das Drücken eines Buttons, möglich sein ein Panel mit Pixeln, die alle eine zufällig generierte Farbe besitzen, zu füllen. (Bild2)
Als nächstes sollen dann alle Pixel des Panels sortiert werden(Bild3). In diesem Beispiel habe ich die Pixel nach ihrem "HUE" sortiert. Spannend wäre aber auch zu wissen, wie es aussieht, wenn man die Pixel nach einem anderem Kriterium sortiert.
Wer möchte, kann aber auch die Pixel eines bestimmten Bildes sortieren.
Das Programm soll dabei ungefähr so aussehen, wie auf Bild1.
Im ersten Teil der Aufgabe soll es , durch das Drücken eines Buttons, möglich sein ein Panel mit Pixeln, die alle eine zufällig generierte Farbe besitzen, zu füllen. (Bild2)
Als nächstes sollen dann alle Pixel des Panels sortiert werden(Bild3). In diesem Beispiel habe ich die Pixel nach ihrem "HUE" sortiert. Spannend wäre aber auch zu wissen, wie es aussieht, wenn man die Pixel nach einem anderem Kriterium sortiert.
Wer möchte, kann aber auch die Pixel eines bestimmten Bildes sortieren.
#3

von daniel59 (4260 Punkte)
- 24.08.2017 um 15:38 Uhr
MainWindow.xaml.cs
C#-Code
MainWindow.xaml
XML-Code

using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace WpfFrabenSortieren { /// <summary> /// Interaktionslogik für MainWindow.xaml /// </summary> public partial class MainWindow : Window { private const int width = 200; private const int height = 200; private static readonly Random rnd = new Random(); private Dictionary<Point, Color> colorDic; public MainWindow() { InitializeComponent(); } private void CreateRandomPixels() { colorDic = new Dictionary<Point, Color>(); canvasPixel.Children.Clear(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Point p = new Point(x, y); Color c = rnd.GetRandomColor(); Rectangle rect = new Rectangle() { Height = 1, Width = 1, StrokeThickness = 0, Fill = new SolidColorBrush(c) }; Canvas.SetLeft(rect, x); Canvas.SetTop(rect, y); canvasPixel.Children.Add(rect); colorDic.Add(p, c); } } } private void SortPixel() { if (colorDic != null) { var sort = colorDic.OrderBy(a => a.Value.GetHue()); var enumerator = sort.GetEnumerator(); canvasPixel.Children.Clear(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Point p = new Point(x, y); enumerator.MoveNext(); Color c = enumerator.Current.Value; Rectangle rect = new Rectangle() { Height = 1, Width = 1, StrokeThickness = 0, Fill = new SolidColorBrush(c) }; Canvas.SetLeft(rect, x); Canvas.SetTop(rect, y); canvasPixel.Children.Add(rect); } } } } private void buttonRandom_Click(object sender, RoutedEventArgs e) { CreateRandomPixels(); } private void buttonSort_Click(object sender, RoutedEventArgs e) { SortPixel(); } } static class Extensions { public static Color GetRandomColor(this Random rnd) { byte r = (byte)rnd.Next(0, 256); byte g = (byte)rnd.Next(0, 256); byte b = (byte)rnd.Next(0, 256); return Color.FromRgb(r, g, b); } public static double GetHue(this Color color) { double r = color.R / 255.0; double g = color.G / 255.0; double b = color.B / 255.0; double[] rgb = { r, g, b }; double max = rgb.Max(); double min = rgb.Min(); double hue; if (r == max) { hue = (g - b) / (max - min); } else if (g == max) { hue = 2 + ((b - r) / (max - min)); } else if (b == max) { hue = 4 + ((r - g) / (max - min)); } else { throw new Exception(); } hue *= 60; if (hue < 0) { hue += 360; } return hue; } } }
MainWindow.xaml

<Window x:Class="WpfFrabenSortieren.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfFrabenSortieren" mc:Ignorable="d" Title="MainWindow" Height="322" Width="236" ResizeMode="CanMinimize" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="1*"/> <RowDefinition Height="220"/> </Grid.RowDefinitions> <Canvas x:Name="canvasPixel" Width="200" Height="200" Grid.Row="1" Margin="10,10,0,0" Background="Black" HorizontalAlignment="Left" VerticalAlignment="Top"/> <Button x:Name="buttonRandom" Content="Zufällige Farben" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="200" Click="buttonRandom_Click"/> <Button x:Name="buttonSort" Content="Farben sortieren" HorizontalAlignment="Left" Margin="10,37,0,0" VerticalAlignment="Top" Width="200" Click="buttonSort_Click"/> </Grid> </Window>
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1