Пример #1
0
        public void ForReachEdgePoint(Action <CadVertex> action)
        {
            HeFace f = FaceStore[0];

            HalfEdge head = f.Head;

            HalfEdge c = head;

            for (; ;)
            {
                if (c.Pair == null)
                {
                    action(VertexStore[c.Vertex]);
                    c = c.Next;
                }
                else
                {
                    c = c.Pair;
                    c = c.Next;
                }

                if (c.ID == head.ID)
                {
                    break;
                }
            }
        }
Пример #2
0
        public static HeModel ToHeModel(CadMesh src)
        {
            HeModel m = new HeModel();

            m.VertexStore = src.VertexStore;

            Dictionary <uint, HalfEdge> map = new Dictionary <uint, HalfEdge>();

            for (int fi = 0; fi < src.FaceStore.Count; fi++)
            {
                CadFace f = src.FaceStore[fi];

                int      vi         = f.VList[0];
                HalfEdge head       = m.CreateHalfEdge(vi);
                HalfEdge current_he = head;

                HeFace face      = m.CreateFace(head);
                int    faceIndex = m.FaceStore.Add(face);

                current_he.Face = faceIndex;

                HalfEdge next_he;

                for (int pi = 1; pi < f.VList.Count; pi++)
                {
                    vi      = f.VList[pi];
                    next_he = m.CreateHalfEdge(vi);

                    current_he.Next = next_he;
                    next_he.Prev    = current_he;

                    next_he.Face = faceIndex;

                    current_he = next_he;
                }

                head.Prev       = current_he;
                current_he.Next = head;


                HalfEdge c = head;

                for (; ;)
                {
                    HeConnector.SetHalfEdgePair(c, map);

                    map[HeConnector.GetHeKey(c)] = c;

                    c = c.Next;
                    if (c == head)
                    {
                        break;
                    }
                }
            }

            m.RecreateNormals();

            return(m);
        }
Пример #3
0
        public HeFace CreateFace(HalfEdge head)
        {
            HeFace face = new HeFace(head);

            face.ID = FaceIdProvider.getNew();
            return(face);
        }
Пример #4
0
        public void ForReachEdgePoint(Func <CadVertex, bool> func)
        {
            HeFace f = FaceStore[0];

            HalfEdge head = f.Head;

            HalfEdge c = head;

            for (; ;)
            {
                if (c.Pair == null)
                {
                    if (!func(VertexStore[c.Vertex]))
                    {
                        break;
                    }
                    c = c.Next;
                }
                else
                {
                    c = c.Pair;
                    c = c.Next;
                }

                if (c.ID == head.ID)
                {
                    break;
                }
            }
        }
Пример #5
0
        public List <int> GetEdgePointList()
        {
            List <int> idxList = new List <int>();

            HeFace f = FaceStore[0];

            HalfEdge head = f.Head;

            HalfEdge c = head;

            for (; ;)
            {
                if (c.Pair == null)
                {
                    idxList.Add(c.Vertex);
                    c = c.Next;
                }
                else
                {
                    c = c.Pair;
                    c = c.Next;
                }

                if (c.ID == head.ID)
                {
                    break;
                }
            }

            return(idxList);
        }
Пример #6
0
        public void InvertAllFace()
        {
            int i;

            for (i = 0; i < FaceStore.Count; i++)
            {
                HeFace face = FaceStore[i];

                HalfEdge head = FaceStore[i].Head;
                HalfEdge c    = head;

                for (; ;)
                {
                    HalfEdge next = c.Next;

                    c.Next = c.Prev;
                    c.Prev = next;

                    c = next;
                    if (c == head)
                    {
                        break;
                    }
                }
            }

            for (i = 0; i < NormalStore.Count; i++)
            {
                NormalStore[i] = -NormalStore[i];
            }
        }
Пример #7
0
        // 三角形の追加
        // 左右回り方を統一して追加するようにする
        public void AddTriangle(int v0, int v1, int v2)
        {
            HalfEdge he0 = mHeModel.CreateHalfEdge(v0);
            HalfEdge he1 = mHeModel.CreateHalfEdge(v1);
            HalfEdge he2 = mHeModel.CreateHalfEdge(v2);

            he0.Next = he1;
            he0.Prev = he2;
            he1.Next = he2;
            he1.Prev = he0;
            he2.Next = he0;
            he2.Prev = he1;

            // 法線の設定
            Vector3d normal = CadMath.Normal(
                mHeModel.VertexStore[v0].vector,
                mHeModel.VertexStore[v1].vector,
                mHeModel.VertexStore[v2].vector);

            // Faceの設定
            HeFace face = mHeModel.CreateFace(he0);

            if (!normal.IsInvalid())
            {
                face.Normal = mHeModel.NormalStore.Add(normal);
                he0.Normal  = mHeModel.NormalStore.Add(normal);
                he1.Normal  = mHeModel.NormalStore.Add(normal);
                he2.Normal  = mHeModel.NormalStore.Add(normal);
            }

            int faceIndex = mHeModel.FaceStore.Add(face);

            he0.Face = faceIndex;
            he1.Face = faceIndex;
            he2.Face = faceIndex;

            // Pairの設定
            HeConnector.SetHalfEdgePair(he0, HeMap);
            HeMap[HeConnector.GetHeKey(he0)] = he0;

            HeConnector.SetHalfEdgePair(he1, HeMap);
            HeMap[HeConnector.GetHeKey(he1)] = he1;

            HeConnector.SetHalfEdgePair(he2, HeMap);
            HeMap[HeConnector.GetHeKey(he2)] = he2;
        }
Пример #8
0
        public static CadFace ToCadFace(HeFace hef)
        {
            CadFace ret = new CadFace();

            HalfEdge head = hef.Head;
            HalfEdge c    = head;

            while (c != null)
            {
                ret.VList.Add(c.Vertex);

                c = c.Next;

                if (c == head)
                {
                    break;
                }
            }

            return(ret);
        }
Пример #9
0
        private void RemoveFaceLink(int idx)
        {
            HeFace face = FaceStore[idx];

            HalfEdge head = face.Head;
            HalfEdge c    = head;

            for (; ;)
            {
                if (c.Pair != null)
                {
                    c.Pair.Pair = null;
                    c.Pair      = null;
                }

                c = c.Next;
                if (c == head)
                {
                    break;
                }
            }
        }
Пример #10
0
        public void RecreateNormals()
        {
            Vector3dList newNormalStore = new Vector3dList(VertexStore.Count);

            int i;

            for (i = 0; i < FaceStore.Count; i++)
            {
                HeFace face = FaceStore[i];

                HalfEdge head = FaceStore[i].Head;
                HalfEdge c    = head;

                Vector3d n = CadMath.Normal(
                    VertexStore[c.Vertex].vector,
                    VertexStore[c.Next.Vertex].vector,
                    VertexStore[c.Next.Next.Vertex].vector
                    );

                face.Normal = newNormalStore.Add(n);

                for (; ;)
                {
                    c.Normal = newNormalStore.Add(n);

                    c = c.Next;

                    if (c == head)
                    {
                        break;
                    }
                }
            }

            NormalStore = newNormalStore;
        }