public void CanMergePointSets_0()
        {
            const int n          = 25;
            const int splitLimit = 5;

            var r       = new Random();
            var storage = PointSetTests.CreateStorage();
            var config  = ImportConfig.Default
                          .WithStorage(storage)
                          .WithOctreeSplitLimit(splitLimit)
                          .WithMinDist(0)
                          .WithNormalizePointDensityGlobal(false)
                          .WithVerbose(true)
            ;

            var ps1       = new V3d[n].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs1       = ps1.Map(_ => C4b.White);
            var ns1       = ps1.Map(_ => V3f.XAxis);
            var is1       = ps1.Map(_ => 123);
            var ks1       = ps1.Map(_ => (byte)0);
            var pointset1 = PointSet.Create(
                storage, "test1", ps1, cs1, ns1, is1, ks1, splitLimit,
                generateLod: false, isTemporaryImportNode: true, default
                );
            var pointset1Count = pointset1.Root.Value.CountPoints();

            Assert.IsTrue(pointset1Count == n);

            var ps2       = new V3d[n].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs2       = ps2.Map(_ => C4b.White);
            var ns2       = ps2.Map(_ => V3f.XAxis);
            var is2       = ps2.Map(_ => 456);
            var ks2       = ps2.Map(_ => (byte)1);
            var pointset2 = PointSet.Create(
                storage, "test2", ps2, cs2, ns2, is2, ks2, splitLimit,
                generateLod: false, isTemporaryImportNode: true, default
                );
            var pointset2Count = pointset2.Root.Value.CountPoints();

            Assert.IsTrue(pointset2Count == n);

            var merged = pointset1.Merge(pointset2, null, config);

            Assert.IsTrue(merged.PointCount == n + n);
            Assert.IsTrue(merged.Root.Value.PointCountTree == n + n);
            var mergedCount = merged.Root.Value.CountPoints();

            Assert.IsTrue(mergedCount == n + n);
        }
Beispiel #2
0
        public void DisablingLodCreationWorks()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs = ps.Map(_ => C4b.White);

            var pointset = PointSet.Create(storage, "test", ps.ToList(), cs.ToList(), null, null, 5000, false, CancellationToken.None);

            pointset.Root.Value.ForEachNode(true, cell =>
            {
                Assert.IsTrue(cell.LodPointCount == 0);
            });

            var config = ImportConfig.Default
                         .WithKey("Test")
                         .WithOctreeSplitLimit(1)
                         .WithCreateOctreeLod(false)
            ;
            var lodded = pointset.GenerateLod(config);

            lodded.Root.Value.ForEachNode(true, cell =>
            {
                Assert.IsTrue(cell.LodPointCount == 0);
                Assert.IsTrue(cell.HasLodPositions == false);
            });
        }
Beispiel #3
0
        public void Serialization()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs = ps.Map(_ => C4b.White);

            var pointset = PointSet.Create(storage, "test", ps.ToList(), cs.ToList(), null, null, 5000, false, CancellationToken.None);

            var config = ImportConfig.Default
                         .WithKey("lod")
                         .WithOctreeSplitLimit(1)
            ;
            var lodded = pointset.GenerateLod(config);

            var json     = lodded.ToJson();
            var relodded = PointSet.Parse(json, storage);

            var xs = new Queue <long>();

            lodded.Root.Value.ForEachNode(true, cell =>
            {
                xs.Enqueue(cell.PointCount);
                xs.Enqueue(cell.PointCountTree);
            });
            relodded.Root.Value.ForEachNode(true, cell =>
            {
                Assert.IsTrue(xs.Dequeue() == cell.PointCount);
                Assert.IsTrue(xs.Dequeue() == cell.PointCountTree);
            });
        }
        public void LodCreationSetsLodPointCountCell()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs = ps.Map(_ => C4b.White);

            var pointset = PointSet.Create(
                storage, "test", ps.ToList(), cs.ToList(), null, null, null, 5000,
                generateLod: false, isTemporaryImportNode: true, ct: default
                );

            pointset.Root.Value.ForEachNode(true, cell =>
            {
                Assert.IsTrue(cell.IsNotLeaf() || cell.Positions != null);
            });

            var config = ImportConfig.Default
                         .WithKey("Test")
                         .WithOctreeSplitLimit(1)
            ;
            var lodded = pointset.GenerateLod(config);

            lodded.Root.Value.ForEachNode(true, cell =>
            {
                Assert.IsTrue(cell.Positions.Value.Length > 0);
            });
        }
