[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