public MeshEdge(int index, Vector2i e) { mIndex = index; mPointIndex = e; mSharedFaces = new HashSet <int>(); }
public MeshEdge(int index, int start, int end) { mIndex = index; mPointIndex = new Vector2i(start, end); mSharedFaces = new HashSet <int>(); }
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); } } }
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); }
public void SharedFace(int f1, int f2) { mSharedTriangles = Vector2i.GetVector2i(f1, f2); }
public SharedEdge(int index, int i, int j, int other) { mEdgeVertexIndex = Vector2i.GetVector2i(i, j); mFaceIndex = index; mOtherVertex = other; }