// Copyright (C) Stichting Deltares 2021. All rights reserved. // // This file is part of the Dam Engine. // // The Dam Engine is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Deltares.DamEngine.Data.Geometry; using NUnit.Framework; namespace Deltares.DamEngine.Data.Tests.General { [TestFixture] public class GeometryDataTests { [Test] public void TestRemoveDoublesFromNewlyEffectedPointsAndCurves() { var point1 = new Point2D(1, 0); // to be kept var point2 = new Point2D(1, 0); // to be removed as == p1 var point3 = new Point2D(5, 0); // to be kept var point4 = new Point2D(5, 0); // to be removed as == p3 var point5 = new Point2D(1, 0); // to be removed as == p1 var point6 = new Point2D(5, 0); // to be removed as == p3 var curve1 = new GeometryCurve(point1, point2); // to be removed as no lenght var curve2 = new GeometryCurve(point2, point3); // to be kept var curve3 = new GeometryCurve(point1, point2); // to be removed as no lenght var curve4 = new GeometryCurve(point4, point1); // to be removed as == c2 (in reverse order) var curve5 = new GeometryCurve(point3, point5); // to be removed as == c2 (in reverse order) var curve6 = new GeometryCurve(point1, point1); // to be removed as no lenght var curve7 = new GeometryCurve(point1, point1); // to be removed as no lenght var curve8 = new GeometryCurve(null, null); // to be removed as no points var curve9 = new GeometryCurve(null, point2); // to be removed as no headpoint var curve10 = new GeometryCurve(point3, null); // to be removed as no endpoint var geometrymodel = new GeometryData(); geometrymodel.NewlyEffectedPoints.Add(point1); geometrymodel.NewlyEffectedPoints.Add(point2); geometrymodel.NewlyEffectedPoints.Add(point3); geometrymodel.NewlyEffectedPoints.Add(point4); geometrymodel.NewlyEffectedPoints.Add(point5); geometrymodel.NewlyEffectedPoints.Add(point6); geometrymodel.NewlyEffectedCurves.Add(curve1); geometrymodel.NewlyEffectedCurves.Add(curve2); geometrymodel.NewlyEffectedCurves.Add(curve3); geometrymodel.NewlyEffectedCurves.Add(curve4); geometrymodel.NewlyEffectedCurves.Add(curve5); geometrymodel.NewlyEffectedCurves.Add(curve6); geometrymodel.NewlyEffectedCurves.Add(curve7); geometrymodel.NewlyEffectedCurves.Add(curve8); geometrymodel.NewlyEffectedCurves.Add(curve9); geometrymodel.NewlyEffectedCurves.Add(curve10); geometrymodel.RemoveDoublesFromNewlyEffectedPointsAndCurves(); // only two points are unique by location Assert.AreEqual(2, geometrymodel.NewlyEffectedPoints.Count); // only two curves hold both head and endpoint with unique locations Assert.AreEqual(1, geometrymodel.NewlyEffectedCurves.Count); } [Test] public void GeometryHelperTestSurfaceTwoVertLayers() { var gData = CreateGeometrySurface2(); var line = gData.SurfaceLine; Assert.AreEqual(3, line.Points.Count); Assert.AreEqual(1.0, line.Points.OrderBy(p => p.X).First().X); Assert.AreEqual(10.0, line.Points.OrderByDescending(p => p.X).First().X); } [Test] public void GeometryDataTestSurfaceTwoHorLayers() { var gData = CreateGeometrySurface(); var line = gData.SurfaceLine; Assert.AreEqual(2, line.CalcPoints.Count); Assert.AreEqual(1.0, line.CalcPoints.OrderBy(p => p.X).First().X); Assert.AreEqual(10.0, line.CalcPoints.OrderByDescending(p => p.X).First().X); } [Test] public void TestSimpleGeneration() { var geom = new GeometryData { Left = 0, Bottom = 0, Right = 100 }; var p1 = new Point2D(0, 5); geom.NewlyEffectedPoints.Add(p1); var p2 = new Point2D(100, 5); geom.NewlyEffectedPoints.Add(p2); var p3 = new Point2D(0, 0); geom.NewlyEffectedPoints.Add(p3); var p4 = new Point2D(100, 0); geom.NewlyEffectedPoints.Add(p4); geom.NewlyEffectedCurves.Add(new GeometryCurve(p1, p2)); geom.NewlyEffectedCurves.Add(new GeometryCurve(p3, p4)); geom.NewlyEffectedCurves.Add(new GeometryCurve(p1, p3)); geom.NewlyEffectedCurves.Add(new GeometryCurve(p2, p4)); geom.RegenerateGeometry(); Assert.AreEqual(4, geom.Points.Count); Assert.AreEqual(4, geom.Curves.Count); Assert.AreEqual(1, geom.Surfaces.Count); Assert.AreEqual(0, geom.Surfaces[0].InnerLoops.Count); Assert.AreEqual(4, geom.Surfaces[0].OuterLoop.Count); Assert.AreEqual(4, geom.Surfaces[0].OuterLoop.CurveList.Count); Assert.AreEqual(4, geom.Surfaces[0].OuterLoop.Points.Count); Assert.IsTrue(geom.Surfaces[0].OuterLoop.HasArea()); Assert.IsTrue(geom.Surfaces[0].OuterLoop.IsLoop()); Assert.IsTrue(geom.Surfaces[0].OuterLoop.IsPointInLoopArea(new Point2D(25, 3))); Assert.IsFalse(geom.Surfaces[0].OuterLoop.IsPointInLoopArea(new Point2D(25, 5.1))); } private GeometryData CreateGeometrySurface() { var geometryModel = new GeometryData(); /* The following model looks as follows * * |----------| * | | * |----------| * | | * |----------| * */ var point1 = new Point2D(1, 0); var point2 = new Point2D(10, 0); var point3 = new Point2D(10, 10); var point4 = new Point2D(1, 10); var point5 = new Point2D(1, 5); var point6 = new Point2D(10, 5); var curve1 = new GeometryCurve(point1, point2); var curve2 = new GeometryCurve(point2, point3); var curve3 = new GeometryCurve(point3, point4); var curve4 = new GeometryCurve(point4, point1); var curve5 = new GeometryCurve(point5, point6); geometryModel.Points.AddRange(new[] { point1, point2, point3, point4, point5, point6 }); geometryModel.Curves.AddRange(new[] { curve1, curve2, curve3, curve4, curve5 }); geometryModel.NewlyEffectedPoints.AddRange(geometryModel.Points); geometryModel.NewlyEffectedCurves.AddRange(geometryModel.Curves); geometryModel.RegenerateGeometry(); return geometryModel; } private GeometryData CreateGeometrySurface2() { var geometryModel = new GeometryData(); /* The following model looks as follows * * |-----|----| * | | | * | | | * | | | * |-----|----| * */ var point1 = new Point2D(1, 0); var point2 = new Point2D(1, 10); var point3 = new Point2D(5, 10); var point4 = new Point2D(5, 0); var point5 = new Point2D(10, 10); var point6 = new Point2D(10, 0); var curve1 = new GeometryCurve(point1, point2); var curve2 = new GeometryCurve(point2, point3); var curve3 = new GeometryCurve(point3, point4); var curve4 = new GeometryCurve(point4, point1); var curve5 = new GeometryCurve(point3, point5); var curve6 = new GeometryCurve(point5, point6); var curve7 = new GeometryCurve(point6, point4); geometryModel.Points.AddRange(new[] { point1, point2, point3, point4, point5, point6 }); geometryModel.Curves.AddRange(new[] { curve1, curve2, curve3, curve4, curve5, curve5, curve6, curve7 }); geometryModel.NewlyEffectedPoints.AddRange(geometryModel.Points); geometryModel.NewlyEffectedCurves.AddRange(geometryModel.Curves); geometryModel.RegenerateGeometry(); return geometryModel; } private GeometryData CreateDonutGeometry() { var geometryModel = new GeometryData { Left = -10, Bottom = -10, Right = 20 }; /* The following model looks as follows * * |----------| * | ------ | * | | | | * | | | | * | ------ | * |----------| * */ var point1 = new Point2D(0, 0); var point2 = new Point2D(0, 10); var point3 = new Point2D(10, 10); var point4 = new Point2D(10, 0); var point5 = new Point2D(3, 3); var point6 = new Point2D(3, 7); var point7 = new Point2D(7, 7); var point8 = new Point2D(7, 3); var curve1 = new GeometryCurve(point1, point2); var curve2 = new GeometryCurve(point2, point3); var curve3 = new GeometryCurve(point3, point4); var curve4 = new GeometryCurve(point4, point1); var curve5 = new GeometryCurve(point5, point6); var curve6 = new GeometryCurve(point6, point7); var curve7 = new GeometryCurve(point7, point8); var curve8 = new GeometryCurve(point8, point5); geometryModel.Points.AddRange(new[] { point1, point2, point3, point4, point5, point6, point7, point8 }); geometryModel.Curves.AddRange(new[] { curve1, curve2, curve3, curve4, curve5, curve5, curve6, curve7, curve8 }); geometryModel.NewlyEffectedPoints.AddRange(geometryModel.Points); geometryModel.NewlyEffectedCurves.AddRange(geometryModel.Curves); geometryModel.RegenerateGeometry(); return geometryModel; } } }