/** * Predicate to check expected collision between two segments * @param aSegA the first #SEG * @param aSegB the second #SEG * @param aClearance the collision clearance * @param aExp expected collision * @return does the distance calculated agree? */ bool SegCollideCorrect( const SEG& aSegA, const SEG& aSegB, int aClearance, bool aExp ) { const bool AtoB = aSegA.Collide( aSegB, aClearance ); const bool BtoA = aSegB.Collide( aSegA, aClearance ); const bool ok = ( AtoB == aExp ) && ( BtoA == aExp ); if( AtoB != BtoA ) { std::stringstream ss; ss << "Segment collision is not the same in both directions: expected " << aExp << ", got " << AtoB << " & " << BtoA; BOOST_TEST_INFO( ss.str() ); } else if( !ok ) { std::stringstream ss; ss << "Collision incorrect: expected " << aExp << ", got " << AtoB; BOOST_TEST_INFO( ss.str() ); } return ok; }
bool BOARD::TestAreaIntersection( ZONE_CONTAINER* area_ref, ZONE_CONTAINER* area_to_test ) { // see if areas are on same layer if( area_ref->GetLayer() != area_to_test->GetLayer() ) return false; SHAPE_POLY_SET* poly1 = area_ref->Outline(); SHAPE_POLY_SET* poly2 = area_to_test->Outline(); // test bounding rects BOX2I b1 = poly1->BBox(); BOX2I b2 = poly2->BBox(); if( ! b1.Intersects( b2 ) ) return false; // Now test for intersecting segments for( auto segIterator1 = poly1->IterateSegmentsWithHoles(); segIterator1; segIterator1++ ) { // Build segment SEG firstSegment = *segIterator1; for( auto segIterator2 = poly2->IterateSegmentsWithHoles(); segIterator2; segIterator2++ ) { // Build second segment SEG secondSegment = *segIterator2; // Check whether the two segments built collide if( firstSegment.Collide( secondSegment, 0 ) ) return true; } } // If a contour is inside another contour, no segments intersects, but the zones // can be combined if a corner is inside an outline (only one corner is enough) for( auto iter = poly2->IterateWithHoles(); iter; iter++ ) { if( poly1->Contains( *iter ) ) return true; } for( auto iter = poly1->IterateWithHoles(); iter; iter++ ) { if( poly2->Contains( *iter ) ) return true; } return false; }