[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31176] branches/soc-2010-rohith291991/ intern/comiso/intern: Accurate direction field generation.
Rohith B V
rohith291991 at gmail.com
Sun Aug 8 21:34:12 CEST 2010
Revision: 31176
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31176
Author: rohith291991
Date: 2010-08-08 21:34:12 +0200 (Sun, 08 Aug 2010)
Log Message:
-----------
Accurate direction field generation. Fixed the kappa issues. Some bugs to be fixed.
Modified Paths:
--------------
branches/soc-2010-rohith291991/intern/comiso/intern/CMesh.cpp
branches/soc-2010-rohith291991/intern/comiso/intern/MISolver.cpp
branches/soc-2010-rohith291991/intern/comiso/intern/comiso.cpp
branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp
Modified: branches/soc-2010-rohith291991/intern/comiso/intern/CMesh.cpp
===================================================================
--- branches/soc-2010-rohith291991/intern/comiso/intern/CMesh.cpp 2010-08-08 18:45:09 UTC (rev 31175)
+++ branches/soc-2010-rohith291991/intern/comiso/intern/CMesh.cpp 2010-08-08 19:34:12 UTC (rev 31176)
@@ -1,6 +1,7 @@
#include "../extern/CMesh.h"
#include <vector>
#include <math.h>
+#include <float.h>
#include "MEM_guardedalloc.h"
#include "normal_cycle.h"
#include "Geometry"
@@ -179,6 +180,7 @@
solver.mdata=(MValue *)MEM_mallocN(sizeof(MValue)*solver.mnnz, "mdata");
int t=0;
+ int count=0;
//TODO makes constraints on face theta's
//call generateConstraints(CMesh* mesh)
@@ -238,11 +240,11 @@
normal[0]=e[1].cross(e[0]);
normal[0].normalize() ;
- v1=mesh->faces[j].v[0];
- v2=mesh->faces[j].v[1];
+ v1=mesh->faces[mesh->faces[i].neighbors[j]].v[0];
+ v2=mesh->faces[mesh->faces[i].neighbors[j]].v[1];
- v5=mesh->faces[j].v[2];
- v6=mesh->faces[j].v[0];
+ v5=mesh->faces[mesh->faces[i].neighbors[j]].v[2];
+ v6=mesh->faces[mesh->faces[i].neighbors[j]].v[0];
e[1][0]=mesh->verts[v2].co[0]-mesh->verts[v1].co[0];
e[1][1]=mesh->verts[v2].co[1]-mesh->verts[v1].co[1];
@@ -255,27 +257,84 @@
normal[1]=e[1].cross(e[0]);
normal[1].normalize() ;
- angle=acos(normal[0].dot(normal[1]));
+ // printf("dot1 %lf\ndot2 %lf\n",normal[0].dot(edge),normal[1].dot(edge));
+
+ double dot=normal[0].dot(normal[1]);
+ if(dot>=1)
+ dot=1;
+ else if(dot<=-1)
+ dot=-1;
+ angle=acos(dot);
+ int ev[2];
+
+
+ for(int k=0;k<3;k++)
+ {
+ if(mesh->faces[i].v[k]==v3)
+ ev[0]=k;
+ else if(mesh->faces[i].v[k]==v4)
+ ev[1]=k;
+
+ }
+
+ int signe=1;
+ if((ev[0]+2)%3!=ev[1])
+ {
+ signe=-1;
+ }
+
+
+ edge=signe*edge;
+ //edge*=-1;
+
AngleAxis<double> aa(angle, edge);
+ int sign=1;
e[1]=Vector3d(aa*e[1]);
+ Vector3d normalcheck=normal[1];
+ normalcheck=Vector3d(aa*normalcheck);
+ normalcheck.normalize();
+ //printf("original: %lf %lf %lf\nreference: %lf %lf %lf\nnew: %lf %lf %lf\nedge: %lf %lf %lf\n%lf\n",normal[1][0],normal[1][1],normal[1][2],normal[0][0],normal[0][1],normal[0][2],normalcheck[0],normalcheck[1],normalcheck[2]
+ //,edge[0],edge[1],edge[2],angle);
+ //printf("dot3 %lf\n\n",normalcheck.dot(edge));
+
e[1].normalize();
e[2].normalize();
- angle=acos(e[2].dot(e[1]));
- int sign=1;
- if(normal[0].dot(e[1].cross(e[2]))<0)
+ dot=e[2].dot(e[1]);
+ if(dot>=1)
+ dot=1;
+ else if(dot<=-1)
+ dot=-1;
+
+ angle=acos(dot);
+
+ if(normal[0].dot(e[2].cross(e[1]))<0)
sign=-1;
angle=angle*sign;
+ int sign2=1;
+
+ totkappa+= angle;
+
+ if(mesh->edges[mesh->faces[i].edges[j]].faces[0]!=i)
+ {count++;
+ sign2=1;
+ }
+
+ angle=angle*sign2;
-
+
+ //printf("angle: %lf\n",angle);
//TODO check for correctness
- mesh->edges[mesh->faces[i].edges[j]].kappa=1;//acos((x1*x3+y1*y3+z1*z3)/sqrt((x1*x1+y1*y1+z1*z1)*(x3*x3+y3*y3+z3*z3)));
- totkappa+= mesh->edges[mesh->faces[i].edges[j]].kappa;
+ printf("old kappa%lf\n",mesh->edges[mesh->faces[i].edges[j]].kappa);
+ mesh->edges[mesh->faces[i].edges[j]].kappa=angle;//acos((x1*x3+y1*y3+z1*z3)/sqrt((x1*x1+y1*y1+z1*z1)*(x3*x3+y3*y3+z3*z3)));
+
+ printf("new kappa%lf\n",mesh->edges[mesh->faces[i].edges[j]].kappa);
+
solver.mdata[t].i=i;
solver.mdata[t].j=totface+mesh->faces[i].edges[j];
@@ -294,9 +353,11 @@
solver.mdata[t].i=i;
solver.mdata[t].j=solver.n-1;
solver.mdata[t].value=-2*totkappa;
+
t++;
}
+ printf("%d %d\n",totedge*2,count);
//Setup edges part of A matrix
for (int i=0;i<totedge;i++)
@@ -435,7 +496,6 @@
double totarea=0;
double totenergy=0;
- Comiso solver;
int totedge,totface,totvert;
totvert=mesh->numVerts;
totedge=mesh->numEdges;
@@ -863,7 +923,6 @@
eind=eIndex;
nind=nIndex;
-
}
}
if(esum==1)
Modified: branches/soc-2010-rohith291991/intern/comiso/intern/MISolver.cpp
===================================================================
--- branches/soc-2010-rohith291991/intern/comiso/intern/MISolver.cpp 2010-08-08 18:45:09 UTC (rev 31175)
+++ branches/soc-2010-rohith291991/intern/comiso/intern/MISolver.cpp 2010-08-08 19:34:12 UTC (rev 31176)
@@ -64,6 +64,8 @@
for(i=0;i<_b.size();i++)
{
x[i]=_b[i];
+
+
}
int dimn=_A.rows();
@@ -76,6 +78,8 @@
for(i=0;i<_b.size();i++)
{
_x[i]=x[i];
+ // printf("thing %lf\n",x[i]);
+
}
return true;
Modified: branches/soc-2010-rohith291991/intern/comiso/intern/comiso.cpp
===================================================================
--- branches/soc-2010-rohith291991/intern/comiso/intern/comiso.cpp 2010-08-08 18:45:09 UTC (rev 31175)
+++ branches/soc-2010-rohith291991/intern/comiso/intern/comiso.cpp 2010-08-08 19:34:12 UTC (rev 31176)
@@ -88,8 +88,8 @@
extract_Axb( B, A, b);
//std::cout<<A<<"\n\n";
-
- /*std::cout<<"[ ";
+/*
+ std::cout<<"[ ";
for(int l=0;l<b.size()-1;l++)
{
std::cout<<b[l]<<", ";
@@ -122,13 +122,13 @@
miso.solve( A, x, b, ids_to_round);
cs.restore_eliminated_vars( C,x, ids_to_elim, new_idx);
-
+/*
std::cout<<"[ ";
for(int l=0;l<x.size()-1;l++)
{
std::cout<<x[l]<<", ";
}
- std::cout<<x[x.size()-1]<<" ]";
+ std::cout<<x[x.size()-1]<<" ]";*/
result.n=x.size();
result.data=(double *)MEM_mallocN(sizeof(double)*result.n, "data");
@@ -166,8 +166,7 @@
B(i,j) = _data.mdata[k].value;
}
-
- C.resize(_data.c,_data.n);
+ C.resize(_data.c,_data.n);
C.setZero();
//std::cout<<B<<"\n\n";
Modified: branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp
===================================================================
--- branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp 2010-08-08 18:45:09 UTC (rev 31175)
+++ branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp 2010-08-08 19:34:12 UTC (rev 31176)
@@ -702,13 +702,13 @@
MISolver miso;
miso.solve( A, x, b, ids_to_round);
cs.restore_eliminated_vars( C,x, ids_to_elim, new_idx);
-
+/*
std::cout<<"x: \n\n";
for(int i=0;i<x.size();i++)
{
std::cout<<x[i]<<"\n";
- }
+ }*/
for(int i=0;i<totedge;i++){
HEdge *hi=&hm->edges[i];
@@ -860,6 +860,91 @@
}
+ Vector3d e[3] ;
+ for(int j=0; j<3; ++j)
+ {
+ e[j][0] = p[j][0]-p[(j+2)%3][0];
+ e[j][1] = p[j][1]-p[(j+2)%3][1];
+ e[j][2] = p[j][2]-p[(j+2)%3][2];
+
+ };
+
+ Vector3d normal = e[1].cross(e[0]);
+ normal.normalize() ;
+ Vector3d ut ;
+ // Vector3d x;
+
+ ut[0]=hm->verts[hm->faces[i].v[1]].co[0]-hm->verts[hm->faces[i].v[0]].co[0];
+ ut[1]=hm->verts[hm->faces[i].v[1]].co[1]-hm->verts[hm->faces[i].v[0]].co[1];
+ ut[2]=hm->verts[hm->faces[i].v[1]].co[2]-hm->verts[hm->faces[i].v[0]].co[2];
+
+ AngleAxis<double> aa(hm->faces[i].theta, normal);
+
+ ut=Vector3d(aa*ut);
+ ut.normalize();
+
+ /*hm->faces[l].ut[0]=ut[0];
+ hm->faces[l].ut[1]=ut[1];
+ hm->faces[l].ut[2]=ut[2];*/
+
+ Vector3d vt = normal.cross(ut);
+ vt.normalize();
+ /*hm->faces[l].vt[0]=vt[0];
+ hm->faces[l].vt[1]=vt[1];
+ hm->faces[l].vt[2]=vt[2];*/
+
+ double x,y,z;
+
+ x=(p[0][0]+p[1][0]+p[2][0])/3;
+ y=(p[0][1]+p[1][1]+p[2][1])/3;
+ z=(p[0][2]+p[1][2]+p[2][2])/3;
+
+ if(result->verts==NULL)
+ {result->verts=(CVert*)MEM_mallocN(sizeof(CVert)*(vc+1), "vertices");}
+ else
+ {
+
+ result->verts=(CVert*)MEM_reallocN(result->verts,(sizeof(CVert)*(vc+1)));}
+
+ result->verts[vc].co[0]=x+ut[0]*0.04;
+ result->verts[vc].co[1]=y+ut[1]*0.04;
+ result->verts[vc].co[2]=z+ut[2]*0.04;
+ result->verts[vc].neighbors=NULL;
+ result->verts[vc].edges=NULL;
+ result->verts[vc].numNeighbors=0;
+
+ result->verts[vc].index=vc;
+
+ vc++;
+
+ if(result->verts==NULL)
+ {result->verts=(CVert*)MEM_mallocN(sizeof(CVert)*(vc+1), "vertices");}
+ else
+ {
+
+ result->verts=(CVert*)MEM_reallocN(result->verts,(sizeof(CVert)*(vc+1)));}
+ result->verts[vc].co[0]=x-ut[0]*0.04;
+ result->verts[vc].co[1]=y-ut[1]*0.04;
+ result->verts[vc].co[2]=z-ut[2]*0.04;
+ result->verts[vc].neighbors=NULL;
+ result->verts[vc].edges=NULL;
+ result->verts[vc].numNeighbors=0;
+
+ result->verts[vc].index=vc;
+
+ vc++;
+
+ if(result->edges==NULL)
+ result->edges=(CEdge*)MEM_mallocN(sizeof(CEdge)*(ec+1), "edges");
+ else
+ result->edges=(CEdge*)MEM_reallocN(result->edges,(sizeof(CEdge)*(ec+1)));
+
+ result->edges[ec].v[0]=vc-2;
+ result->edges[ec].v[1]=vc-1;
+ ec++;
+
+ /*
+
//Take care of all internal points
std::vector< std::vector <int> > vertices;
@@ -1000,7 +1085,7 @@
}
//for loop
// Include points where edges meet triangle border
-
+*/
}
result->numVerts=vc;
More information about the Bf-blender-cvs
mailing list