[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31363] branches/soc-2010-rohith291991/ intern/comiso/intern/uv.cpp: More progress on mesh extraction.

Rohith B V rohith291991 at gmail.com
Mon Aug 16 06:39:47 CEST 2010


Revision: 31363
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31363
Author:   rohith291991
Date:     2010-08-16 06:39:46 +0200 (Mon, 16 Aug 2010)

Log Message:
-----------
More progress on mesh extraction.

Modified Paths:
--------------
    branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp

Modified: branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp
===================================================================
--- branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp	2010-08-16 03:04:17 UTC (rev 31362)
+++ branches/soc-2010-rohith291991/intern/comiso/intern/uv.cpp	2010-08-16 04:39:46 UTC (rev 31363)
@@ -6,8 +6,46 @@
 #include "MEM_guardedalloc.h"
 #include "Geometry"
 #include <math.h>
+#define CV_REMOVED 1
 
 
+int sameSide(Vector3d p1, Vector3d p2, Vector3d a, Vector3d b)
+	{
+    Vector3d cp1;
+    Vector3d cp2;
+	Vector3d p,q,r;
+	p=b-a;
+	q=p1-a;
+	r=p2-a;
+	
+	cp1=p.cross(q);
+	cp2=p.cross(r);
+	if (cp1.dot(cp2) >= 0)
+		return 1;
+    else 
+		return 0;
+	}
+
+int pointInTriangle(Vector3d p, Vector3d a, Vector3d b, Vector3d c)
+	{
+	
+    if (sameSide(p,a,b,c) && sameSide(p,b,a,c) && sameSide(p,c,a,b))
+		{
+			//std::cout<<"point: "<<p<<"a: "<<a<<"b: "<<b<<"c: "<<c<<"\n\n";
+		return 1;
+	
+	
+		}
+	else
+		{
+		//printf("haha %lf %lf %lf %lf\n",p,a,b,c);
+		
+		
+		return 0;
+		}
+	}
+
+
 void compute_rotated_uv_vars(//rotates variable indices
 							 int var, int rot, //u is 2*var, v is 2*var+1
 							 int &uvar, int &vvar, //rotated variable indices
@@ -389,7 +427,7 @@
 
 		}
 	h/=totedge;
-h*=0.15;
+//h*=0.3;
 	// std::cout<<h<<"\n";
 	double hh = h * h ;
 
@@ -897,7 +935,7 @@
 		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
@@ -941,23 +979,23 @@
 				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; 
-		vertices.resize(uRange);
-		for(int j=0;j<uRange;j++)
+		vertices.resize(uRange+2);
+		for(int j=0;j<uRange+2;j++)
 			{
-			vertices[j].resize(vRange);
+			vertices[j].resize(vRange+2);
 			
 			}
 
 	int check=0;
-		for(int j=uStart;j<uStart+uRange;j++)
+		for(int j=uStart-1;j<uStart+uRange+1;j++)
 	{
-			for(int k=vStart;k<vStart+vRange;k++)
+			for(int k=vStart-1;k<vStart+vRange+1;k++)
 			
 			
 				{
@@ -969,10 +1007,11 @@
 				z=A[2]*j+B[2]*k+C[2];	
 
 
-				check=1;
+				check++;
 				//Add point to CMesh
+
+					
 				
-				
 				if(result->verts==NULL)
 					{result->verts=(CVert*)MEM_mallocN(sizeof(CVert)*(vc+1), "vertices");}
 				else
@@ -985,27 +1024,34 @@
 				result->verts[vc].co[2]=z;
 				result->verts[vc].neighbors=NULL;
 				result->verts[vc].edges=NULL;
+				result->verts[vc].flag=NULL;
 				result->verts[vc].numNeighbors=0;
 
 				result->verts[vc].index=vc;
 
 			
-				vertices[j-uStart][k-vStart]=vc;
-				
+				vertices[j-uStart+1][k-vStart+1]=vc;
+				      
 				vc++;
 			
 								
 				}
 			}
+
 	
+	
+		
+
+
+
 		//printf("CHECK: %d\n",check);
-        if(check==0)
+       /* if(check==0)
 			{
 			printf("%lf %lf %lf %lf %lf %lf %d %d %d %d\n\n",u[0],v[0],u[1],v[1],u[2],v[2],uStart,uRange,vStart,vRange);
-			}
+			}*/
 	//Add relevant edge connectivities to CMesh
-		int m1=(uRange-1)*vRange;
-		int m2=(vRange-1)*uRange;
+	int m1=(uRange+1)*(vRange+2);
+		int m2=(vRange+1)*(uRange+2);
 		if(m1<0)
 			m1=0;
 		if(m2<0)
@@ -1020,10 +1066,10 @@
 					result->edges=(CEdge*)MEM_reallocN(result->edges,(sizeof(CEdge)*(ec+m1+m2)));
 
 		//printf("test4\n");
