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; } } }
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); }
public HeFace CreateFace(HalfEdge head) { HeFace face = new HeFace(head); face.ID = FaceIdProvider.getNew(); return(face); }
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; } } }
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); }
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]; } }
// 三角形の追加 // 左右回り方を統一して追加するようにする 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; }
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); }
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; } } }
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; }