public void GridToTINDecimatorTests_BuildMesh_GetTIN() { var dataStore = new DecimationElevationSubGridTree(); SubGridUtilities.SubGridDimensionalIterator((x, y) => { dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + x, SubGridTreeConsts.DefaultIndexOriginOffset + y] = 100f; }); var decimator = new GridToTINDecimator(dataStore); decimator.SetDecimationExtents(DataStoreExtents(dataStore)); bool result = decimator.BuildMesh(); result.Should().BeTrue($"Failed to build mesh from data store with a sub grid of points fault code {decimator.BuildMeshFaultCode}"); decimator.GetTIN().Should().NotBeNull(); //string fileName = $@"C:\temp\UnitTestExportTTM({DateTime.Now.Ticks}).ttm"; //decimator.GetTIN().SaveToFile(fileName, true); //TrimbleTINModel tin = new TrimbleTINModel(); //tin.LoadFromFile(fileName); decimator.GetTIN().Triangles.Count.Should().Be(3); decimator.GetTIN().Triangles[0].Vertices.ForEach(x => x.Z.Should().Be(100f)); decimator.GetTIN().Vertices.Count.Should().Be(5); decimator.GetTIN().Vertices.ForEach(x => x.Z.Should().Be(100.0f)); }
public void GridToTINDecimatorTests_BuildMesh_SinglePoint() { DecimationElevationSubGridTree dataStore = new DecimationElevationSubGridTree(); dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 100, SubGridTreeConsts.DefaultIndexOriginOffset + 100] = 100.0f; GridToTINDecimator decimator = new GridToTINDecimator(dataStore); decimator.SetDecimationExtents(DataStoreExtents(dataStore)); bool result = decimator.BuildMesh(); Assert.True(result && decimator.GetTIN().Triangles.Count == 0, $"Failed to fail to build mesh from data store with single point fault code {decimator.BuildMeshFaultCode}"); }
public void GridToTINDecimatorTests_BuildMesh_ExceedPointLimit() { DecimationElevationSubGridTree dataStore = new DecimationElevationSubGridTree(); dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 100, SubGridTreeConsts.DefaultIndexOriginOffset + 100] = 100.0f; dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 101, SubGridTreeConsts.DefaultIndexOriginOffset + 101] = 100.0f; dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 101, SubGridTreeConsts.DefaultIndexOriginOffset + 100] = 100.0f; GridToTINDecimator decimator = new GridToTINDecimator(dataStore); decimator.PointLimit = 2; decimator.SetDecimationExtents(DataStoreExtents(dataStore)); decimator.BuildMesh().Should().BeFalse(); decimator.BuildMeshFaultCode.Should().Be(DecimationResult.VerticesExceeded); }
public void GridToTINDecimatorTests_BuildMesh_ThreePoints() { DecimationElevationSubGridTree dataStore = new DecimationElevationSubGridTree(); dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 100, SubGridTreeConsts.DefaultIndexOriginOffset + 100] = 100.0f; dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 101, SubGridTreeConsts.DefaultIndexOriginOffset + 101] = 100.0f; dataStore[SubGridTreeConsts.DefaultIndexOriginOffset + 101, SubGridTreeConsts.DefaultIndexOriginOffset + 100] = 100.0f; GridToTINDecimator decimator = new GridToTINDecimator(dataStore); decimator.SetDecimationExtents(DataStoreExtents(dataStore)); bool result = decimator.BuildMesh(); Assert.True(result, $"Failed to build mesh from data store with three points fault code {decimator.BuildMeshFaultCode}"); }
private BoundingWorldExtent3D DataStoreExtents(DecimationElevationSubGridTree dataStore) { BoundingWorldExtent3D ComputedGridExtent = BoundingWorldExtent3D.Inverted(); dataStore.ScanAllSubGrids(subGrid => { SubGridUtilities.SubGridDimensionalIterator((x, y) => { float elev = ((GenericLeafSubGrid <float>)subGrid).Items[x, y]; if (elev != 0) { ComputedGridExtent.Include((int)(subGrid.OriginX + x), (int)(subGrid.OriginY + y), elev); } else { ((GenericLeafSubGrid <float>)subGrid).Items[x, y] = TRex.Common.Consts.NullHeight; } }); return(true); }); if (ComputedGridExtent.IsValidPlanExtent) { ComputedGridExtent.Offset(-(int)SubGridTreeConsts.DefaultIndexOriginOffset, -(int)SubGridTreeConsts.DefaultIndexOriginOffset); } // Convert the grid rectangle to a world rectangle BoundingWorldExtent3D ComputedWorldExtent = new BoundingWorldExtent3D ((ComputedGridExtent.MinX - 0.01) * dataStore.CellSize, (ComputedGridExtent.MinY - 0.01) * dataStore.CellSize, (ComputedGridExtent.MaxX + 1 + 0.01) * dataStore.CellSize, (ComputedGridExtent.MaxY + 1 + 0.01) * dataStore.CellSize, ComputedGridExtent.MinZ, ComputedGridExtent.MaxZ); return(ComputedWorldExtent); }