예제 #1
0
        private static void SetPrevAndNextToExistingHalfEdge(BoundaryEdge bEdge, int existingHeHandle,
                                                             IList <BoundaryEdge> boundaryEdges, ICollection <HalfEdge> halfEdgesToUpdate)
        {
            var existingHe     = _geometry.GetHalfEdgeByHandle(existingHeHandle);
            var existingHeNext = _geometry.GetHalfEdgeByHandle(existingHe.NextHalfEdge);
            var existingHePrev = _geometry.GetHalfEdgeByHandle(existingHe.PrevHalfEdge);

            existingHe.NextHalfEdge = bEdge.HalfEdge.NextHalfEdge;
            existingHe.PrevHalfEdge = bEdge.HalfEdge.PrevHalfEdge;
            existingHe.IncidentFace = bEdge.HalfEdge.IncidentFace;

            for (var j = 0; j < boundaryEdges.Count; j++)
            {
                var count = 0;
                var be    = boundaryEdges[j];
                if (be.TwinHalfEdge.Handle == bEdge.TwinHalfEdge.PrevHalfEdge)
                {
                    var twinHalfEdge = be.TwinHalfEdge;
                    twinHalfEdge.NextHalfEdge = existingHeNext.Handle;

                    var halfEdge = be.HalfEdge;
                    halfEdge.PrevHalfEdge = existingHeHandle;

                    be.TwinHalfEdge = twinHalfEdge;
                    be.HalfEdge     = halfEdge;

                    existingHeNext.PrevHalfEdge = twinHalfEdge.Handle;

                    halfEdgesToUpdate.Add(existingHeNext);

                    boundaryEdges[j] = be;
                    count++;
                }

                if (be.TwinHalfEdge.Handle == bEdge.TwinHalfEdge.NextHalfEdge)
                {
                    var twinHalfEdge = be.TwinHalfEdge;
                    twinHalfEdge.PrevHalfEdge = existingHePrev.Handle;

                    var halfEdge = be.HalfEdge;
                    halfEdge.NextHalfEdge = existingHeHandle;

                    be.TwinHalfEdge = twinHalfEdge;
                    be.HalfEdge     = halfEdge;

                    existingHePrev.NextHalfEdge = twinHalfEdge.Handle;

                    halfEdgesToUpdate.Add(existingHePrev);

                    boundaryEdges[j] = be;
                    count++;
                }
                if (count == 2)
                {
                    break;
                }
            }
        }
예제 #2
0
        private static List <BoundaryEdge> BoundaryEdges(IList <KeyValuePair <Vertex, bool> > outlineVerts,
                                                         PolyBoundary polyBoundary)
        {
            var faceHandle    = new int();
            var boundaryEdges = new List <BoundaryEdge>();

            var halfEdgeHandle = 0;

            if (_geometry.DictHalfEdges.Count != 0)
            {
                halfEdgeHandle = _geometry.DictHalfEdges.Count;
            }

            for (var j = 0; j < outlineVerts.Count; j++)
            {
                var currentVert = outlineVerts[j];
                halfEdgeHandle++;

                if (!currentVert.Value)
                {
                    //Only necessary for new vertices.
                    var vert = currentVert.Key;
                    vert.IncidentHalfEdge = halfEdgeHandle;
                    _geometry.DictVertices.Add(vert.Handle, vert);
                }

                var halfEdge = new HalfEdge(halfEdgeHandle, currentVert.Key.Handle);


                halfEdgeHandle++;
                var twinHalfEdge = new HalfEdge(halfEdgeHandle, outlineVerts[(j + 1) % outlineVerts.Count].Key.Handle,
                                                halfEdge.Handle, 0, 0, 1);
                //The unbounded face is always added at first and therefor has 1 as handle.


                halfEdge.TwinHalfEdge = twinHalfEdge.Handle;

                //Assumption: outlines are processed from outer to inner, therefore faceHandle will never has its default value if "else" is hit.
                if (polyBoundary.IsOuter)
                {
                    if (faceHandle == default(int))
                    {
                        Face face;
                        faceHandle = AddFace(halfEdge.Handle, out face);
                        _geometry.DictFaces.Add(face.Handle, face);
                    }
                }
                else
                {
                    if (j == 0)
                    {
                        var lastFace = _geometry.DictFaces[_geometry.DictFaces.Keys.Max()];
                        lastFace.InnerHalfEdges.Add(halfEdge.Handle);
                    }
                    faceHandle = _geometry.DictFaces.Last().Value.Handle;
                }

                halfEdge.IncidentFace = faceHandle;

                if (!outlineVerts[j].Value)
                {
                    var unboundFace = _geometry.DictFaces[1];

                    if (j == 0)
                    {
                        unboundFace.InnerHalfEdges.Add(twinHalfEdge.Handle);
                        _geometry.DictFaces[1] = unboundFace;
                    }
                }

                var boundaryEdge = new BoundaryEdge
                {
                    IsOriginOldVert = currentVert.Value,
                    HalfEdge        = halfEdge,
                    TwinHalfEdge    = twinHalfEdge
                };
                boundaryEdges.Add(boundaryEdge);
            }
            return(boundaryEdges);
        }