23 template<
typename t_Identifier >
26 t_Identifier
const Inside( t_Identifier
const& identifierDefault,
Vector< double, 3 > const& position )
const;
30 void PushBall( t_Identifier
const& identifier,
Vector< double, 3 > const& center,
double const radius,
double const power );
37 t_Identifier identifier;
54 static inline Comparison
const IsInside( Ball
const& ball,
Vector< double, 3 > const& position,
double const side );
57 std::vector< Ball > m_balls;
68 template<
typename t_Identifier >
71 t_Identifier result = identifierDefault;
73 typename std::vector< Ball >::const_iterator ii = m_balls.begin();
74 typename std::vector< Ball >::const_iterator iiEnd = m_balls.end();
75 for ( ; ii != iiEnd; ++ii )
76 if ( IsInside( *ii, position ) )
77 result = ii->identifier;
83 template<
typename t_Identifier >
87 {
typename std::vector< Ball >::const_iterator ii = m_balls.begin();
88 typename std::vector< Ball >::const_iterator iiEnd = m_balls.end();
89 for ( ; ( ! split ) && ( ii != iiEnd ); ++ii )
90 if ( IsInside( *ii, position, side ) == COMPARISON_BOTH )
97 template<
typename t_Identifier >
101 ball.identifier = identifier;
102 ball.center = center;
103 ball.radius = radius;
104 ball.radiusPower = std::pow( radius, power );
107 m_balls.push_back( ball );
111 template<
typename t_Identifier >
117 if ( ( delta[ 0 ] < ball.radius ) && ( delta[ 1 ] < ball.radius ) && ( delta[ 2 ] < ball.radius ) ) {
119 double const distance = std::pow( delta[ 0 ], ball.power ) + std::pow( delta[ 1 ], ball.power ) + std::pow( delta[ 2 ], ball.power );
120 result = ( distance < ball.radiusPower );
127 template<
typename t_Identifier >
133 if ( maximumDelta[ 0 ] < minimumDelta[ 0 ] )
134 std::swap( maximumDelta[ 0 ], minimumDelta[ 0 ] );
135 if ( ( ball.center[ 0 ] >= position[ 0 ] ) && ( ball.center[ 0 ] <= position[ 0 ] + side ) )
136 minimumDelta[ 0 ] = 0;
138 if ( maximumDelta[ 1 ] < minimumDelta[ 1 ] )
139 std::swap( maximumDelta[ 1 ], minimumDelta[ 1 ] );
140 if ( ( ball.center[ 1 ] >= position[ 1 ] ) && ( ball.center[ 1 ] <= position[ 1 ] + side ) )
141 minimumDelta[ 1 ] = 0;
143 if ( maximumDelta[ 2 ] < minimumDelta[ 2 ] )
144 std::swap( maximumDelta[ 2 ], minimumDelta[ 2 ] );
145 if ( ( ball.center[ 2 ] >= position[ 2 ] ) && ( ball.center[ 2 ] <= position[ 2 ] + side ) )
146 minimumDelta[ 2 ] = 0;
148 bool maximumInside =
false;
149 if ( ( maximumDelta[ 0 ] < ball.radius ) && ( maximumDelta[ 1 ] < ball.radius ) && ( maximumDelta[ 2 ] < ball.radius ) ) {
151 double const distance = std::pow( maximumDelta[ 0 ], ball.power ) + std::pow( maximumDelta[ 1 ], ball.power ) + std::pow( maximumDelta[ 2 ], ball.power );
152 maximumInside = ( distance < ball.radiusPower );
155 bool minimumInside = maximumInside;
156 if ( ( ! minimumInside ) && ( minimumDelta[ 0 ] < ball.radius ) && ( minimumDelta[ 1 ] < ball.radius ) && ( minimumDelta[ 2 ] < ball.radius ) ) {
158 double const distance = std::pow( minimumDelta[ 0 ], ball.power ) + std::pow( minimumDelta[ 1 ], ball.power ) + std::pow( minimumDelta[ 2 ], ball.power );
159 minimumInside = ( distance < ball.radiusPower );
162 Comparison result = COMPARISON_BOTH;
164 result = COMPARISON_INSIDE;
165 else if ( ! minimumInside )
166 result = COMPARISON_OUTSIDE;