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 @@
-
+
-
-
+
+
+
+
+
+
-
+
+