Exemple #1
0
        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));
        }
Exemple #2
0
        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}");
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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}");
        }
Exemple #5
0
        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);
        }