[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49537] branches/soc-2012-bratwurst/source /blender/editors/uvedit: Isomap Unwrapper

Antony Riakiotakis kalast at gmail.com
Fri Aug 3 19:08:45 CEST 2012


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)




More information about the Bf-blender-cvs mailing list