Revision: 49537
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49537
Author:   psy-fi
Date:     2012-08-03 17:08:45 +0000 (Fri, 03 Aug 2012)
Log Message:
-----------
Isomap Unwrapper
==================
Add more debug prints, do math more according to the paper. Still not
having a good result :/

Modified Paths:
--------------
    
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c
    
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer_isomap.cpp

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c
===================================================================
--- 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c 
    2012-08-03 15:23:17 UTC (rev 49536)
+++ 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c 
    2012-08-03 17:08:45 UTC (rev 49537)
@@ -430,7 +430,7 @@
                       ((v3->uv[0] - v1->uv[0]) * (v2->uv[1] - v1->uv[1])));
 }
 
-static float p_edge_length_squared(PEdge *e)
+static float p_edge_length(PEdge *e)
 {
        PVert *v1 = e->vert, *v2 = e->next->vert;
        float d[3];
@@ -439,12 +439,8 @@
        d[1] = v2->co[1] - v1->co[1];
        d[2] = v2->co[2] - v1->co[2];
 
-       return d[0] * d[0] + d[1] * d[1] + d[2] * d[2];
+       return sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
 }
-static float p_edge_length(PEdge *e)
-{
-       return sqrt(p_edge_length_squared(e));
-}
 
 static float p_edge_uv_length(PEdge *e)
 {
@@ -3082,10 +3078,11 @@
                PEdge *e;
                PVert *v;
                int nverts = chart->nverts;
-               int i, j;
+               int i, j, k;
 
                /* create matrix with squared edge distances */
                float *dist_map = MEM_mallocN(sizeof(*dist_map)*nverts*nverts, 
"isomap_distance_map");
+               float *init_map = MEM_mallocN(sizeof(*dist_map)*nverts*nverts, 
"isomap_distance_map");
 
                param_isomap_new_solver(nverts);
 
@@ -3093,21 +3090,39 @@
                 * since this will make every inner product give infinity as 
well, initialize to some
                 * large number instead */
                for (i = 0; i < nverts; i++)
-                       for (j = 0; j < nverts; j++)
-                               *(dist_map + i*nverts + j) = (i == j)? 0 : 
-500.000;
+                       for (j = 0; j < nverts; j++) {
+                               *(dist_map + i*nverts + j) = (i == j)? 0 : 500;
+                               *(init_map + i*nverts + j) = 500000;
+                       }
 
-               /* for each edge, put the squared distance to the appropriate 
matrix positions
-                * for interior edges this will unfortunately be computed twice 
*/
+               /* for each edge, put the squared distance to the appropriate 
matrix positions */
                for (e = chart->edges; e; e = e->nextlink) {
+                       /* fill the upper right part of the matrix */
                        *(dist_map + e->vert->u.id*nverts + 
e->next->vert->u.id) =
                        *(dist_map + e->next->vert->u.id*nverts + 
e->vert->u.id) =
-                               -0.5*p_edge_length_squared(e);
+                               p_edge_length(e);
                }
-               if(!param_isomap_solve(dist_map)) {
+
+               /* now edge length has been computed. Now construct shortest 
paths
+                * and put them to lower left of matrix. */
+               for (i = 0; i < nverts; i++) {
+                       for (j = 0; j < nverts; j++) {
+                               for (k = 0; k < nverts; k++) {
+                                       float sum_dist;
+                                       sum_dist = *(dist_map + i*nverts + k) + 
*(dist_map + k*nverts + j);
+
+                                       *(init_map + i*nverts + j) = 
minf(*(init_map + i*nverts + j), sum_dist);
+                               }
+                       }
+               }
+
+
+               if(!param_isomap_solve(init_map)) {
                        param_warning("ISOMAP failure, matrix solution did not 
converge.\n");
 
                        param_isomap_delete_solver();
                        MEM_freeN(dist_map);
+                       MEM_freeN(init_map);
 
                        return P_FALSE;
                }
@@ -3119,6 +3134,7 @@
                /* cleanup */
                param_isomap_delete_solver();
                MEM_freeN(dist_map);
+               MEM_freeN(init_map);
 
                return P_TRUE;
        } else {

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer_isomap.cpp
===================================================================
--- 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer_isomap.cpp
    2012-08-03 15:23:17 UTC (rev 49536)
+++ 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer_isomap.cpp
    2012-08-03 17:08:45 UTC (rev 49537)
@@ -24,6 +24,7 @@
 #include "uvedit_parametrizer_isomap.h"
 #include <vector>
 #include <iostream>
+#include "BLI_math_base.h"
 
 using namespace std;
 using namespace Eigen;
@@ -63,31 +64,39 @@
        centering_transform.setConstant(size, size, 1.0/size);
        centering_transform = MatrixXf::Identity(size, size) - 
centering_transform;
 
-       /* in the paper there's also a -1/2 factor but we incorporate this in  
dist_matrix
-        * construction */
-       final = centering_transform * map_matrix * centering_transform;
+       final = -0.5 * centering_transform * map_matrix * map_matrix * 
centering_transform;
 
        eigensolver.compute(final);
 
-       //cout << map_matrix << endl;
+       cout << map_matrix << endl << endl;
+       cout << final << endl << endl;
 
        if (eigensolver.info() != Success) {
                cout << "isomap solver failure" << endl;
                return false;
        }
 
-       //cout << endl << "eigenvalues" << endl << eigensolver.eigenvalues() << 
endl;
-       //cout << endl << "UVs:" << endl;
+       cout << eigensolver.eigenvectors() << endl << endl;
 
+
+       cout << endl << "eigenvalues" << endl << eigensolver.eigenvalues() << 
endl;
+       cout << endl << "UVs:" << endl;
+
        return true;
 }
 
 void IsomapSolver::load_uv_solution(int index, float uv[2])
 {
-       uv[0] = eigensolver.eigenvectors()(index, size - 
1)*sqrt(eigensolver.eigenvalues()(size - 1));
-       uv[1] = eigensolver.eigenvectors()(index, size - 
2)*sqrt(eigensolver.eigenvalues()(size - 2));
+       float eigenvalue1 = eigensolver.eigenvalues()(size - 1);
+       float eigenvalue2 = eigensolver.eigenvalues()(size - 2);
 
-//     cout << uv[0] << ' ' << uv[1] << endl;
+       uv[0] = eigensolver.eigenvectors()(index, size - 
1)*signf(eigenvalue1)*sqrtf(fabs(eigenvalue1));
+       uv[1] = eigensolver.eigenvectors()(index, size - 
2)*signf(eigenvalue2)*sqrtf(fabs(eigenvalue2));
+
+       cout << index << ' ' << uv[0] << ' ' << uv[1] << endl;
+       cout << index << ' ' << eigenvalue1 << ' ' << eigenvalue2 << endl;
+       cout << index << ' ' << eigensolver.eigenvectors()(index, size - 1)
+            << ' ' << eigensolver.eigenvectors()(index, size - 2) << endl;
 }
 
 void param_isomap_new_solver(int nverts)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to