Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 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;
     }
 }