Exemplo n.º 1
0
        public static SparseMatrix BuildMatrixDualL(ref NonManifoldMesh mesh)
        {
            // build dual Laplacian weight matrix L

            int          vn = mesh.VertexCount;
            int          fn = mesh.FaceCount;
            SparseMatrix L  = new SparseMatrix(fn, vn, 6);

            for (int i = 0; i < fn; i++)
            {
                int      f1     = mesh.AdjFF[i][0];
                int      f2     = mesh.AdjFF[i][1];
                int      f3     = mesh.AdjFF[i][2];
                Vector3D dv     = mesh.GetDualPosition(i);
                Vector3D dv1    = mesh.GetDualPosition(f1);
                Vector3D dv2    = mesh.GetDualPosition(f2);
                Vector3D dv3    = mesh.GetDualPosition(f3);
                Vector3D u      = dv - dv3;
                Vector3D v1     = dv1 - dv3;
                Vector3D v2     = dv2 - dv3;
                Vector3D normal = (v1.Cross(v2)).Normalize();
                Matrix3D M      = new Matrix3D(v1, v2, normal);
                Vector3D coord  = M.Inverse() * u;
                double   alpha;

                alpha = 1.0 / 3.0;
                for (int j = 0, k = i * 3; j < 3; j++)
                {
                    L.AddValueTo(i, mesh.FaceIndex[k++], alpha);
                }

                alpha = coord[0] / 3.0;
                for (int j = 0, k = f1 * 3; j < 3; j++)
                {
                    L.AddValueTo(i, mesh.FaceIndex[k++], -alpha);
                }

                alpha = coord[1] / 3.0;
                for (int j = 0, k = f2 * 3; j < 3; j++)
                {
                    L.AddValueTo(i, mesh.FaceIndex[k++], -alpha);
                }

                alpha = (1.0 - coord[0] - coord[1]) / 3.0;
                for (int j = 0, k = f3 * 3; j < 3; j++)
                {
                    L.AddValueTo(i, mesh.FaceIndex[k++], -alpha);
                }
            }

            L.SortElement();
            return(L);
        }
Exemplo n.º 2
0
 public void DrawLapCoord(NonManifoldMesh mesh)
 {
     GL.LineWidth(2.0f);
     GL.Color3(1.0, 0.0, 0.0);
     GL.Begin(BeginMode.Lines);
     double[] lapCoordiante = MeshOperators.ComputeDualLap(ref mesh);
     for (int i = 0, j = 0; i < mesh.FaceCount; i++, j += 3)
     {
         GraphicResearchHuiZhao.Vector3D u   = mesh.GetDualPosition(i);
         GraphicResearchHuiZhao.Vector3D lap = new GraphicResearchHuiZhao.Vector3D(lapCoordiante[j], lapCoordiante[j + 1], lapCoordiante[j + 2]);
         GraphicResearchHuiZhao.Vector3D v   = u + 3.0 * lap;
         GL.Vertex3(u.x, u.y, u.z);
         GL.Vertex3(v.x, v.y, v.z);
     }
     GL.End();
 }
Exemplo n.º 3
0
        public static SparseMatrix BuildMatrixDualL(ref NonManifoldMesh mesh)
        {
            // build dual Laplacian weight matrix L

            int vn = mesh.VertexCount;
            int fn = mesh.FaceCount;
            SparseMatrix L = new SparseMatrix(fn, vn, 6);

            for (int i = 0; i < fn; i++)
            {
                int f1 = mesh.AdjFF[i][0];
                int f2 = mesh.AdjFF[i][1];
                int f3 = mesh.AdjFF[i][2];
                Vector3D dv = mesh.GetDualPosition(i);
                Vector3D dv1 = mesh.GetDualPosition(f1);
                Vector3D dv2 = mesh.GetDualPosition(f2);
                Vector3D dv3 = mesh.GetDualPosition(f3);
                Vector3D u = dv - dv3;
                Vector3D v1 = dv1 - dv3;
                Vector3D v2 = dv2 - dv3;
                Vector3D normal = (v1.Cross(v2)).Normalize();
                Matrix3D M = new Matrix3D(v1, v2, normal);
                Vector3D coord = M.Inverse() * u;
                double alpha;

                alpha = 1.0 / 3.0;
                for (int j = 0, k = i * 3; j < 3; j++)
                    L.AddValueTo(i, mesh.FaceIndex[k++], alpha);

                alpha = coord[0] / 3.0;
                for (int j = 0, k = f1 * 3; j < 3; j++)
                    L.AddValueTo(i, mesh.FaceIndex[k++], -alpha);

                alpha = coord[1] / 3.0;
                for (int j = 0, k = f2 * 3; j < 3; j++)
                    L.AddValueTo(i, mesh.FaceIndex[k++], -alpha);

                alpha = (1.0 - coord[0] - coord[1]) / 3.0;
                for (int j = 0, k = f3 * 3; j < 3; j++)
                    L.AddValueTo(i, mesh.FaceIndex[k++], -alpha);

              
            }

            L.SortElement();
            return L;
        }
Exemplo n.º 4
0
 public void DrawLapCoord(NonManifoldMesh mesh)
 {
     GL.LineWidth(2.0f);
     GL.Color3(1.0, 0.0, 0.0);
     GL.Begin(BeginMode.Lines);
     double[] lapCoordiante = MeshOperators.ComputeDualLap(ref mesh);
     for (int i = 0, j = 0; i < mesh.FaceCount; i++, j += 3)
     {
         GraphicResearchHuiZhao.Vector3D u = mesh.GetDualPosition(i);
         GraphicResearchHuiZhao.Vector3D lap = new GraphicResearchHuiZhao.Vector3D(lapCoordiante[j], lapCoordiante[j + 1], lapCoordiante[j + 2]);
         GraphicResearchHuiZhao.Vector3D v = u + 3.0 * lap;
         GL.Vertex3(u.x, u.y, u.z);
         GL.Vertex3(v.x, v.y, v.z);
     }
     GL.End();
 }