Delaunay Triangulation - currently with DelaunatorSharp - VoronoiDiagram work in progress

This commit is contained in:
ti_mo
2025-10-21 15:51:37 +02:00
parent 4f5530c87e
commit 22aaca545f
4 changed files with 362 additions and 45 deletions
+106 -23
View File
@@ -15,8 +15,8 @@
ExtendClientAreaTitleBarHeightHint="32"
TransparencyLevelHint="AcrylicBlur, Blur, Transparent"
Background="Transparent"
Width="{Binding Width}"
Height="{Binding Height}"
Width="{Binding Width, Mode=TwoWay}"
Height="{Binding Height, Mode=TwoWay}"
>
<Design.DataContext>
@@ -42,24 +42,61 @@
</Border>
<Grid Grid.Row="1" ZIndex="1000" Margin="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Classes="InnerCard">
<Border.Effect>
<DropShadowEffect BlurRadius="20" Color="#aa000000" OffsetX="5" OffsetY="5"/>
</Border.Effect>
<StackPanel Orientation="Vertical">
<Border Classes="InnerCard">
<TextBlock Text="Delaunay Triangulation" FontSize="18" Foreground="White"/>
</Border>
<Border Classes="InnerCard">
<Grid ColumnDefinitions="4*,1*">
<Slider Grid.Column="0" Value="{Binding PointCount, Mode=TwoWay}" Margin="5" Minimum="20" Maximum="500"/>
<TextBox Grid.Column="1" Text="{Binding PointCount, Mode=TwoWay}" FontSize="18" Foreground="White" Background="#30ffffff" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>
</Border>
</StackPanel>
<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"/>
<TextBox Grid.Column="1" Text="{Binding PointCount, Mode=TwoWay}" FontSize="18" Foreground="White" Background="#30ffffff" 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"/>
<TextBox Grid.Column="1" Text="{Binding MinPointDistance, Mode=TwoWay}" FontSize="18" Foreground="White" Background="#30ffffff" 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"/>
<TextBox Grid.Column="1" Text="{Binding GenerationDelay, Mode=TwoWay}" FontSize="18" Foreground="White" Background="#30ffffff" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>
</StackPanel>
</Border>
<Border Classes="InnerCard">
<StackPanel Orientation="Vertical">
<TextBlock Text="Enabled Visuals:" Foreground="White"/>
<StackPanel Orientation="Horizontal">
<CheckBox Content="Points" IsChecked="{Binding PointsVisible}" Foreground="White" Margin="10,0"/>
<CheckBox Content="Convex Hull" IsChecked="{Binding EdgesVisible}" Foreground="White" Margin="10,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<CheckBox Content="Circles" IsChecked="{Binding CirclesVisible}" Foreground="White" Margin="10,0"/>
<CheckBox Content="Triangles" IsChecked="{Binding TrianglesVisible}" Foreground="White" Margin="10,0"/>
</StackPanel>
</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"
@@ -84,14 +121,19 @@
IsHitTestVisible="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
<Canvas IsVisible="{Binding EdgesVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Edge">
<Line StartPoint="{Binding Start}"
EndPoint="{Binding End}"
Stroke="LightGray" StrokeThickness="1"/>
Stroke="GreenYellow" StrokeThickness="2"
>
<Line.RenderTransform>
<TranslateTransform X="{Binding Start}" Y="{Binding End}"/>
</Line.RenderTransform>
</Line>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
@@ -101,7 +143,7 @@
IsHitTestVisible="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
<Canvas IsVisible="{Binding CirclesVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
@@ -109,9 +151,33 @@
<Ellipse Stroke="DarkOrange" StrokeThickness="1.5"
Width="{Binding Diameter}"
Height="{Binding Diameter}"
Canvas.Left="{Binding Left}"
Canvas.Top="{Binding Top}"
/>
>
<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 CirclesVisible}"/>
</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>
@@ -122,23 +188,40 @@
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
<Canvas IsVisible="{Binding PointsVisible}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:Geometries+Point">
<Ellipse Fill="White" Stroke="Black" StrokeThickness="1"
<Ellipse Fill="Transparent" Stroke="White" StrokeThickness="1"
Width="{Binding Size}"
Height="{Binding Size}"
>
<Ellipse.RenderTransform>
<!-- Nutze Left/Top aus dem VM (oder X/Y, wenn das deine Top-Left-Koords sind) -->
<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>