std::vector< Projection::MappedPoint > ScaledProjection::cut_region_of_interest_( const ROISpecification& r ) const { std::vector< MappedPoint > rv; Bounds bb = get_region_of_interest_( r ); if ( r.guaranteed_row_width ) { quantity< camera::length, int > one =1 * camera::pixel, width = bb.width(Direction_X), lower = bb.get_lower_edge( Direction_X ), upper = bb.get_upper_edge( Direction_X ); if ( width < *r.guaranteed_row_width ) { lower -= one; width += one; if ( width < *r.guaranteed_row_width ) { upper += one; width += one; } } else if ( width > *r.guaranteed_row_width ) { upper -= one; width -= one; } assert( width == *r.guaranteed_row_width ); while ( upper >= size.x() ) { upper -= one; lower -= one; } while ( lower < 0 * camera::pixel ) { lower += one; upper += one; } if ( upper >= size.x() ) throw std::runtime_error("Image is too small for desired ROI"); bb.set_range( lower, upper, Direction_X ); } ImagePosition pos; typedef ImagePosition::Scalar Pixel; rv.reserve( bb.volume().value() ); SamplePosition sample; for ( Bounds::const_iterator i = bb.begin(); i != bb.end(); ++i ) { rv.push_back( MappedPoint( *i, pixel_in_sample_space(*i) ) ); } return rv; }