[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