本文整理汇总了C++中clipperlib::Path::at方法的典型用法代码示例。如果您正苦于以下问题:C++ Path::at方法的具体用法?C++ Path::at怎么用?C++ Path::at使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类clipperlib::Path
的用法示例。
在下文中一共展示了Path::at方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: checkSegmentMatch
bool BooleanTool::checkSegmentMatch(
const PathObject* original,
int coord_index,
const ClipperLib::Path& polygon,
ClipperLib::Path::size_type start_index,
ClipperLib::Path::size_type end_index,
bool& out_coords_increasing,
bool& out_is_curve )
{
const MapCoord& first = original->getCoordinate(coord_index);
out_is_curve = first.isCurveStart();
auto other_index = (coord_index + (out_is_curve ? 3 : 1)) % original->getCoordinateCount();
const MapCoord& other = original->getCoordinate(other_index);
bool found = true;
if (first == polygon.at(start_index) && other == polygon.at(end_index))
{
out_coords_increasing = true;
}
else if (first == polygon.at(end_index) && other == polygon.at(start_index))
{
out_coords_increasing = false;
}
else
{
found = false;
}
return found;
}
示例2: rebuildCoordinate
void BooleanTool::rebuildCoordinate(
ClipperLib::Path::size_type index,
const ClipperLib::Path& polygon,
const PolyMap& polymap,
PathObject* object,
bool start_new_part)
{
MapCoord coord(0.001 * polygon.at(index).X, 0.001 * polygon.at(index).Y);
if (polymap.contains(polygon.at(index)))
{
PathCoordInfo info = polymap.value(polygon.at(index));
MapCoord& original = info.first->path->getCoordinate(info.second->index);
if (original.isDashPoint())
coord.setDashPoint(true);
}
object->addCoordinate(coord, start_new_part);
}
示例3: rebuildTwoIndexSegment
void BooleanTool::rebuildTwoIndexSegment(
ClipperLib::Path::size_type start_index,
ClipperLib::Path::size_type end_index,
bool sequence_increasing,
const ClipperLib::Path& polygon,
const PolyMap& polymap,
PathObject* object)
{
Q_UNUSED(sequence_increasing); // only used in Q_ASSERT.
PathCoordInfo start_info = polymap.value(polygon.at(start_index));
PathCoordInfo end_info = polymap.value(polygon.at(end_index));
PathObject* original = end_info.first->path;
bool coords_increasing;
bool is_curve;
int coord_index;
if (start_info.second->index == end_info.second->index)
{
coord_index = end_info.second->index;
bool found = checkSegmentMatch(original, coord_index, polygon, start_index, end_index, coords_increasing, is_curve);
if (!found)
{
object->getCoordinate(object->getCoordinateCount() - 1).setCurveStart(false);
rebuildCoordinate(end_index, polygon, polymap, object);
return;
}
Q_ASSERT(coords_increasing == sequence_increasing);
}
else
{
coord_index = end_info.second->index;
bool found = checkSegmentMatch(original, coord_index, polygon, start_index, end_index, coords_increasing, is_curve);
if (!found)
{
coord_index = start_info.second->index;
found = checkSegmentMatch(original, coord_index, polygon, start_index, end_index, coords_increasing, is_curve);
if (!found)
{
object->getCoordinate(object->getCoordinateCount() - 1).setCurveStart(false);
rebuildCoordinate(end_index, polygon, polymap, object);
return;
}
}
}
if (!is_curve)
object->getCoordinate(object->getCoordinateCount() - 1).setCurveStart(false);
if (coords_increasing)
{
object->addCoordinate(resetCoordinate(original->getCoordinate(coord_index + 1)));
if (is_curve)
{
object->addCoordinate(original->getCoordinate(coord_index + 2));
object->addCoordinate(resetCoordinate(original->getCoordinate(coord_index + 3)));
}
}
else
{
if (is_curve)
{
object->addCoordinate(resetCoordinate(original->getCoordinate(coord_index + 2)));
object->addCoordinate(original->getCoordinate(coord_index + 1));
}
object->addCoordinate(resetCoordinate(original->getCoordinate(coord_index + 0)));
}
}
示例4: rebuildSegment
void BooleanTool::rebuildSegment(
ClipperLib::Path::size_type start_index,
ClipperLib::Path::size_type end_index,
bool sequence_increasing,
const ClipperLib::Path& polygon,
const PolyMap& polymap,
PathObject* object)
{
auto num_points = polygon.size();
object->getCoordinate(object->getCoordinateCount() - 1).setCurveStart(true);
if ((start_index + 1) % num_points == end_index)
{
// This could happen for a straight line or a very flat curve - take coords directly from original
rebuildTwoIndexSegment(start_index, end_index, sequence_increasing, polygon, polymap, object);
return;
}
// Get polygon point coordinates
const auto& start_point = polygon.at(start_index);
const auto& second_point = polygon.at((start_index + 1) % num_points);
const auto& second_last_point = polygon.at((end_index - 1) % num_points);
const auto& end_point = polygon.at(end_index);
// Try to find the middle coordinates in the same part
bool found = false;
PathCoordInfo second_info{ nullptr, nullptr };
PathCoordInfo second_last_info{ nullptr, nullptr };
for (auto second_it = polymap.find(second_point); second_it != polymap.end(); ++second_it)
{
for (auto second_last_it = polymap.find(second_last_point);
second_last_it != polymap.end() && second_last_it.key() == second_last_point;
++second_last_it)
{
if (second_it->first == second_last_it->first &&
second_it->second->index == second_last_it->second->index)
{
// Same part
found = true;
second_info = *second_it;
second_last_info = *second_last_it;
break;
}
}
if (found)
break;
}
if (!found)
{
// Need unambiguous path part information to find the original object with high probability
qDebug() << "BooleanTool::rebuildSegment: cannot identify original object!";
rebuildSegmentFromPathOnly(start_point, second_point, second_last_point, end_point, object);
return;
}
const PathPart* original_path = second_info.first;
// Try to find the outer coordinates in the same part
PathCoordInfo start_info{ nullptr, nullptr };
for (auto start_it = polymap.find(start_point);
start_it != polymap.end() && start_it.key() == start_point;
++start_it)
{
if (start_it->first == original_path)
{
start_info = *start_it;
break;
}
}
Q_ASSERT(!start_info.first || start_info.first == second_info.first);
PathCoordInfo end_info{ nullptr, nullptr };
for (auto end_it = polymap.find(end_point);
end_it != polymap.end() && end_it.key() == end_point;
++end_it)
{
if (end_it->first == original_path)
{
end_info = *end_it;
break;
}
}
Q_ASSERT(!end_info.first || end_info.first == second_info.first);
const PathObject* original = original_path->path;
auto edge_start = second_info.second->index;
if (edge_start == second_info.first->last_index)
edge_start = second_info.first->first_index;
// Find out start tangent
auto start_param = 0.0;
MapCoord start_coord = MapCoord(0.001 * start_point.X, 0.001 * start_point.Y);
MapCoord start_tangent;
MapCoord end_tangent;
MapCoord end_coord;
double start_error_sq, end_error_sq;
// Maximum difference in mm from reconstructed start and end coords to the
//.........这里部分代码省略.........
示例5: polygonToPathPart
void BooleanTool::polygonToPathPart(const ClipperLib::Path& polygon, const PolyMap& polymap, PathObject* object)
{
auto num_points = polygon.size();
if (num_points < 3)
return;
// Index of first used point in polygon
auto part_start_index = 0u;
auto cur_info = PathCoordInfo{ nullptr, nullptr };
// Check if we can find either an unknown intersection point
// or a path coord with parameter 0.
// This gives a starting point to search for curves to rebuild
// (because we cannot start in the middle of a curve)
for (; part_start_index < num_points; ++part_start_index)
{
auto current_point = polygon.at(part_start_index);
if (!polymap.contains(current_point))
break;
if (polymap.value(current_point).second->param == 0.0)
{
cur_info = polymap.value(current_point);
break;
}
}
if (part_start_index == num_points)
{
// Did not find a valid starting point. Return the part as a polygon.
for (auto i = 0u; i < num_points; ++i)
object->addCoordinate(MapCoord(0.001 * polygon.at(i).X, 0.001 * polygon.at(i).Y), (i == 0));
object->parts().back().setClosed(true, true);
return;
}
// Add the first point to the object
rebuildCoordinate(part_start_index, polygon, polymap, object, true);
// Index of first segment point in polygon
auto segment_start_index = part_start_index;
bool have_sequence = false;
bool sequence_increasing = false;
bool stop_before = false;
// Advance along the boundary and rebuild the curve for every sequence
// of path coord pointers with the same path and index.
auto i = part_start_index;
do
{
++i;
if (i >= num_points)
i = 0;
PathCoordInfo new_info{ nullptr, nullptr };
auto new_point = polygon.at(i);
if (polymap.contains(new_point))
new_info = polymap.value(new_point);
if (cur_info.first && cur_info.first == new_info.first)
{
// Same original part
auto cur_coord_index = cur_info.second->index;
MapCoord& cur_coord = cur_info.first->path->getCoordinate(cur_coord_index);
auto new_coord_index = new_info.second->index;
MapCoord& new_coord = new_info.first->path->getCoordinate(new_coord_index);
auto cur_coord_index_adjusted = cur_coord_index;
if (cur_coord_index_adjusted == new_info.first->first_index)
cur_coord_index_adjusted = new_info.first->last_index;
auto new_coord_index_adjusted = new_coord_index;
if (new_coord_index_adjusted == new_info.first->first_index)
new_coord_index_adjusted = new_info.first->last_index;
if (cur_coord_index == new_coord_index)
{
// Somewhere on a curve
bool param_increasing = new_info.second->param > cur_info.second->param;
if (!have_sequence)
{
have_sequence = true;
sequence_increasing = param_increasing;
}
else if (have_sequence && sequence_increasing != param_increasing)
{
stop_before = true;
}
}
else if (new_info.second->param == 0.0 &&
( (cur_coord.isCurveStart() && new_coord_index_adjusted == cur_coord_index + 3) ||
(!cur_coord.isCurveStart() && new_coord_index_adjusted == cur_coord_index + 1) ) )
{
// Original curve is from cur_coord_index to new_coord_index_adjusted.
if (!have_sequence)
{
have_sequence = true;
sequence_increasing = true;
//.........这里部分代码省略.........