diff --git a/DelaunayTriangulation/ViewModels/MainWindowViewModel.cs b/DelaunayTriangulation/ViewModels/MainWindowViewModel.cs index 5ecb41f..1a61e94 100644 --- a/DelaunayTriangulation/ViewModels/MainWindowViewModel.cs +++ b/DelaunayTriangulation/ViewModels/MainWindowViewModel.cs @@ -32,6 +32,7 @@ public partial class MainWindowViewModel : ViewModelBase [ObservableProperty] private bool _trianglesVisible = true; [ObservableProperty] private bool _doConnectPoints = false; + [ObservableProperty] private bool _doConnectPointsV2 = false; [ObservableProperty] private bool _doNearestTriangle = false; [ObservableProperty] private bool _doDelaunayLib = false; [ObservableProperty] private bool _doBowyerWatson = true; @@ -39,6 +40,8 @@ public partial class MainWindowViewModel : ViewModelBase [ObservableProperty] private int? _generationDelay = 20; private CancellationTokenSource? _genCts; + [ObservableProperty] private bool _isGenerationRunning = false; + public double Width { get; set; } = 1280; public double Height { get; set; } = 720; @@ -171,6 +174,24 @@ public partial class MainWindowViewModel : ViewModelBase } } + async Task ConnectPointsV2(CancellationToken ct) + { + if(Points.Count == 0) return; + Edges.Clear(); + foreach (var p1 in Points) + { + foreach (var p2 in Points) + { + if (p1 == p2) continue; + if(Edges.Any(x => (x.X1 == p1.X && x.Y1 == p1.X && x.X2 == p2.X && x.Y2 == p2.Y) || (x.X1 == p2.X && x.Y1 == p2.X && x.X2 == p1.X && x.Y2 == p1.Y))) continue; + ct.ThrowIfCancellationRequested(); + ConnectPoint(p1, p2); + + await DelayAsync(ct); + } + } + } + void AddTriangle(Geometries.Point p1, Geometries.Point p2, Geometries.Point p3) => Triangles.Add(new(p1, p2, p3)); async Task Triangulate(CancellationToken ct) @@ -521,6 +542,8 @@ public partial class MainWindowViewModel : ViewModelBase } } + public void CancelGeneration() => _genCts?.CancelAsync(); + private Task DelayAsync(CancellationToken ct) => GenerationDelay > 0 ? Task.Delay(GenerationDelay ?? 0, ct) : Task.CompletedTask; @@ -534,6 +557,7 @@ public partial class MainWindowViewModel : ViewModelBase } catch (OperationCanceledException) { + IsGenerationRunning = false; } } @@ -545,11 +569,16 @@ public partial class MainWindowViewModel : ViewModelBase Triangles.Clear(); VoronoiDiagram.Clear(); + IsGenerationRunning = true; + await GenerateRandomPoints(PointCount ?? 20, ct); if(DoConnectPoints) await ConnectPoints(ct); - if(DoNearestTriangle) await Triangulate(ct); - if(DoDelaunayLib) await DelaunayTriangulateAsync(ct); - if(DoBowyerWatson) await BowyerWatson(ct); + else if(DoConnectPointsV2) await ConnectPointsV2(ct); + else if(DoNearestTriangle) await Triangulate(ct); + else if(DoDelaunayLib) await DelaunayTriangulateAsync(ct); + else if(DoBowyerWatson) await BowyerWatson(ct); + + IsGenerationRunning = false; } private bool CanGenerate() => true; diff --git a/DelaunayTriangulation/Views/MainWindow.axaml b/DelaunayTriangulation/Views/MainWindow.axaml index ac0d5e1..4f60765 100644 --- a/DelaunayTriangulation/Views/MainWindow.axaml +++ b/DelaunayTriangulation/Views/MainWindow.axaml @@ -109,16 +109,21 @@ - + - - + + + + + + -