public static Tetrahedron CheckBoundary(TetFace face) { Tetrahedron t0 = face.Tetras.Count > 0 && face.Tetras[0].Flag > 0 ? face.Tetras[0] : null; Tetrahedron t1 = face.Tetras.Count > 1 && face.Tetras[1].Flag > 0 ? face.Tetras[1] : null; if (t0 != null && t1 == null) { return(t0); } else if (t0 == null && t1 != null) { return(t1); } else { return(null); } }
void ReadEleFile() { string[] all = File.ReadAllLines(eleFile); int[] arr = ReadIntLine(GetFirstLine(all)); foreach (var line in GetRemainingLine(all)) { arr = ReadIntLine(line); Tetrahedron tetra = new Tetrahedron(); for (int i = 0; i < 4; i++) { tetra.Vertices.Add(mesh.Vertices[arr[i + 1]]); } tetra.Vertices.TrimExcess(); tetra.Index = mesh.Tetras.Count; mesh.Tetras.Add(tetra); } }
public static Vector3D ComputeNormal(TetFace face) { if (face.OnBoundary) { return(TetMeshUtil.ComputeNormal(face)); } Tetrahedron selected = CheckBoundary(face); if (selected == null) { return(Vector3D.Zero); } Vector3D[] v = new Vector3D[3]; for (int i = 0; i < 3; i++) { v[i] = face.Vertices[i].Pos; } Vector3D n = (v[1] - v[0]).Cross(v[0] - v[2]).Normalize(); foreach (var vt in selected.Vertices) { bool top = true; foreach (var vf in face.Vertices) { if (vt == vf) { top = false; break; } } if (top && n.Dot(vt.Pos - v[0]) > 0) { n = -n; TetVertex temp = face.Vertices[0]; face.Vertices[0] = face.Vertices[2]; face.Vertices[2] = temp; break; } } return(n); }
void RefreshTetrahedron() { TetMesh mesh = GlobalData.Instance.TetMesh; this.onLoad = true; this.tetrahedronView.Rows.Clear(); this.tetrahedronView.Rows.Add(mesh.Tetras.Count); for (int i = 0; i < mesh.Tetras.Count; i++) { Tetrahedron tet = mesh.Tetras[i]; DataGridViewRow row = this.tetrahedronView.Rows[i]; row.Cells["TIndex"].Value = tet.Index; row.Cells["TFlag"].Value = tet.Flag; row.Cells["TBoundary"].Value = tet.OnBoundary; row.Cells["TV0"].Value = tet.Vertices[0].Index; row.Cells["TV1"].Value = tet.Vertices[1].Index; row.Cells["TV2"].Value = tet.Vertices[2].Index; row.Cells["TV3"].Value = tet.Vertices[3].Index; } this.onLoad = false; }
public static PlaneIntersectionType Intersect(Plane plane, Tetrahedron tet) { int back = 0; int front = 0; foreach (var v in tet.Vertices) { switch (Intersect(plane, v)) { case PlaneIntersectionType.Back: back++; break; case PlaneIntersectionType.Front: front++; break; case PlaneIntersectionType.Intersecting: break; default: break; } } if (back == 0) { return(PlaneIntersectionType.Front); } else if (front == 0) { return(PlaneIntersectionType.Back); } else { return(PlaneIntersectionType.Intersecting); } }
public static PlaneIntersectionType Intersect(Plane plane, Tetrahedron tet) { int back = 0; int front = 0; foreach (var v in tet.Vertices) { switch (Intersect(plane,v)) { case PlaneIntersectionType.Back: back++; break; case PlaneIntersectionType.Front: front++; break; case PlaneIntersectionType.Intersecting: break; default: break; } } if (back == 0) { return PlaneIntersectionType.Front; } else if (front == 0) { return PlaneIntersectionType.Back; } else { return PlaneIntersectionType.Intersecting; } }