From 9f6f514d05fb9ed085fc930521180ae54f036975 Mon Sep 17 00:00:00 2001 From: James E McClure Date: Fri, 27 Jul 2018 16:23:39 -0400 Subject: [PATCH] start on decl data structure --- analysis/Minkowski.cpp | 2 - analysis/Minkowski.h | 1 - analysis/decl.cpp | 338 +++++++++++++++++++++++++++++++++++++++++ analysis/decl.h | 56 +++++++ tests/lbpm_uCT_pp.cpp | 6 +- 5 files changed, 397 insertions(+), 6 deletions(-) create mode 100644 analysis/decl.cpp create mode 100644 analysis/decl.h diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 7be0ec95..8b9a473d 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -221,7 +221,5 @@ void Minkowski::PrintAll() fprintf(LOGFILE,"%.5g %.5g %.5g %.5g\n",vol_n_global, An_global, Jn_global, euler_global); // minkowski measures fflush(LOGFILE); } - - } diff --git a/analysis/Minkowski.h b/analysis/Minkowski.h index f30d8357..d88747ab 100644 --- a/analysis/Minkowski.h +++ b/analysis/Minkowski.h @@ -82,6 +82,5 @@ public: void SortBlobs(); }; - #endif diff --git a/analysis/decl.cpp b/analysis/decl.cpp new file mode 100644 index 00000000..bda8dac0 --- /dev/null +++ b/analysis/decl.cpp @@ -0,0 +1,338 @@ +#include "analysis/pmmc.h" +#include "analysis/decl.h" + +/* +Double connected edge list (DECL) +*/ + +Vertex::Vertex(){ + count = 0; +} + +Vertex::~Vertex(){ + +} +void Vertex::add(Point P){ + vertex_data.push_back(P.x); + vertex_data.push_back(P.y); + vertex_data.push_back(P.z); + count++; +} + +void Vertex::assign(unsigned long int idx, Point P){ + vertex_data[3*idx] = P.x; + vertex_data[3*idx+1] = P.y; + vertex_data[3*idx+2] = P.z; +} + +Point Vertex::coords(unsigned long int idx){ + Point P; + P.x = vertex_data[3*idx]; + P.y = vertex_data[3*idx+1]; + P.z = vertex_data[3*idx+2]; + return P; +} + +unsigned long int Halfedge::v1(unsigned long int edge){ + return HalfEdge(0,edge); +} + +unsigned long int Halfedge::v2(unsigned long int edge){ + return HalfEdge(1,edge); +} + +unsigned long int Halfedge::face(unsigned long int edge){ + return HalfEdge(2,edge); +} + +unsigned long int Halfedge::twin(unsigned long int edge){ + return HalfEdge(3,edge); +} + +unsigned long int Halfedge::prev(unsigned long int edge){ + return HalfEdge(4,edge); +} + +unsigned long int Halfedge::next(unsigned long int edge){ + return HalfEdge(5,edge); +} + +Point DECL::TriNormal(int edge) +{ + Point P,Q; + double ux,uy,uz,vx,vy,vz; + double nx,ny,nz,len; + if (edge == -1) P.x = 1.0; P.y = 0.0; P.z = 0.0; // x cube face + else if (edge == -2) P.x = 0.0; P.y = 1.0; P.z = 0.0; // y cube face + else if (edge == -3) P.x = 0.0; P.y = 0.0; P.z = 1.0; // z cube face + else{ + // coordinates for first edge + P = vertex.coords(halfedge.v1(edge)); + Q = vertex.coords(halfedge.v2(edge)); + ux = Q.x-P.x; + uy = Q.y-P.y; + uz = Q.z-P.z; + // coordinates for second edge + P = vertex.coords(halfedge.v1(halfedge.next(edge))); + Q = vertex.coords(halfedge.v2(halfedge.next(edge))); + vx = Q.x-P.x; + vy = Q.y-P.y; + vz = Q.z-P.z; + // normal vector + nx = uy*vz - uz*vy; + ny = uz*vx - ux*vz; + nz = ux*vy - uy*vx; + len = sqrt(nx*nx+ny*ny+nz*nz); + P.x = nx/len; P.y = ny/len; P.z = nz/len; + } + return P; +} + +double DECL::EdgeAngle(int edge) +{ + double angle; + Point U,V; // triangle normal vectors + U = TriNormal(edge); + V = TriNormal(halfedge.twin(edge)); + angle = acos(U.x*V.x + U.y*V.y + U.z*V.z); + return angle; +} + +void Isosurface(DoubleArray &A, const double &v) +{ + Point P,Q; + Point PlaceHolder; + double temp; + Point C0,C1,C2,C3,C4,C5,C6,C7; + + int TriangleCount; + int NewVertexCount; + int CubeIndex; + int nTris, nVert; + + Point VertexList[12]; + Point NewVertexList[12]; + int LocalRemap[12]; + + DTMutableList cellvertices = DTMutableList(20); + IntArray Triangles = IntArray(3,20); + + // Values from array 'A' at the cube corners + double CubeValues[8]; + + int Nx = A.size(0); + int Ny = A.size(1); + int Nz = A.size(2); + + // Points corresponding to cube corners + C0.x = 0.0; C0.y = 0.0; C0.z = 0.0; + C1.x = 1.0; C1.y = 0.0; C1.z = 0.0; + C2.x = 1.0; C2.y = 1.0; C2.z = 0.0; + C3.x = 0.0; C3.y = 1.0; C3.z = 0.0; + C4.x = 0.0; C4.y = 0.0; C4.z = 1.0; + C5.x = 1.0; C5.y = 0.0; C5.z = 1.0; + C6.x = 1.0; C6.y = 1.0; C6.z = 1.0; + C7.x = 0.0; C7.y = 1.0; C7.z = 1.0; + + for (int k=1; kV2 + HalfEdge(0,idx_edge) = V1; // first vertex + HalfEdge(1,idx_edge) = V2; // second vertex + HalfEdge(2,idx_edge) = idx; // triangle + HalfEdge(3,idx_edge) = -1; // twin + HalfEdge(4,idx_edge) = idx_edge+2; // previous edge + HalfEdge(5,idx_edge) = idx_edge+1; // next edge + idx_edge++; + // second edge: V2->V3 + HalfEdge(0,idx_edge) = V2; // first vertex + HalfEdge(1,idx_edge) = V3; // second vertex + HalfEdge(2,idx_edge) = idx; // triangle + HalfEdge(3,idx_edge) = -1; // twin + HalfEdge(4,idx_edge) = idx_edge-1; // previous edge + HalfEdge(5,idx_edge) = idx_edge+1; // next edge + idx_edge++; + // third edge: V3->V1 + HalfEdge(0,idx_edge) = V3; // first vertex + HalfEdge(1,idx_edge) = V1; // second vertex + HalfEdge(2,idx_edge) = idx; // triangle + HalfEdge(3,idx_edge) = -1; // twin + HalfEdge(4,idx_edge) = idx_edge-1; // previous edge + HalfEdge(5,idx_edge) = idx_edge-2; // next edge + idx_edge++; + } + int EdgeCount=idx_edge; + for (int idx=0; idx + +/* +Doubly-connected edge list (DECL) +*/ + +// Vertex structure +class Vertex{ +public: + Vertex(); + ~Vertex(); + void add(Point P); + void assign(unsigned long int idx, Point P); + Point coords(unsigned long int idx); + unsigned long int IncidentEdge(); + unsigned long int count; +private: + std::vector vertex_data; +}; + +// Halfedge structure +// Face +class Halfedge{ +public: + Halfedge(); + ~Halfedge(); + + unsigned long int v1(unsigned long int edge); + unsigned long int v2(unsigned long int edge); + unsigned long int twin(unsigned long int edge); + unsigned long int face(unsigned long int edge); + unsigned long int next(unsigned long int edge); + unsigned long int prev(unsigned long int edge); + +private: + Array HalfEdge; +}; + +// DECL +class DECL{ +public: + DECL(); + ~DECL(); + + unsigned long int face(); + Vertex vertex; + Halfedge halfedge; + void AddCube(); // need a function to add new faces based on marching cubes surface + + double origin(int edge); + double EdgeAngle(int edge); + Point TriNormal(int edge); + +private: + unsigned long int *face_data; +}; diff --git a/tests/lbpm_uCT_pp.cpp b/tests/lbpm_uCT_pp.cpp index 34d4825d..391d0f95 100644 --- a/tests/lbpm_uCT_pp.cpp +++ b/tests/lbpm_uCT_pp.cpp @@ -105,7 +105,7 @@ int main(int argc, char **argv) //std::vector ratio = {4,4,4}; // need to set up databases for each level of the mesh std:vector multidomain_db; - + std::vector Nx(1,nx), Ny(1,ny), Nz(1,nz); while ( Nx.back()%ratio[0]==0 && Nx.back()>8 && Ny.back()%ratio[1]==0 && Ny.back()>8 && @@ -231,12 +231,12 @@ int main(int argc, char **argv) for (int i=1;i 0.f ){ auto tmp = LOCVOL[0](i,j,k); -/* if ((tmp-background)*(tmp-target) > 0){ + /* if ((tmp-background)*(tmp-target) > 0){ // direction to background / target is the same if (fabs(tmp-target) > fabs(tmp-background)) tmp=background; // tmp closer to background else tmp=target; // tmp closer to target } - */ + */ if ( tmp > THRESHOLD ) { mean_plus += tmp; count_plus++;