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; } }