-		for(int j=0;j<uRange;j++)
+		for(int j=0;j<uRange+2;j++)
 			{
 			
-			for(int k=0;k<vRange-1;k++)
+			for(int k=0;k<vRange+1;k++)
 				{
 				
 				//printf("test5\n");
@@ -1031,6 +1077,10 @@
 				v1=vertices[j][k];
 				v2=vertices[j][k+1];
 
+					
+				
+
+
 				result->edges[ec].v[0]=v1;
 				result->edges[ec].v[1]=v2;
 				ec++;
@@ -1055,15 +1105,16 @@
 			
 			}
 
-			for(int k=0;k<vRange;k++)
+			for(int k=0;k<vRange+2;k++)
 				{
-		for(int j=0;j<uRange-1;j++)
+		for(int j=0;j<uRange+1;j++)
 			{
 			
 				int v1,v2;
 				v1=vertices[j][k];
 				v2=vertices[j+1][k];
 
+				 //printf("%lf %lf %lf\n",result->verts[v1].co[0],result->verts[v1].co[1],result->verts[v1].co[2]);
 				result->edges[ec].v[0]=v1;
 				result->edges[ec].v[1]=v2;
 				ec++;
@@ -1088,9 +1139,137 @@
 			}
 				//for loop
 				// Include points where edges meet triangle border
+					int cv=0;
+for(int j=0;j<uRange+2;j++)
+	{
+			
+			for(int k=0;k<vRange+2;k++)
+				{
+				
+				int v1=vertices[j][k];
+				double x,y,z;
 
+				x=result->verts[v1].co[0];
+				y=result->verts[v1].co[1];
+				z=result->verts[v1].co[2];
+                Vector3d g;
+				g[0]=x;
+				g[1]=y;
+				g[2]=z;
+				Vector3d a,b,c;
+				for(int t=0;t<3;t++)
+					{
+					a[t]=p[0][t];
+					b[t]=p[1][t];
+					c[t]=p[2][t];
+					}
+
+				 //printf("%lf %lf %lf\n",x,y,z);
+
+				//check if point is outside triangle
+		
+		
+				if (!pointInTriangle(g,a,b,c))
+					{
+					result->verts[v1].flag|=CV_REMOVED;
+					
+					//clip point or delete it depending on whether the edges emanating from it intersect the triangle or not
+					int numNeighbors=result->verts[vc].numNeighbors;
+
+				
+					for(int t=0;t<numNeighbors;t++)
+						{
+						int index=result->verts[v1].neighbors[t];
+						g[0]=result->verts[index].co[0];
+						g[1]=result->verts[index].co[1];
+						g[2]=result->verts[index].co[2];
+
+						if(pointInTriangle(g,a,b,c))
+							{
+						
+							
+
+							double a1,b1,c1,a2,b2,c2,t1,t2;
+							for(int s=0;s<3;s++)
+								{
+								double v2x,v1x,v2y,v1y,v1z,v2z;
+								v2x=p[s][0];
+								v1x=p[(2+s)%3][0];
+								v2y=p[s][1];
+								v1y=p[(2+s)%3][1];
+								v2z=p[s][2];
+								v1z=p[(2+s)%3][2];
+									
+
+								a1=v2x-v1x;
+							b1=x-g[0];
+							c1=v2x-g[0];
+							//g[0] == x4
+										
+							a2=v2y-v1y;
+							b2=y-g[1];
+							c2=v2y-g[1];
+
+							t1=(b1*c2-b2*c1)/(a1*b2-a2*b1);
+							t2=(c1*a2-c2*a1)/(a1*b2-a2*b1);
+
+							double nx,ny,nz;
+							nx=t2*(g[0]-x)+g[0];
+							ny=t2*(g[1]-y)+g[1];
+							nz=t2*(g[2]-z)+g[2];
+							double d1,d1sum,d2,d2sum;
+							d1=sqrt((g[0]-x)*(g[0]-x)+(g[1]-y)*(g[1]-y)+(g[2]-z)*(g[2]-z));
+							d1sum=sqrt((g[0]-nx)*(g[0]-nx)+(g[1]-ny)*(g[1]-ny)+(g[2]-nz)*(g[2]-nz))+sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y)+(nz-z)*(nz-z));
+							d2=sqrt((v2x-v1x)*(v2x-v1x)+(v2y-v1y)*(v2y-v1y)+(v2z-v1z)*(v2z-v1z));
+							d2sum=sqrt((v2x-nx)*(v2x-nx)+(v2y-ny)*(v2y-ny)+(v2z-nz)*(v2z-nz))+sqrt((nx-v1x)*(nx-v1x)+(ny-v1y)*(ny-v1y)+(nz-v1z)*(nz-v1z));
+
+						//	printf("testing %lf %lf\n",fabs(d1-d1sum),fabs(d2-d2sum));
+
+							if((fabs(d1-d1sum)<1e-6)&&(fabs(d2-d2sum)<1e-6))
+								{
+							result->verts=(CVert*)MEM_reallocN(result->verts,(sizeof(CVert)*(vc+1)));
+
+							if(result->edges[result->verts[v1].edges[t]].v[0]==v1)
+								result->edges[result->verts[v1].edges[t]].v[0]=vc;
+							else
+								result->edges[result->verts[v1].edges[t]].v[1]=vc;
+
+							result->verts[vc].co[0]=nx;
+							result->verts[vc].co[1]=ny;
+							result->verts[vc].co[2]=nz;
+							g[0]=nx;
+							g[1]=ny;
+							g[2]=nz;
+							vc++;
+							
+							printf("testing %d\n",pointInTriangle(g,a,b,c));
+								break;
+								}
+						    
+								}
+							
+							}
+					
+
+
+					}
+					//result->verts[vc].co[0]=0;
+					//		result->verts[vc].co[1]=0;
+					//		result->verts[vc].co[2]=0;
+					//printf("tada\n");
+					
+					}
+
+				
+
+					
+				}
+	}
+	
 			}
-		
+
+
+			
 			result->numVerts=vc;
 			result->numEdges=ec;
 					





More information about the Bf-blender-cvs mailing list