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); }
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); }); }
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); }); }
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); }
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); }); }