Files
DelaunayTriangulation/DelauneyTriangulation/Views/MainWindow.axaml
T

233 lines
15 KiB
XML

<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:DelauneyTriangulation.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:DelauneyTriangulation.Models"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="DelauneyTriangulation.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="Delaunay Triangulation"
SystemDecorations="Full"
ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaChromeHints="Default"
ExtendClientAreaTitleBarHeightHint="32"
TransparencyLevelHint="AcrylicBlur, Blur, Transparent"
Background="Transparent"
Width="{Binding Width, Mode=TwoWay}"
Height="{Binding Height, Mode=TwoWay}"
MinWidth="1200"
MinHeight="700"
>
<Design.DataContext>
<!-- This only sets the DataContext for the previewer in an IDE,
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
<vm:MainWindowViewModel/>
</Design.DataContext>
<Window.Resources>
<models:EmptyStringIntConverter x:Key="EmptyStringIntConverter"/>
</Window.Resources>
<Window.Styles>
<Style Selector="Border.InnerCard">
<Setter Property="CornerRadius" Value="7.5"/>
<Setter Property="Background" Value="#30000000"/>
<Setter Property="BorderBrush" Value="#20FFFFFF"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Padding" Value="10"/>
<Setter Property="Margin" Value="5"/>
</Style>
</Window.Styles>
<Panel>
<Grid RowDefinitions="30,*">
<Border ZIndex="1000" Grid.Row="0" Background="#30000000" PointerPressed="OnTitleBarPointerPressed" DoubleTapped="OnTitleBarDoubleTapped">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Background="Transparent" Foreground="White" Text="Delaunay Triangulation - Timo Niemann"/>
</Border>
<Grid Grid.Row="1" ZIndex="1000" Margin="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Classes="InnerCard">
<Border.Effect>
<DropShadowEffect BlurRadius="20" Color="#aa000000" OffsetX="5" OffsetY="5"/>
</Border.Effect>
<Grid RowDefinitions="*, auto">
<StackPanel Orientation="Vertical">
<Border Classes="InnerCard">
<TextBlock Text="Delaunay Triangulation" FontSize="18" Foreground="White"/>
</Border>
<Border Classes="InnerCard">
<StackPanel Orientation="Vertical">
<TextBlock Text="Maximal Point Count" Foreground="White"/>
<Grid ColumnDefinitions="4*,1*">
<Slider Grid.Column="0" Value="{Binding PointCount, Mode=TwoWay}" Margin="5" Minimum="20" Maximum="200"/>
<NumericUpDown Height="20" Grid.Column="1" ShowButtonSpinner="False" Value="{Binding PointCount, Mode=TwoWay}" Minimum="1" Increment="1" FormatString="F0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>
</StackPanel>
</Border>
<Border Classes="InnerCard">
<StackPanel Orientation="Vertical">
<TextBlock Text="Minimal Point Distance" Foreground="White"/>
<Grid ColumnDefinitions="4*,1*">
<Slider Grid.Column="0" Value="{Binding MinPointDistance, Mode=TwoWay}" Margin="5" Minimum="1" Maximum="10"/>
<NumericUpDown Height="20" Grid.Column="1" ShowButtonSpinner="False" Value="{Binding MinPointDistance, Mode=TwoWay}" Minimum="1" Increment="1" FormatString="F0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/> </Grid>
</StackPanel>
</Border>
<Border Classes="InnerCard">
<StackPanel Orientation="Vertical">
<TextBlock Text="Genearation Speed" Foreground="White"/>
<Grid ColumnDefinitions="4*,1*">
<Slider Grid.Column="0" Value="{Binding GenerationDelay, Mode=TwoWay}" Margin="5" Minimum="0" Maximum="1000"/>
<NumericUpDown Height="20" Grid.Column="1" ShowButtonSpinner="False" Value="{Binding GenerationDelay, Mode=TwoWay}" Minimum="0" Increment="1" FormatString="F0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>
</StackPanel>
</Border>
<Border Classes="InnerCard">
<StackPanel Orientation="Vertical">
<TextBlock Text="Enabled Visuals:" Foreground="White"/>
<Grid ColumnDefinitions="1*, 1*">
<CheckBox HorizontalAlignment="Left" Content="Points" IsChecked="{Binding PointsVisible}" Foreground="White" Margin="10,0"/>
<CheckBox Grid.Column="1" HorizontalAlignment="Left" Content="Convex Hull" IsChecked="{Binding EdgesVisible}" Foreground="White" Margin="10,0"/>
</Grid>
<Grid ColumnDefinitions="1*, 1*">
<CheckBox HorizontalAlignment="Left" Content="Circles" IsChecked="{Binding CirclesVisible}" Foreground="White" Margin="10,0"/>
<CheckBox Grid.Column="1" HorizontalAlignment="Left" Content="Triangles" IsChecked="{Binding TrianglesVisible}" Foreground="White" Margin="10,0"/>
</Grid>
<Grid ColumnDefinitions="1*, 1*">
<CheckBox HorizontalAlignment="Left" Content="Voronoi" IsChecked="{Binding VoronoiVisible}" Foreground="White" Margin="10,0"/>
<!-- <CheckBox Content="Triangles" IsChecked="{Binding TrianglesVisible}" Foreground="White" Margin="10,0"/> -->
</Grid>
</StackPanel>
</Border>
</StackPanel>
<Button Grid.Row="1" Foreground="White" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Generate" Command="{Binding GenerateCommand}"/>
</Grid>
</Border>
</Grid>
<Canvas Grid.Row="0" Grid.RowSpan="2" x:Name="Scene" Background="#dd000000" ClipToBounds="True" PointerPressed="Scene_OnPointerPressed" PointerMoved="Scene_OnPointerMoved" PointerReleased="Scene_OnPointerReleased" PointerWheelChanged="Scene_OnWheel">
<Canvas x:Name="SceneContent">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="{Binding Zoom}" ScaleY="{Binding Zoom}"/>
<TranslateTransform X="{Binding PanX}" Y="{Binding PanY}"/>
</TransformGroup>
</Canvas.RenderTransform>
<ItemsControl ItemsSource="{Binding Edges}"
Width="{Binding Bounds.Width, ElementName=Scene}"
Height="{Binding Bounds.Height, ElementName=Scene}"
IsHitTestVisible="False"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsVisible="{Binding EdgesVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Edge">
<Line StartPoint="{Binding Start}"
EndPoint="{Binding End}"
Stroke="GreenYellow" StrokeThickness="2"
>
<Line.RenderTransform>
<TranslateTransform X="{Binding Start}" Y="{Binding End}"/>
</Line.RenderTransform>
</Line>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Circles}"
Width="{Binding Bounds.Width, ElementName=Scene}"
Height="{Binding Bounds.Height, ElementName=Scene}"
IsHitTestVisible="False"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsVisible="{Binding CirclesVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Circle">
<Ellipse Stroke="BlueViolet" StrokeThickness="1.5"
Width="{Binding Diameter}"
Height="{Binding Diameter}"
>
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding Left}" Y="{Binding Top}"/>
</Ellipse.RenderTransform>
</Ellipse>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding VoronoiDiagram}"
Width="{Binding Bounds.Width, ElementName=Scene}"
Height="{Binding Bounds.Height, ElementName=Scene}"
IsHitTestVisible="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsVisible="{Binding VoronoiVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Edge">
<Line StartPoint="{Binding Start}"
EndPoint="{Binding End}"
Stroke="DarkOrange" StrokeThickness="2"
>
<Line.RenderTransform>
<TranslateTransform X="{Binding Start}" Y="{Binding End}"/>
</Line.RenderTransform>
</Line>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Points}"
Width="{Binding Bounds.Width, ElementName=Scene}"
Height="{Binding Bounds.Height, ElementName=Scene}"
IsHitTestVisible="False"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsVisible="{Binding PointsVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Point">
<Ellipse Fill="Transparent" Stroke="White" StrokeThickness="1"
Width="{Binding Size}"
Height="{Binding Size}"
>
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding Left}" Y="{Binding Top}"/>
</Ellipse.RenderTransform>
</Ellipse>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Triangles}"
Width="{Binding Bounds.Width, ElementName=Scene}"
Height="{Binding Bounds.Height, ElementName=Scene}"
IsHitTestVisible="False"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsVisible="{Binding TrianglesVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Triangle">
<Canvas>
<Polygon Points="{Binding Vertices}" Stroke="CornflowerBlue" StrokeThickness="1" Fill="Transparent"/>
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
</Canvas>
</Grid>
</Panel>
</Window>