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));
 }
예제 #3
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);
        }