예제 #1
0
 public MeshEdge(int index, Vector2i e)
 {
     mIndex       = index;
     mPointIndex  = e;
     mSharedFaces = new HashSet <int>();
 }
예제 #2
0
 public MeshEdge(int index, int start, int end)
 {
     mIndex       = index;
     mPointIndex  = new Vector2i(start, end);
     mSharedFaces = new HashSet <int>();
 }
예제 #3
0
        private void Initialize(List <Vector3> vertices, List <int> faces)
        {
            for (int i = 0; i < vertices.Count; ++i)
            {
                mVertexes.Add(new MeshVertex(i, vertices[i]));
            }
            int count = faces.Count / 3;

            for (int i = 0; i < count; ++i)
            {
                int      p1    = faces[i * 3 + 0];
                int      p2    = faces[i * 3 + 1];
                int      p3    = faces[i * 3 + 2];
                Vector2i e1    = new Vector2i(p1, p2);
                Vector2i e2    = new Vector2i(p2, p3);
                Vector2i e3    = new Vector2i(p3, p1);
                int      i1    = mEdges.FindIndex((MeshEdge e) => { return(e.mPointIndex == e1); });
                int      i2    = mEdges.FindIndex((MeshEdge e) => { return(e.mPointIndex == e2); });
                int      i3    = mEdges.FindIndex((MeshEdge e) => { return(e.mPointIndex == e3); });
                int      index = mEdges.Count;
                if (i1 == -1)
                {
                    i1 = index++;
                    mEdges.Add(new MeshEdge(i1, e1));
                }
                if (i2 == -1)
                {
                    i2 = index++;
                    mEdges.Add(new MeshEdge(i2, e2));
                }
                if (i3 == -1)
                {
                    i3 = index++;
                    mEdges.Add(new MeshEdge(i3, e3));
                }
                mVertexes[p1].AddSharedEdges(i1);
                mVertexes[p2].AddSharedEdges(i2);
                mVertexes[p3].AddSharedEdges(i3);

                mVertexes[p1].AddSharedFaces(i);
                mVertexes[p2].AddSharedEdges(i);
                mVertexes[p3].AddSharedEdges(i);

                mVertexes[p1].AddNeiborPoint(p2);
                mVertexes[p1].AddNeiborPoint(p3);
                mVertexes[p2].AddNeiborPoint(p3);
                mVertexes[p2].AddNeiborPoint(p1);
                mVertexes[p3].AddNeiborPoint(p1);
                mVertexes[p3].AddNeiborPoint(p2);

                mEdges[i1].AddSharedFaces(i);
                mEdges[i2].AddSharedFaces(i);
                mEdges[i3].AddSharedFaces(i);

                MeshFace face = new MeshFace(i, p1, p2, p3, i1, i2, i3);
                mFaces.Add(face);
            }

            for (int i = 0; i < mFaces.Count; ++i)
            {
                foreach (int pi in mFaces[i].mPointIndex)
                {
                    mFaces[i].AddNeiborFaceByPoint(mVertexes[pi].mSharedFaces);
                }

                foreach (int ei in mFaces[i].mEdgeIndex)
                {
                    mFaces[i].AddNeiborFaceByEdge(mEdges[ei].mSharedFaces);
                }
            }
        }
예제 #4
0
        public static List <Vector2i> Scan(List <Vector2i> poly)
        {
            List <Vector2i> results = new List <Vector2i>();
            Vector2i        max     = new Vector2i(int.MinValue, int.MinValue);
            Vector2i        min     = new Vector2i(int.MaxValue, int.MaxValue);

            foreach (Vector2i v in poly)
            {
                max = Vector2i.Max(v, max);
                min = Vector2i.Min(v, min);
            }
            List <Vector2i> trans     = poly.Select(t => { return(t - min); }).ToList();
            int             height    = max[1] - min[1];
            List <ScanEdge> scanLines = new List <ScanEdge>();
            int             count     = trans.Count;
            int             count1    = count - 1;

            for (int i = 0; i < count; ++i)
            {
                Vector2i ps   = trans[i];
                int      post = (i + 1) % count;
                Vector2i pe   = trans[post];
                if (ps[1] == pe[1]) // 水平 去掉
                {
                    Vector2i hori = Vector2i.GetVector2i(ps[0], pe[0]);
                    for (int hi = hori[0]; hi <= hori[1]; ++hi)
                    {
                        results.Add(new Vector2i(hi, ps[1]));
                    }
                    continue;
                }
                int      pre    = (i + count1) % count;
                Vector2i pss    = trans[pre];
                int      ppost  = (post + 1) % count;
                Vector2i pee    = trans[ppost];
                double   dx     = (ps[0] - pe[0]) * 1.0f / (ps[1] - pe[1]);
                bool     yiG0   = ps[1] < pe[1];
                double   startX = yiG0 ? ps[0] : pe[0];
                int      ymin   = yiG0 ? ps[1] : pe[1];
                int      ymax   = yiG0 ? pe[1] : ps[1];
                if (pe[1] > ps[1])
                {
                    if (pee[1] >= pe[1])
                    {
                        ymax -= 1;
                    }
                }
                else
                {
                    if (pss[1] >= ps[1])
                    {
                        ymax -= 1;
                    }
                }
                ScanEdge ep = new ScanEdge();
                ep.mMinY   = ymin;
                ep.mMaxY   = ymax;
                ep.mStartX = startX;
                ep.mDx     = dx;
                scanLines.Add(ep);
            }

            for (int i = 0; i < height; ++i)
            {
                List <ScanEdge> tmp = scanLines.FindAll(delegate(ScanEdge line) { return(line.Include(i)); });
                tmp.Sort((e1, e2) =>
                {
                    //此处可以不考虑 斜率。 x相等时,不用考虑谁在前谁在后
                    return(e1.mStartX.CompareTo(e2.mStartX));
                });
                if (tmp.Count % 2 != 0)
                {
                    throw new Exception("必须是偶数");
                }
                for (int idx = 0; idx < tmp.Count; idx += 2)
                {
                    int next = idx + 1;
                    int x1   = (int)tmp[idx].mStartX;
                    int x2   = (int)tmp[next].mStartX;
                    if (x1 > x2)
                    {
                        continue;
                    }
                    for (int xi = x1; xi <= x2; ++xi)
                    {
                        results.Add(new Vector2i(xi, i));
                    }
                    tmp[idx].Increase();
                    tmp[next].Increase();
                }
                scanLines.RemoveAll((t) => t.mMaxY == i);
            }
            results = results.Select(t => { return(t + min); }).ToList();
            return(results);
        }
예제 #5
0
 public void SharedFace(int f1, int f2)
 {
     mSharedTriangles = Vector2i.GetVector2i(f1, f2);
 }
예제 #6
0
 public SharedEdge(int index, int i, int j, int other)
 {
     mEdgeVertexIndex = Vector2i.GetVector2i(i, j);
     mFaceIndex = index;
     mOtherVertex = other;
 }