forked from qianyizh/UrbanReconstruction
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDCContourer.h
110 lines (91 loc) · 3.18 KB
/
DCContourer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#pragma once
#include "MeshBoundary.h"
#include "DCGrid.h"
class CDCContourer
{
public:
CDCContourer(void);
~CDCContourer(void);
public:
friend class CHistGrid;
protected:
enum EdgeDirection {
ED_Along_X = 0,
ED_Along_Y = 1
};
protected:
CDCGrid * m_pGrid;
CMesh m_cMesh;
CMeshBoundary m_cBoundary;
bool m_bWallRectangle;
bool m_bAntiNonManifold;
public:
//////////////////////////////////////////////////////////////////////////
// entrance functions
//////////////////////////////////////////////////////////////////////////
void AssignDCGrid( CDCGrid * grid );
void Contouring( bool wall_rectangle, bool anti_non_manifold );
void SaveToObj( char filename[] ) {
m_cMesh.SaveToObj( filename );
}
protected:
//////////////////////////////////////////////////////////////////////////
// pre-processing functions
//////////////////////////////////////////////////////////////////////////
void PreProcessing( CDCGrid::NodeLocator & loc );
protected:
//////////////////////////////////////////////////////////////////////////
// create vertex functions
//////////////////////////////////////////////////////////////////////////
void CreateVertex( CDCGrid::NodeLocator & loc );
int AntiManifoldSplitDirection( CDCGrid::DCGridNode & node );
protected:
//////////////////////////////////////////////////////////////////////////
// create face functions
//////////////////////////////////////////////////////////////////////////
void CreateFacePerNode( CDCGrid::NodeLocator & loc );
void CreateFacePerEdge( CDCGrid::NodeLocator loc[ 2 ], EdgeDirection dir );
void CreateFacePerPoint( CDCGrid::NodeLocator loc[ 2 ][ 2 ] );
protected:
//////////////////////////////////////////////////////////////////////////
// small functions
//////////////////////////////////////////////////////////////////////////
CDCGrid::NodeLocator Root() { return CDCGrid::NodeLocator( m_pGrid->m_nLevel, 0, 0 ); }
int RootCluster_NodeCornerIndex( CDCGrid::NodeLocator & loc, int i, int j ) {
int ci = ( loc.i + i ) << loc.l;
int cj = ( loc.j + j ) << loc.l;
return m_pGrid->RootCluster_Index( ci, cj );
}
bool IsDegenrateTriangle( CMesh::MeshTriangle & f ) {
if ( f.i[0] == -1 || f.i[1] == -1 || f.i[2] == -1 || f.i[0] == f.i[1] || f.i[1] == f.i[2] || f.i[2] == f.i[0] )
return true;
else
return false;
}
bool IsDegenrateQuad( CMesh::MeshQuad & q ) {
if ( q.i[0] == -1 || q.i[1] == -1 || q.i[2] == -1 || q.i[3] == -1 )
return true;
else
return false;
}
void PushFaceWithoutGround( CMesh::MeshTriangle & f, int v[], int i, int j, int k ) {
double g = m_pGrid->m_pPointCloud->m_dbGroundZ;
f.i[0] = v[i];
f.i[1] = v[j];
f.i[2] = v[k];
if ( ! IsDegenrateTriangle( f ) ) {
if ( abs( m_cMesh.m_vecVertex[f.i[0]].v[2] - g ) > 1e-5 || abs( m_cMesh.m_vecVertex[f.i[1]].v[2] - g ) > 1e-5 || abs( m_cMesh.m_vecVertex[f.i[2]].v[2] - g ) > 1e-5 ) {
m_cMesh.m_vecTriangle.push_back( f );
}
}
}
void PushTriangleSafe( CMesh::MeshTriangle & f ) {
if ( ! IsDegenrateTriangle( f ) )
m_cMesh.m_vecTriangle.push_back( f );
}
void PushQuadSafe( CMesh::MeshQuad & q ) {
if ( ! IsDegenrateQuad( q ) )
m_cMesh.m_vecQuad.push_back( q );
}
static const double AntiManifoldShift;
};