[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