Beispiel #5
0
        public static double ComputeUnscaledFormFactor(
            this Polygon3d polygon,
            V3d p, V3d n,
            double eps = 1e-6)
        {
            var vc = polygon.PointCount;

            V3d[] cpa = new V3d[vc + 1];

            var cc = 0;
            var pb = polygon[0] - p;
            var hb = V3d.Dot(pb, n); bool hbp = hb > eps, hbn = hb < -eps;

            if (hb >= -eps)
            {
                cpa[cc++] = pb;
            }
            var p0 = pb; var h0 = hb; var h0p = hbp; var h0n = hbn;

            for (int vi = 1; vi < vc; vi++)
            {
                var  p1 = polygon[vi] - p; var h1 = V3d.Dot(p1, n);
                bool h1p = h1 > eps, h1n = h1 < -eps;
                if (h0p && h1n || h0n && h1p)
                {
                    cpa[cc++] = p0 + (p1 - p0) * (h0 / (h0 - h1));
                }
                if (h1 >= -eps)
                {
                    cpa[cc++] = p1;
                }
                p0 = p1; h0 = h1; h0p = h1p; h0n = h1n;
            }
            if (h0p && hbn || h0n && hbp)
            {
                cpa[cc++] = p0 + (pb - p0) * (h0 / (h0 - hb));
            }

            var cpr = cpa.Map(cc, v => v.Length);

            var    cv = V3d.Cross(cpa[0], cpa[cc - 1]);
            double ff = V3d.Dot(n, cv)
                        * Fun.AcosC(V3d.Dot(cpa[0], cpa[cc - 1])
                                    / (cpr[0] * cpr[cc - 1]))
                        / cv.Length;

            for (int ci = 0; ci < cc - 1; ci++)
            {
                cv  = V3d.Cross(cpa[ci + 1], cpa[ci]);
                ff += V3d.Dot(n, cv)
                      * Fun.AcosC(V3d.Dot(cpa[ci + 1], cpa[ci])
                                  / (cpr[ci + 1] * cpr[ci]))
                      / cv.Length;
            }
            return(ff);
        }
        public void CanMergePointSets_WithoutNormals()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps1       = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs1       = ps1.Map(_ => C4b.White);
            var is1       = ps1.Map(_ => 123);
            var pointset1 = PointSet.Create(storage, "test1", ps1, cs1, null, is1, 1000, true, CancellationToken.None);

            var ps2       = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble() + 0.3, r.NextDouble() + 0.3, r.NextDouble() + 0.3));
            var cs2       = ps2.Map(_ => C4b.White);
            var is2       = ps2.Map(_ => 456);
            var pointset2 = PointSet.Create(storage, "test2", ps2, cs2, null, is2, 1000, true, CancellationToken.None);

            var merged = pointset1.Merge(pointset2, CancellationToken.None);

            Assert.IsTrue(merged.PointCount == 84000);
            Assert.IsTrue(merged.Root.Value.PointCountTree == 84000);
            Assert.IsTrue(merged.Root.Value.CountPoints() == 84000);
        }
