router: optimizer should now handle 'keep vertex' constraint correctly...

This commit is contained in:
Tomasz Wlostowski 2020-02-06 15:17:49 +01:00
parent 53c3f95ac4
commit cf4945afaa
2 changed files with 23 additions and 21 deletions

View File

@ -237,7 +237,7 @@ void OPTIMIZER::ClearCache( bool aStaticOnly )
} }
bool ANGLE_CONSTRAINT_45::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) bool ANGLE_CONSTRAINT_45::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement )
{ {
auto dir_orig0 = DIRECTION_45( aOriginLine->CSegment( aVertex1 ) ); auto dir_orig0 = DIRECTION_45( aOriginLine->CSegment( aVertex1 ) );
auto dir_orig1 = DIRECTION_45( aOriginLine->CSegment( aVertex2 - 1) ); auto dir_orig1 = DIRECTION_45( aOriginLine->CSegment( aVertex2 - 1) );
@ -262,7 +262,7 @@ bool ANGLE_CONSTRAINT_45::Check ( int aVertex1, int aVertex2, LINE* aOriginLine,
return true; return true;
} }
bool AREA_CONSTRAINT::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) bool AREA_CONSTRAINT::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement )
{ {
auto p1 = aOriginLine->CPoint( aVertex1 ); auto p1 = aOriginLine->CPoint( aVertex1 );
auto p2 = aOriginLine->CPoint( aVertex2 ); auto p2 = aOriginLine->CPoint( aVertex2 );
@ -289,32 +289,31 @@ class JOINT_CACHE
}; };
bool PRESERVE_VERTEX_CONSTRAINT::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) bool PRESERVE_VERTEX_CONSTRAINT::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement )
{ {
const auto& l = aOriginLine->CLine(); const auto& l = aOriginLine->CLine();
bool cv = false; bool cv = false;
printf("-------> avtx chk %d %d v %d %d\n", aVertex1, aVertex2, m_v.x, m_v.y );
for( int i = aVertex1; i < aVertex2; i++ ) for( int i = aVertex1; i < aVertex2; i++ )
{ {
int dist = l.CSegment(i).Distance( m_v ); int dist = aCurrentPath.CSegment(i).Distance( m_v );
printf("i %d dist %d\n", i, dist );
if ( dist <= 1 ) if ( dist <= 1 )
{ {
g_dbg->AddSegment( l.CSegment(i), 1 );
cv = true; cv = true;
break; break;
} }
} }
if(!cv) if(!cv)
{
return true; return true;
}
for( int i = 0; i < aReplacement.SegmentCount(); i++ ) for( int i = 0; i < aReplacement.SegmentCount(); i++ )
{ {
if ( aReplacement.CSegment(i).Distance( m_v ) < 1 ) int dist = aReplacement.CSegment(i).Distance( m_v );
if ( dist <= 1 )
{ {
return true; return true;
} }
@ -388,7 +387,7 @@ static bool pointInside2( const SHAPE_LINE_CHAIN& aL, const VECTOR2I& aP )
} }
bool KEEP_TOPOLOGY_CONSTRAINT::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) bool KEEP_TOPOLOGY_CONSTRAINT::Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement )
{ {
SHAPE_LINE_CHAIN encPoly = aOriginLine->CLine().Slice( aVertex1, aVertex2 ); SHAPE_LINE_CHAIN encPoly = aOriginLine->CLine().Slice( aVertex1, aVertex2 );
@ -449,11 +448,15 @@ void OPTIMIZER::AddConstraint ( OPT_CONSTRAINT *aConstraint )
m_constraints.push_back(aConstraint); m_constraints.push_back(aConstraint);
} }
bool OPTIMIZER::checkConstraints( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) bool OPTIMIZER::checkConstraints( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement )
{ {
for( auto c: m_constraints) for( auto c: m_constraints)
if ( !c->Check( aVertex1, aVertex2, aOriginLine, aReplacement ) ) {
if ( !c->Check( aVertex1, aVertex2, aOriginLine, aCurrentPath, aReplacement ) )
{
return false; return false;
}
}
return true; return true;
} }
@ -658,7 +661,7 @@ bool OPTIMIZER::mergeStep( LINE* aLine, SHAPE_LINE_CHAIN& aCurrentPath, int step
bool ok = false; bool ok = false;
if ( !checkColliding( aLine, bypass ) ) if ( !checkColliding( aLine, bypass ) )
{ {
ok = checkConstraints ( n, n + step + 1, aLine, bypass ); ok = checkConstraints ( n, n + step + 1, aLine, aCurrentPath, bypass );
} }
if( ok ) if( ok )
@ -1436,7 +1439,6 @@ void Tighten( NODE *aNode, SHAPE_LINE_CHAIN& aOldLine, LINE& aNewLine, LINE& aOp
{ {
LINE tmp; LINE tmp;
printf("shovedArea : %lld %d\n", shovedArea(aOldLine, aNewLine.CLine() ), aNewLine.SegmentCount() );
if ( aNewLine.SegmentCount() < 3 ) if ( aNewLine.SegmentCount() < 3 )

View File

@ -171,7 +171,7 @@ private:
void cacheAdd( ITEM* aItem, bool aIsStatic ); void cacheAdd( ITEM* aItem, bool aIsStatic );
void removeCachedSegments( LINE* aLine, int aStartVertex = 0, int aEndVertex = -1 ); void removeCachedSegments( LINE* aLine, int aStartVertex = 0, int aEndVertex = -1 );
bool checkConstraints( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ); bool checkConstraints( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement );
@ -210,7 +210,7 @@ public:
virtual ~OPT_CONSTRAINT() {}; virtual ~OPT_CONSTRAINT() {};
virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) = 0; virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement ) = 0;
int GetPriority() const int GetPriority() const
{ {
@ -240,7 +240,7 @@ public:
virtual ~ANGLE_CONSTRAINT_45() {}; virtual ~ANGLE_CONSTRAINT_45() {};
virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) override; virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement ) override;
private: private:
int m_entryDirectionMask; int m_entryDirectionMask;
@ -254,7 +254,7 @@ public:
OPT_CONSTRAINT( aWorld ), OPT_CONSTRAINT( aWorld ),
m_allowedArea ( aAllowedArea ) {}; m_allowedArea ( aAllowedArea ) {};
virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) override; virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement ) override;
private: private:
BOX2I m_allowedArea; BOX2I m_allowedArea;
@ -268,7 +268,7 @@ public:
OPT_CONSTRAINT( aWorld ) OPT_CONSTRAINT( aWorld )
{}; {};
virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) override; virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement ) override;
}; };
class PRESERVE_VERTEX_CONSTRAINT: public OPT_CONSTRAINT class PRESERVE_VERTEX_CONSTRAINT: public OPT_CONSTRAINT
@ -279,7 +279,7 @@ public:
m_v( aV ) m_v( aV )
{}; {};
virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aReplacement ) override; virtual bool Check ( int aVertex1, int aVertex2, LINE* aOriginLine, const SHAPE_LINE_CHAIN& aCurrentPath, const SHAPE_LINE_CHAIN& aReplacement ) override;
private: private:
VECTOR2I m_v; VECTOR2I m_v;