Skip excluded nodes when prepare segment of curve.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2017-03-25 10:18:03 +02:00
parent 6ac1a1247c
commit e9c9d263f6
2 changed files with 69 additions and 4 deletions

View File

@ -387,9 +387,12 @@ VSAPoint VPiecePath::StartSegment(const VContainer *data, const QVector<VPieceNo
if (nodes.size() > 1)
{
int index = 0;
i == 0 ? index = nodes.size()-1 : index = i-1;
i == 0 ? index = FindInLoopNotExcludedUp(nodes.size()-1, nodes) : index = FindInLoopNotExcludedUp(i-1, nodes);
begin = CurveStartPoint(begin, data, nodes.at(index), points);
if (index != -1 && index != i)
{
begin = CurveStartPoint(begin, data, nodes.at(index), points);
}
}
return begin;
}
@ -416,9 +419,12 @@ VSAPoint VPiecePath::EndSegment(const VContainer *data, const QVector<VPieceNode
if (nodes.size() > 2)
{
int index = 0;
i == nodes.size() - 1 ? index = 0 : index = i+1;
i == nodes.size()-1 ? index=FindInLoopNotExcludedDown(0, nodes) : index=FindInLoopNotExcludedDown(i+1, nodes);
end = CurveEndPoint(end, data, nodes.at(index), points);
if (index != -1 && index != i)
{
end = CurveEndPoint(end, data, nodes.at(index), points);
}
}
return end;
}
@ -762,6 +768,62 @@ QPointF VPiecePath::NodeNextPoint(const VContainer *data, int i) const
return point;
}
//---------------------------------------------------------------------------------------------------------------------
int VPiecePath::FindInLoopNotExcludedUp(int candidate, const QVector<VPieceNode> &nodes)
{
if (candidate < 0 || candidate >= nodes.size())
{
return -1;
}
int checked = 0;
int i = candidate;
do
{
if (not nodes.at(i).IsExcluded())
{
break;
}
++checked;
--i;
if (i < 0)
{
i = nodes.size() - 1;
}
} while (checked < nodes.size());
return i;
}
//---------------------------------------------------------------------------------------------------------------------
int VPiecePath::FindInLoopNotExcludedDown(int candidate, const QVector<VPieceNode> &nodes)
{
if (candidate < 0 || candidate >= nodes.size())
{
return -1;
}
int checked = 0;
int i = candidate;
do
{
if (not nodes.at(i).IsExcluded())
{
break;
}
++checked;
++i;
if (i >= nodes.size())
{
i = 0;
}
} while (checked < nodes.size());
return i;
}
//---------------------------------------------------------------------------------------------------------------------
VSAPoint VPiecePath::PreparePointEkv(const VPieceNode &node, const VContainer *data)
{

View File

@ -94,6 +94,9 @@ public:
QPointF NodePreviousPoint(const VContainer *data, int i) const;
QPointF NodeNextPoint(const VContainer *data, int i) const;
static int FindInLoopNotExcludedUp(int candidate, const QVector<VPieceNode> &nodes);
static int FindInLoopNotExcludedDown(int candidate, const QVector<VPieceNode> &nodes);
static VSAPoint StartSegment(const VContainer *data, const QVector<VPieceNode> &nodes, int i, bool reverse);
static VSAPoint EndSegment(const VContainer *data, const QVector<VPieceNode> &nodes, int i, bool reverse);