Beispiel #7
0
        public void LodPositions()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs = ps.Map(_ => C4b.White);

            var pointset = PointSet.Create(storage, "test", ps.ToList(), cs.ToList(), null, null, 5000, false, CancellationToken.None);

            pointset.Root.Value.ForEachNode(true, cell =>
            {
                if (cell.IsLeaf)
                {
                    Assert.IsTrue(cell.PointCount > 0);
                    Assert.IsTrue(cell.Positions.Value.Length == cell.PointCount);
                    Assert.IsTrue(cell.LodPositions == null);
                    Assert.IsTrue(cell.LodPointCount == 0);
                }
                else
                {
                    Assert.IsTrue(cell.PointCount == 0);
                    Assert.IsTrue(cell.Positions == null);
                    Assert.IsTrue(cell.LodPositions == null);
                    Assert.IsTrue(cell.LodPointCount == 0);
                }
            });

            var config = ImportConfig.Default
                         .WithKey("lod")
                         .WithOctreeSplitLimit(1)
            ;
            var lodded = pointset.GenerateLod(config);

            lodded.Root.Value.ForEachNode(true, cell =>
            {
                if (cell.IsLeaf)
                {
                    Assert.IsTrue(cell.PointCount > 0);
                    Assert.IsTrue(cell.Positions.Value.Length == cell.PointCount);
                    Assert.IsTrue(cell.LodPositions.Value.Length == cell.PointCount);
                    Assert.IsTrue(cell.LodPointCount > 0);
                }
                else
                {
                    Assert.IsTrue(cell.PointCount == 0);
                    Assert.IsTrue(cell.Positions == null);
                    Assert.IsTrue(cell.LodPositions.Value.Length > 0);
                    Assert.IsTrue(cell.LodPointCount > 0);
                }
            });
        }
        public void CanMergePointSets_WithoutNormals()
        {
            const int splitLimit = 1000;

            var r       = new Random();
            var storage = PointSetTests.CreateStorage();
            var config  = ImportConfig.Default
                          .WithStorage(storage)
                          .WithOctreeSplitLimit(splitLimit)
                          .WithMinDist(0)
                          .WithNormalizePointDensityGlobal(false)
                          .WithVerbose(true)
            ;

            var ps1       = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs1       = ps1.Map(_ => C4b.White);
            var is1       = ps1.Map(_ => 123);
            var ks1       = ps1.Map(_ => (byte)42);
            var pointset1 = PointSet.Create(
                storage, "test1", ps1, cs1, null, is1, ks1, 1000,
                generateLod: false, isTemporaryImportNode: true, default
                );

            var ps2       = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble() + 0.3, r.NextDouble() + 0.3, r.NextDouble() + 0.3));
            var cs2       = ps2.Map(_ => C4b.White);
            var is2       = ps2.Map(_ => 456);
            var ks2       = ps2.Map(_ => (byte)7);
            var pointset2 = PointSet.Create(
                storage, "test2", ps2, cs2, null, is2, ks2, 1000,
                generateLod: false, isTemporaryImportNode: true, default
                );

            var merged = pointset1.Merge(pointset2, null, config);

            Assert.IsTrue(merged.PointCount == 84000);
            Assert.IsTrue(merged.Root.Value.PointCountTree == 84000);
            Assert.IsTrue(merged.Root.Value.CountPoints() == 84000);
        }
        private static PointSet _CreateRandomPointSetForOctreeLevelTests()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps = new V3d[51200].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs = ps.Map(_ => C4b.White);

            var config = ImportConfig.Default.WithKey("Test").WithOctreeSplitLimit(1);

            return(PointSet
                   .Create(storage, "test", ps.ToList(), cs.ToList(), null, null, 100, true, CancellationToken.None)
                   .GenerateLod(config)
                   );
        }
        public void LodPositions()
        {
            var r       = new Random();
            var storage = PointSetTests.CreateStorage();

            var ps = new V3d[42000].SetByIndex(_ => new V3d(r.NextDouble(), r.NextDouble(), r.NextDouble()));
            var cs = ps.Map(_ => C4b.White);

            var pointset = PointSet.Create(
                storage, "test", ps.ToList(), cs.ToList(), null, null, null, 5000,
                generateLod: true, isTemporaryImportNode: true, default
                );

            pointset.Root.Value.ForEachNode(true, cell =>
            {
                var pointcount = cell.Positions.Value.Length;
                Assert.IsTrue(pointcount > 0);
            });
        }