internal static bool IsItAllen(List <TemporaryFlat> candidateHexVal) { TemporaryFlat p1 = candidateHexVal[0], p2 = null; for (var i = 1; i < candidateHexVal.Count; i++) { var prim = candidateHexVal[i]; if (Math.Abs(prim.Normal.dotProduct(p1.Normal)) < 0.9) { p2 = prim; break; } } var refVector = p1.Normal.crossProduct(p2.Normal).normalize(); return (candidateHexVal.Any( p => p.OuterEdges.Any( e => 1 - Math.Abs(e.Vector.dotProduct(refVector)) < 0.8 && e.Curvature == CurvatureType.Concave))); }
internal static int VertsInfrontOfFlat(TessellatedSolid solid, TemporaryFlat flat) { return (solid.Vertices.Count( v => flat.Normal.dotProduct(v.Position.subtract(flat.Faces[0].Vertices[0].Position)) > 0)); }
EqualFlatPrimitiveAreaFinder(HashSet <TessellatedSolid> uniqueParts, Dictionary <TessellatedSolid, List <PrimitiveSurface> > solidPrimitive) { var equalPrim = new Dictionary <TessellatedSolid, Dictionary <TemporaryFlat, List <TemporaryFlat> > >(); foreach (var solid in uniqueParts) { var unassignedFaces = new List <PolygonalFace>(solid.Faces); var visited = new List <PolygonalFace>(); var flats = new List <TemporaryFlat>(); while (unassignedFaces.Any()) { var iniFace = unassignedFaces[0]; var flat = new TemporaryFlat { Faces = new List <PolygonalFace>() { iniFace }, Area = iniFace.Area, Normal = iniFace.Normal, OuterEdges = new List <Edge>(iniFace.Edges) }; var st = new Stack <PolygonalFace>(); st.Push(iniFace); while (st.Any()) { var face = st.Pop(); visited.Add(face); foreach (var edge in face.Edges) { var otherface = edge.OwnedFace == face ? edge.OtherFace : edge.OwnedFace; if (otherface == null) { continue; } if (visited.Contains(otherface)) { continue; } if (edge.InternalAngle < 3.14 && edge.InternalAngle > 0.002) { continue; } if (edge.InternalAngle > 3.1433 && edge.InternalAngle < 6.2814) { continue; } st.Push(otherface); flat.Faces.Add(otherface); flat.Area += otherface.Area; flat.OuterEdges.Remove(edge); flat.OuterEdges.AddRange(otherface.Edges.Where(e => e != edge)); } unassignedFaces.Remove(face); } flats.Add(flat); } var all = flats.Where(f => f.Faces.Count == 3); var primEqualArea = new Dictionary <TemporaryFlat, List <TemporaryFlat> >(); foreach (var potFl in flats.Where(f => f.Faces.Count > 1)) { var equalExist = primEqualArea.Keys.Where(p => Math.Abs(p.Area - potFl.Area) < 0.001 * p.Area) .ToList(); if (!equalExist.Any()) { primEqualArea.Add(potFl, new List <TemporaryFlat> { potFl }); } else { foreach (var equal in equalExist) { primEqualArea[equal].Add(potFl); break; } } } /*if (solidPrimitive[solid].Count == 0) equalPrim.Add(solid, new Dictionary<PrimitiveSurface, List<PrimitiveSurface>>()); * var primEqualArea = new Dictionary<PrimitiveSurface, List<PrimitiveSurface>>(); * foreach (var prim in solidPrimitive[solid].Where(p => p is Flat)) * { * var equalExist = primEqualArea.Keys.Where(p => Math.Abs(p.Area - prim.Area) < 0.001*p.Area).ToList(); * if (!equalExist.Any()) primEqualArea.Add(prim, new List<PrimitiveSurface> {prim}); * else * { * foreach (var equal in equalExist) * { * primEqualArea[equal].Add(prim); * break; * } * } * }*/ equalPrim.Add(solid, primEqualArea); } return(equalPrim); }