Port new test case. Zigzag in main path.
--HG-- branch : feature
This commit is contained in:
parent
bd49df3d50
commit
93535d8f19
|
@ -214,24 +214,49 @@ QVector<T> VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bo
|
||||||
}
|
}
|
||||||
|
|
||||||
//Clear equivalent points
|
//Clear equivalent points
|
||||||
QVector<T> correctPoints = RemoveDublicates(points, removeFirstAndLast);
|
QVector<T> buf1 = RemoveDublicates(points, removeFirstAndLast);
|
||||||
|
|
||||||
if (correctPoints.size()<3)
|
if (buf1.size()<3)
|
||||||
{
|
{
|
||||||
return correctPoints;
|
return buf1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVector<T> buf2;
|
||||||
//Remove point on line
|
//Remove point on line
|
||||||
for (qint32 i = 1; i <correctPoints.size()-1; ++i)
|
for (qint32 i = 0; i < buf1.size(); ++i)
|
||||||
{// In this case we alwayse will have bounded intersection, so all is need is to check if point i is on line.
|
{// In this case we alwayse will have bounded intersection, so all is need is to check if point i is on line.
|
||||||
// Unfortunatelly QLineF::intersect can't be used in this case because of the floating-point accuraccy problem.
|
// Unfortunatelly QLineF::intersect can't be used in this case because of the floating-point accuraccy problem.
|
||||||
if (VGObject::IsPointOnLineviaPDP(correctPoints.at(i), correctPoints.at(i-1), correctPoints.at(i+1)))
|
int prev = i-1;
|
||||||
|
int next = i+1;
|
||||||
|
if (i == 0)
|
||||||
{
|
{
|
||||||
correctPoints.remove(i);
|
prev = buf1.size() - 1;
|
||||||
|
}
|
||||||
|
else if (i == buf1.size() - 1)
|
||||||
|
{
|
||||||
|
next = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QPointF &iPoint = buf1.at(i);
|
||||||
|
const QPointF &prevPoint = buf1.at(prev);
|
||||||
|
const QPointF &nextPoint = buf1.at(next);
|
||||||
|
|
||||||
|
if (not VGObject::IsPointOnLineviaPDP(buf1.at(i), buf1.at(prev), buf1.at(next))
|
||||||
|
&& prevPoint != nextPoint) // not zigzag
|
||||||
|
{
|
||||||
|
buf2.append(buf1.at(i));
|
||||||
|
}
|
||||||
|
else if ((i == 0 || i == buf1.size() - 1) && (iPoint == prevPoint || iPoint == nextPoint))
|
||||||
|
{
|
||||||
|
// If RemoveDublicates does not remove these points it is a valid case.
|
||||||
|
// Case where last point equal first point
|
||||||
|
buf2.append(buf1.at(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return correctPoints;
|
buf2 = RemoveDublicates(buf2, false);
|
||||||
|
|
||||||
|
return buf2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue
Block a user