233 lines
15 KiB
XML
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>
|