kvs::Vec3 PrismCell::globalToLocal( const kvs::Vec3 point ) { const kvs::Vec3 X( point ); const float TinyValue = static_cast<float>( 1.e-6 ); const size_t MaxLoop = 100; kvs::Vec3 x0( 0.3f, 0.3f, 0.5f ); for ( size_t i = 0; i < MaxLoop; i++ ) { this->setLocalPoint( x0 ); const kvs::Vec3 X0( this->localToGlobal( x0 ) ); const kvs::Vec3 dX( X - X0 ); const kvs::Mat3 J( this->JacobiMatrix() ); const kvs::Vec3 dx = J.transposed().inverted() * dX; if ( dx.length() < TinyValue ) break; // Converged. x0 += dx; } return x0; }
/*===========================================================================*/ const kvs::Vec3 CellBase::globalToLocal( const kvs::Vec3& global ) const { const kvs::Vec3 X( global ); // Calculate the coordinate of 'global' in the local coordinate // by using Newton-Raphson method. const float TinyValue = static_cast<float>( 1.e-6 ); const size_t MaxLoop = 100; kvs::Vec3 x0( 0.25f, 0.25f, 0.25f ); // Initial point in local coordinate. for ( size_t i = 0; i < MaxLoop; i++ ) { const kvs::Vec3 X0( this->localToGlobal( x0 ) ); const kvs::Vec3 dX( X - X0 ); const kvs::Mat3 J( this->JacobiMatrix() ); const kvs::Vec3 dx = J.transposed().inverted() * dX; if ( dx.length() < TinyValue ) break; // Converged. x0 += dx; } return x0; }