예제 #1
0
void EdgelDetector::findChainOfLines( LineSegment &startSegment, bool atStartPoint, std::vector<LineSegment> &linesegments, std::vector<LineSegment> &chain, int& length) {
	const Vector2f startPoint = atStartPoint ? startSegment.start.position : startSegment.end.position;
	
	for( int i=0; i<linesegments.size(); i++ ) {
		// lijnen mogen niet parallel liggen
		if( startSegment.isOrientationCompatible( linesegments[i] ) ) {
			continue;
		}
		// eind en startpunt moeten dicht bij elkaar liggen...
		if( ( startPoint - ( atStartPoint ? linesegments[i].end.position :  linesegments[i].start.position ) ).get_squared_length() > 16.0f ) {
			continue;
		}
		// en de orientatie moet natuurlijk goed zijn, dus tegen de klok mee rond een zwart vierkantje
		if( ( atStartPoint &&
		      ( startSegment.slope.x * linesegments[i].slope.y - startSegment.slope.y * linesegments[i].slope.x <= 0 ) ) ||
		    ( !atStartPoint &&
			  ( startSegment.slope.x * linesegments[i].slope.y - startSegment.slope.y * linesegments[i].slope.x >= 0 ) ) ) {
				continue;
		}
		   
		// het lijkt te mooi om waar te zijn, maar we hebben er 1 gevonden :)
		// haal dus dit segment er uit en kijk of de ketting langer te maken is...
		
		length ++ ;
		
		LineSegment chainSegment = linesegments[i];
		linesegments[i] = linesegments[ linesegments.size() - 1 ];
		linesegments.resize( linesegments.size() - 1 );
		
		if( length == 4 ) {
			chain.push_back( chainSegment );
			return;
		}
		
		if( !atStartPoint ) {
			chain.push_back( chainSegment );
		}
		// recursie!
		findChainOfLines( chainSegment, atStartPoint, linesegments, chain, length);
		if( atStartPoint ) {
			chain.push_back( chainSegment );
		}
		return;
	}	
}