I start a new issue for asking a new question.
In "SphericalGeometry.inl", line 582, The code is like this:
////////////////////////////////
// SphericalGeometry::Polygon //
////////////////////////////////
template< class Real > template< class VertexData >
void SphericalGeometry::Polygon< Real >::_split( Point3D< Real > pNormal , Real pOffset , int pIdx , Polygon &back , Polygon &front , std::vector< Point3D< Real > >& vertices , std::vector< PlanarSources > &pSources , std::vector< VertexData >* vData , std::unordered_map< unsigned long long , int >& vMap ) const
{
std::vector< Real > values( _vertices.size() );
bool frontSet = false , backSet = false;
front.sourceID = back.sourceID = sourceID;
// Evaluate the plane's function at the vertices and mark if front/back vertices have been found
for( int i=0 ; i<size() ; i++ )
{
values[i] = Point3D< Real >::Dot( vertices[ _vertices[i] ] , pNormal ) - pOffset;
// Don't split on edges near the pole
if( pIdx>=0 && pSources[ _vertices[i] ].full() ) values[i] = 0;
backSet |= ( values[i]<0 ) , frontSet |= ( values[i]>0 );
}
// If no vertices are in front or no vertices are behind, life is easy
if( !frontSet ){ back._vertices = _vertices ; back.mass = mass ; return; }
if( !backSet ){ front._vertices = _vertices ; front.mass = mass ; return; }
enum
{
PLANE_STATE_BACK ,
PLANE_STATE_FRONT ,
PLANE_STATE_BOUNDARY
};
auto State = []( Real value )
{
if ( value<0 ) return PLANE_STATE_BACK;
else if( value>0 ) return PLANE_STATE_FRONT;
else return PLANE_STATE_BOUNDARY;
};
struct _VertexIndex
{
int idx , state;
_VertexIndex( int i , int s ) : idx(i) , state(s) {}
};
// Compute the indices of the refined polygons and their associated states
std::vector< _VertexIndex > vertexIndices;
for( int i0=0 ; i0<size() ; i0++ )
{
int i1 = (i0+1)%size();
vertexIndices.push_back( _VertexIndex( _vertices[i0] , State( values[i0] ) ) );
// If the edge crosses the plane, we need to create a new vertex
if( values[i0]*values[i1]<0 )
{
int vIdx;
unsigned long long key = Key( _vertices[i0] , _vertices[i1] );
if( vMap.find( key )==vMap.end() )
{
Real t = values[i0] / ( values[i0] - values[i1] );
Point3D< Real > v = vertices[ _vertices[i1] ]*t + vertices[ _vertices[i0] ]*(Real)(1.-t);
v /= (Real)Length( v );
vIdx = (int)vertices.size();
vertices.push_back( v );
if( vData ) vData->push_back( (*vData)[ _vertices[i1] ]*t + (*vData)[ _vertices[i0] ]*(Real)(1.-t) );
{
PlanarSources ps;
ps.addIndex( PlanarSources::SharedIndex( pSources[ _vertices[i0] ] , pSources[ _vertices[i1] ] ) );
ps.addIndex( pIdx );
pSources.push_back( ps );
}
vMap[key] = vIdx;
}
else vIdx = vMap[key];
vertexIndices.push_back( _VertexIndex( vIdx , PLANE_STATE_BOUNDARY ) );
}
}
for( int i=0 ; i<vertexIndices.size() ; i++ )
{
if( vertexIndices[i].state!=PLANE_STATE_BACK ) front._vertices.push_back( vertexIndices[i].idx );
if( vertexIndices[i].state!=PLANE_STATE_FRONT ) back._vertices.push_back( vertexIndices[i].idx );
}
Real a0 = back.area( vertices ) , a1 = front.area( vertices );
Real a = a0 + a1;
if( a ) a0 /= a , a1 /= a;
else a0 = a1 = (Real)1./2;
back.mass = mass * a0 , front.mass = mass * a1;
}
I believed this function is used to calculate the vertices when the triangle mesh intersects the grid.
But I don't get the meaning of the "sourceID", and what's the states of "front, back, or boundary"? Does it mean the direction of the plane? if it is, the boundary means the vertice is on the boundary of the plane?
I start a new issue for asking a new question.
In "SphericalGeometry.inl", line 582, The code is like this:
I believed this function is used to calculate the vertices when the triangle mesh intersects the grid.
But I don't get the meaning of the "sourceID", and what's the states of "front, back, or boundary"? Does it mean the direction of the plane? if it is, the boundary means the vertice is on the boundary of the plane?