示例#1
0
文件: BRep2D.cs 项目: lulzzz/IvyFEM
        public bool RemoveVertex(uint vId)
        {
            uint uVId = vId;

            if (!BRep.IsUseVertexId(uVId))
            {
                return(false);
            }

            uint nEdgeAroundVtx = 0;

            {
                VertexEdgeItr vItr = new VertexEdgeItr(this, vId);
                nEdgeAroundVtx = vItr.GetEdgeCount();
            }

            if (nEdgeAroundVtx == 0)
            {
                System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uVId));
                if (!BRep.KVEL(uVId))
                {
                    System.Diagnostics.Debug.Assert(false);
                }
            }
            else if (nEdgeAroundVtx == 2)
            {
                UseVertex uV    = BRep.GetUseVertex(uVId);
                uint      hEId1 = uV.HEId;
                HalfEdge  hE1   = BRep.GetHalfEdge(hEId1);
                uint      eId1  = hE1.EId;
                uint      hEId2 = hE1.OHEId;
                HalfEdge  hE2   = BRep.GetHalfEdge(hEId2);
                {
                    uint        uLId1 = hE1.ULId;
                    uint        uLId2 = hE2.ULId;
                    LoopEdgeItr lItr1 = new LoopEdgeItr(this, hEId1, uLId1);
                    LoopEdgeItr lItr2 = new LoopEdgeItr(this, hEId2, uLId2);
                    uint        nLV1  = lItr1.GetUseLoopVertexCount();
                    uint        nLV2  = lItr2.GetUseLoopVertexCount();
                    System.Diagnostics.Debug.Assert(nLV1 > 1 && nLV2 > 1);
                    if (nLV1 == 2 || nLV2 == 2)
                    {
                        return(false);
                    }
                }
                uint uVId2 = hE2.UVId;
                System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uVId2));
                uint removeHEId1 = hEId1;
                if (!BRep.KVE(removeHEId1))
                {
                    System.Diagnostics.Debug.Assert(false);
                }
                System.Diagnostics.Debug.Assert(BRep.AssertValidUse() == 0);
                Edge2HalfEdge.Remove(eId1);
            }
            System.Diagnostics.Debug.Assert(AssertValid());
            return(true);
        }
示例#2
0
        public bool MoveVertex(uint vId, OpenTK.Vector2d vec)
        {
            if (!VertexArray.IsObjectId(vId))
            {
                return(false);
            }

            OpenTK.Vector2d preVec;
            {
                // store point to move point back in case it fails
                Vertex2D vertex = VertexArray.GetObject(vId);
                preVec = vertex.Point;
            }

            OpenTK.Vector2d dist = vec;
            {
                // move point
                Vertex2D vertex = VertexArray.GetObject(vId);
                vertex.Point = dist;
            }

            try
            {
                VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(vId);
                if (vItr.GetEdgeCount() == 0)
                {
                    // move point inside loop
                    uint lId = vItr.GetLoopId();
                    if (IsElementId(CadElementType.Loop, lId))
                    {
                        // ignore vtx(id_v) in the signd distance computation
                        double distance = SignedDistancePointLoop(lId, vec, vId);
                        if (distance < this.MinClearance)
                        {
                            throw new InvalidOperationException();
                        }
                    }
                }
                else
                {
                    // move point adjacent to loop
                    HashSet <uint> lIds = new HashSet <uint>();
                    for (; !vItr.IsEnd(); vItr++)
                    {
                        uint lId = vItr.GetLoopId();
                        if (IsElementId(CadElementType.Loop, lId))
                        {
                            if (!lIds.Contains(lId))
                            {
                                lIds.Add(lId);
                            }
                            else
                            {
                                continue;
                            }
                            if (CheckLoop(lId) != 0)
                            {
                                throw new InvalidOperationException();
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                ////////////////////////////////
                // fail
                {   // reset the moved point
                    Vertex2D vertex = VertexArray.GetObject(vId);
                    vertex.Point = preVec;
                }
                return(false);
            }
            return(true);
        }