本文整理汇总了C++中clipperlib::Clipper类的典型用法代码示例。如果您正苦于以下问题:C++ Clipper类的具体用法?C++ Clipper怎么用?C++ Clipper使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Clipper类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: _clipper_do
void _clipper_do(const ClipperLib::ClipType clipType, const Slic3r::Polylines &subject,
const Slic3r::Polygons &clip, ClipperLib::PolyTree* retval, const ClipperLib::PolyFillType fillType,
const bool safety_offset_)
{
PROFILE_BLOCK(_clipper_do_polylines);
// read input
ClipperLib::Paths input_subject, input_clip;
Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
Slic3rMultiPoints_to_ClipperPaths(clip, &input_clip);
// perform safety offset
if (safety_offset_) safety_offset(&input_clip);
// init Clipper
ClipperLib::Clipper clipper;
clipper.Clear();
// add polygons
{
PROFILE_BLOCK(_clipper_do_polylines_AddPaths);
clipper.AddPaths(input_subject, ClipperLib::ptSubject, false);
clipper.AddPaths(input_clip, ClipperLib::ptClip, true);
}
// perform operation
{
PROFILE_BLOCK(_clipper_do_polylines_Execute);
clipper.Execute(clipType, *retval, fillType, fillType);
}
}
开发者ID:jiripech,项目名称:Slic3r,代码行数:31,代码来源:ClipperUtils.cpp
示例2: createUnion
polygon polygon::createUnion(const std::vector<polygon>& data)
{
base_int maxDenom = 1;
for(auto poly : data)
{
maxDenom = lcm(maxDenom, poly.highestDenominator());
}
maxDenom = std::min(maxDenom, base_int(1000000000L));
//std::cout << "-----" << std::endl;
//std::cout << maxDenom << std::endl;
polygon base = data[0];
for(unsigned int i = 1; i < data.size(); i++)
{
ClipperLib::Clipper clipper;
clipper.AddPath(base.path(maxDenom), ClipperLib::PolyType::ptSubject, true);
clipper.AddPath(data[i].path(maxDenom), ClipperLib::PolyType::ptClip, true);
ClipperLib::Paths returnedPaths;
clipper.Execute(ClipperLib::ClipType::ctUnion, returnedPaths, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
base = polygon::from(returnedPaths, maxDenom)[0];
}
return base;
}
开发者ID:AngelOfSol,项目名称:dress_app,代码行数:28,代码来源:Polygon.cpp
示例3:
ClipperLib::PolyTree
_clipper_do(const ClipperLib::ClipType clipType, const Polylines &subject,
const Polygons &clip, const ClipperLib::PolyFillType fillType,
const bool safety_offset_)
{
// read input
ClipperLib::Paths input_subject = Slic3rMultiPoints_to_ClipperPaths(subject);
ClipperLib::Paths input_clip = Slic3rMultiPoints_to_ClipperPaths(clip);
// perform safety offset
if (safety_offset_) safety_offset(&input_clip);
// init Clipper
ClipperLib::Clipper clipper;
clipper.Clear();
// add polygons
clipper.AddPaths(input_subject, ClipperLib::ptSubject, false);
clipper.AddPaths(input_clip, ClipperLib::ptClip, true);
// perform operation
ClipperLib::PolyTree retval;
clipper.Execute(clipType, retval, fillType, fillType);
return retval;
}
开发者ID:alpha6,项目名称:Slic3r,代码行数:25,代码来源:ClipperUtils.cpp
示例4: _clipper_do
void _clipper_do(const ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
const Slic3r::Polygons &clip, T &retval, const ClipperLib::PolyFillType fillType, const bool safety_offset_)
{
// read input
ClipperLib::Paths* input_subject = new ClipperLib::Paths();
ClipperLib::Paths* input_clip = new ClipperLib::Paths();
Slic3rMultiPoints_to_ClipperPaths(subject, *input_subject);
Slic3rMultiPoints_to_ClipperPaths(clip, *input_clip);
// perform safety offset
if (safety_offset_) {
if (clipType == ClipperLib::ctUnion) {
safety_offset(input_subject);
} else {
safety_offset(input_clip);
}
}
// init Clipper
ClipperLib::Clipper clipper;
clipper.Clear();
// add polygons
clipper.AddPaths(*input_subject, ClipperLib::ptSubject, true);
delete input_subject;
clipper.AddPaths(*input_clip, ClipperLib::ptClip, true);
delete input_clip;
// perform operation
clipper.Execute(clipType, retval, fillType, fillType);
}
开发者ID:jaysuk,项目名称:Slic3r,代码行数:31,代码来源:ClipperUtils.cpp
示例5: simplify_polygons
void simplify_polygons(const Slic3r::Polygons &subject, Slic3r::ExPolygons* retval, bool preserve_collinear)
{
PROFILE_FUNC();
if (!preserve_collinear) {
Polygons polygons;
simplify_polygons(subject, &polygons, preserve_collinear);
union_(polygons, retval);
return;
}
// convert into Clipper polygons
ClipperLib::Paths input_subject;
Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
ClipperLib::PolyTree polytree;
ClipperLib::Clipper c;
c.PreserveCollinear(true);
c.StrictlySimple(true);
c.AddPaths(input_subject, ClipperLib::ptSubject, true);
c.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
// convert into ExPolygons
PolyTreeToExPolygons(polytree, retval);
}
开发者ID:jiripech,项目名称:Slic3r,代码行数:26,代码来源:ClipperUtils.cpp
示例6: expand
Vector<Vector2> expand(const Vector<Vector2> &points, const Rect2i &rect, float epsilon = 2.0) {
int size = points.size();
ERR_FAIL_COND_V(size < 2, Vector<Vector2>());
ClipperLib::Path subj;
ClipperLib::PolyTree solution;
ClipperLib::PolyTree out;
for (int i = 0; i < points.size(); i++) {
subj << ClipperLib::IntPoint(points[i].x * PRECISION, points[i].y * PRECISION);
}
ClipperLib::ClipperOffset co;
co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
co.Execute(solution, epsilon * PRECISION);
ClipperLib::PolyNode *p = solution.GetFirst();
ERR_FAIL_COND_V(!p, points);
while (p->IsHole()) {
p = p->GetNext();
}
//turn the result into simply polygon (AKA, fix overlap)
//clamp into the specified rect
ClipperLib::Clipper cl;
cl.StrictlySimple(true);
cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
//create the clipping rect
ClipperLib::Path clamp;
clamp.push_back(ClipperLib::IntPoint(0, 0));
clamp.push_back(ClipperLib::IntPoint(rect.size.width * PRECISION, 0));
clamp.push_back(ClipperLib::IntPoint(rect.size.width * PRECISION, rect.size.height * PRECISION));
clamp.push_back(ClipperLib::IntPoint(0, rect.size.height * PRECISION));
cl.AddPath(clamp, ClipperLib::ptClip, true);
cl.Execute(ClipperLib::ctIntersection, out);
Vector<Vector2> outPoints;
ClipperLib::PolyNode *p2 = out.GetFirst();
ERR_FAIL_COND_V(!p2, points);
while (p2->IsHole()) {
p2 = p2->GetNext();
}
int lasti = p2->Contour.size() - 1;
Vector2 prev = Vector2(p2->Contour[lasti].X / PRECISION, p2->Contour[lasti].Y / PRECISION);
for (unsigned int i = 0; i < p2->Contour.size(); i++) {
Vector2 cur = Vector2(p2->Contour[i].X / PRECISION, p2->Contour[i].Y / PRECISION);
if (cur.distance_to(prev) > 0.5) {
outPoints.push_back(cur);
prev = cur;
}
}
return outPoints;
}
开发者ID:Valentactive,项目名称:godot,代码行数:59,代码来源:sprite_editor_plugin.cpp
示例7: log
std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const cocos2d::Rect &rect, const float& epsilon)
{
auto size = points.size();
// if there are less than 3 points, then we have nothing
if(size<3)
{
log("AUTOPOLYGON: cannot expand points for %s with less than 3 points, e: %f", _filename.c_str(), epsilon);
return std::vector<Vec2>();
}
ClipperLib::Path subj;
ClipperLib::PolyTree solution;
ClipperLib::PolyTree out;
for(std::vector<Vec2>::const_iterator it = points.begin(); it<points.end(); it++)
{
subj << ClipperLib::IntPoint(it-> x* PRECISION, it->y * PRECISION);
}
ClipperLib::ClipperOffset co;
co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
co.Execute(solution, epsilon * PRECISION);
ClipperLib::PolyNode* p = solution.GetFirst();
if(!p)
{
log("AUTOPOLYGON: Clipper failed to expand the points");
return points;
}
while(p->IsHole()){
p = p->GetNext();
}
//turn the result into simply polygon (AKA, fix overlap)
//clamp into the specified rect
ClipperLib::Clipper cl;
cl.StrictlySimple(true);
cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
//create the clipping rect
ClipperLib::Path clamp;
clamp.push_back(ClipperLib::IntPoint(0, 0));
clamp.push_back(ClipperLib::IntPoint(rect.size.width/_scaleFactor * PRECISION, 0));
clamp.push_back(ClipperLib::IntPoint(rect.size.width/_scaleFactor * PRECISION, rect.size.height/_scaleFactor * PRECISION));
clamp.push_back(ClipperLib::IntPoint(0, rect.size.height/_scaleFactor * PRECISION));
cl.AddPath(clamp, ClipperLib::ptClip, true);
cl.Execute(ClipperLib::ctIntersection, out);
std::vector<Vec2> outPoints;
ClipperLib::PolyNode* p2 = out.GetFirst();
while(p2->IsHole()){
p2 = p2->GetNext();
}
auto end = p2->Contour.end();
for(std::vector<ClipperLib::IntPoint>::const_iterator pt = p2->Contour.begin(); pt < end; pt++)
{
outPoints.push_back(Vec2(pt->X/PRECISION, pt->Y/PRECISION));
}
return outPoints;
}
开发者ID:Fuzesunshine,项目名称:CocosTest,代码行数:57,代码来源:CCAutoPolygon.cpp
示例8: _offset
// This is a safe variant of the polygon offset, tailored for a single ExPolygon:
// a single polygon with multiple non-overlapping holes.
// Each contour and hole is offsetted separately, then the holes are subtracted from the outer contours.
ClipperLib::Paths _offset(const Slic3r::ExPolygon &expolygon, const float delta,
ClipperLib::JoinType joinType, double miterLimit)
{
// printf("new ExPolygon offset\n");
// 1) Offset the outer contour.
const float delta_scaled = delta * float(CLIPPER_OFFSET_SCALE);
ClipperLib::Paths contours;
{
ClipperLib::Path input = Slic3rMultiPoint_to_ClipperPath(expolygon.contour);
scaleClipperPolygon(input);
ClipperLib::ClipperOffset co;
if (joinType == jtRound)
co.ArcTolerance = miterLimit * double(CLIPPER_OFFSET_SCALE);
else
co.MiterLimit = miterLimit;
co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR));
co.AddPath(input, joinType, ClipperLib::etClosedPolygon);
co.Execute(contours, delta_scaled);
}
// 2) Offset the holes one by one, collect the results.
ClipperLib::Paths holes;
{
holes.reserve(expolygon.holes.size());
for (Polygons::const_iterator it_hole = expolygon.holes.begin(); it_hole != expolygon.holes.end(); ++ it_hole) {
ClipperLib::Path input = Slic3rMultiPoint_to_ClipperPath_reversed(*it_hole);
scaleClipperPolygon(input);
ClipperLib::ClipperOffset co;
if (joinType == jtRound)
co.ArcTolerance = miterLimit * double(CLIPPER_OFFSET_SCALE);
else
co.MiterLimit = miterLimit;
co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR));
co.AddPath(input, joinType, ClipperLib::etClosedPolygon);
ClipperLib::Paths out;
co.Execute(out, - delta_scaled);
holes.insert(holes.end(), out.begin(), out.end());
}
}
// 3) Subtract holes from the contours.
ClipperLib::Paths output;
if (holes.empty()) {
output = std::move(contours);
} else {
ClipperLib::Clipper clipper;
clipper.Clear();
clipper.AddPaths(contours, ClipperLib::ptSubject, true);
clipper.AddPaths(holes, ClipperLib::ptClip, true);
clipper.Execute(ClipperLib::ctDifference, output, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
}
// 4) Unscale the output.
unscaleClipperPolygons(output);
return output;
}
开发者ID:prusa3d,项目名称:Slic3r,代码行数:59,代码来源:ClipperUtils.cpp
示例9: executeForObjects
bool BooleanTool::executeForObjects(PathObject* subject, PathObjects& in_objects, PathObjects& out_objects)
{
// Convert the objects to Clipper polygons and
// create a hash map, mapping point positions to the PathCoords.
// These paths are to be regarded as closed.
PolyMap polymap;
ClipperLib::Paths subject_polygons;
pathObjectToPolygons(subject, subject_polygons, polymap);
ClipperLib::Paths clip_polygons;
for (PathObject* object : in_objects)
{
if (object != subject)
{
pathObjectToPolygons(object, clip_polygons, polymap);
}
}
// Do the operation.
ClipperLib::Clipper clipper;
clipper.AddPaths(subject_polygons, ClipperLib::ptSubject, true);
clipper.AddPaths(clip_polygons, ClipperLib::ptClip, true);
ClipperLib::ClipType clip_type;
ClipperLib::PolyFillType fill_type = ClipperLib::pftNonZero;
switch (op)
{
case Union: clip_type = ClipperLib::ctUnion;
break;
case Intersection: clip_type = ClipperLib::ctIntersection;
break;
case Difference: clip_type = ClipperLib::ctDifference;
break;
case XOr: clip_type = ClipperLib::ctXor;
break;
case MergeHoles: clip_type = ClipperLib::ctUnion;
fill_type = ClipperLib::pftPositive;
break;
default: Q_ASSERT(false && "Undefined operation");
return false;
}
ClipperLib::PolyTree solution;
bool success = clipper.Execute(clip_type, solution, fill_type, fill_type);
if (success)
{
// Try to convert the solution polygons to objects again
polyTreeToPathObjects(solution, out_objects, subject, polymap);
}
return success;
}
开发者ID:kshji,项目名称:mapper,代码行数:53,代码来源:tool_boolean.cpp
示例10: _processWalkableObstacleRegions
ClipperLib::Polygons NavMesh::_processWalkableObstacleRegions(const ClipperLib::Polygons& walkable, const ClipperLib::Polygons& obstacles)
{
ClipperLib::Clipper clipper;
ClipperLib::Polygons solution;
clipper.AddPolygons(walkable, ClipperLib::ptSubject );
clipper.AddPolygons(obstacles, ClipperLib::ptClip);
clipper.Execute(ClipperLib::ctDifference, solution, ClipperLib::PolyFillType::pftNonZero, ClipperLib::PolyFillType::pftNonZero );
return solution;
}
开发者ID:keekekx,项目名称:NavMesh,代码行数:14,代码来源:NavMesh.cpp
示例11: from
std::vector<polygon> polygon::subtract(const polygon& subtrahend) const
{
ClipperLib::Clipper poly;
auto maxDenom = lcm(this->highestDenominator(), subtrahend.highestDenominator());
poly.AddPath(this->path(maxDenom), ClipperLib::PolyType::ptSubject, true);
poly.AddPath(subtrahend.path(maxDenom), ClipperLib::PolyType::ptClip, true);
ClipperLib::Paths returnedPaths;
poly.Execute(ClipperLib::ClipType::ctDifference, returnedPaths);
return polygon::from(returnedPaths, maxDenom);
}
开发者ID:AngelOfSol,项目名称:dress_app,代码行数:15,代码来源:Polygon.cpp
示例12: PolyTreeToExPolygons
ExPolygons
ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input)
{
// init Clipper
ClipperLib::Clipper clipper;
clipper.Clear();
// perform union
clipper.AddPaths(input, ClipperLib::ptSubject, true);
ClipperLib::PolyTree polytree;
clipper.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd); // offset results work with both EvenOdd and NonZero
// write to ExPolygons object
return PolyTreeToExPolygons(polytree);
}
开发者ID:alpha6,项目名称:Slic3r,代码行数:15,代码来源:ClipperUtils.cpp
示例13: top_level_islands
Polygons top_level_islands(const Slic3r::Polygons &polygons)
{
// init Clipper
ClipperLib::Clipper clipper;
clipper.Clear();
// perform union
clipper.AddPaths(Slic3rMultiPoints_to_ClipperPaths(polygons), ClipperLib::ptSubject, true);
ClipperLib::PolyTree polytree;
clipper.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd);
// Convert only the top level islands to the output.
Polygons out;
out.reserve(polytree.ChildCount());
for (int i = 0; i < polytree.ChildCount(); ++i)
out.emplace_back(ClipperPath_to_Slic3rPolygon(polytree.Childs[i]->Contour));
return out;
}
开发者ID:prusa3d,项目名称:Slic3r,代码行数:16,代码来源:ClipperUtils.cpp
示例14: DecomposePolygonToConvexhulls
/*
std::vector<Polygon> DecomposePolygonToConvexhulls(const Polygon& polygon) {
using VHACD::IVHACD;
TriangleMesh mesh = TriangulatePolygon(polygon);
std::vector<float> points;
points.reserve(2 * mesh.vertices.size());
for (auto& vertex : mesh.vertices) {
points.emplace_back(vertex(0));
points.emplace_back(vertex(1));
}
std::vector<int> triangle_indices;
triangle_indices.reserve(mesh.faces.size() * 3);
for (auto& tr_idx : mesh.faces) {
triangle_indices.emplace_back(tr_idx[0]);
triangle_indices.emplace_back(tr_idx[1]);
triangle_indices.emplace_back(tr_idx[2]);
}
IVHACD::Parameters params;
//
// params.m_maxNumVerticesPerCH = 8;
params.m_oclAcceleration = false;
IVHACD* vhacd_interface = VHACD::CreateVHACD();
bool res = vhacd_interface->Compute(points.data(), 2, mesh.vertices.size(),
triangle_indices.data(), 3,
mesh.faces.size(), params);
std::vector<Polygon> polygons;
if (res) {
size_t num_hulls = vhacd_interface->GetNConvexHulls();
IVHACD::ConvexHull hull;
for (size_t p = 0; p < num_hulls; ++p) {
vhacd_interface->GetConvexHull(p, hull);
for (size_t v = 0; v < hull.m_nPoints; ++v) {
std::cout << p << " ";
std::cout << hull.m_points[3 * v + 0] << " ";
std::cout << hull.m_points[3 * v + 1] << " ";
std::cout << hull.m_points[3 * v + 2] << "\n";
}
}
} else {
std::cerr << "convex hull decomposition not successfull! fall back to "
"triangulation!\n";
}
vhacd_interface->Clean();
vhacd_interface->Release();
exit(0);
return polygons;
}
*/
std::vector<Polygon2D> ResolveIntersections(const Polygon2D& polygon) {
// the polygon boundary maybe splitted during this process
// auto paths = ResolveIntersectionsClosedPath(polygon.path);
// auto holes = ResolveIntersectionsClosedPaths(polygon.holes);
ClipperLib::Clipper clipper;
ClipperLib::Path scaled_path = UScalePathDiaToClipper(polygon.path);
clipper.AddPath(scaled_path, ClipperLib::ptSubject, true);
/*
for (auto& path : paths) {
ClipperLib::Path scaled_path = UScalePathDiaToClipper(path);
clipper.AddPath(scaled_path, ClipperLib::ptSubject, true);
}*/
for (auto& hole : polygon.holes) {
ClipperLib::Path scaled_hole = UScalePathDiaToClipper(hole);
clipper.AddPath(scaled_hole, ClipperLib::ptClip, true);
}
ClipperLib::PolyTree path_tree;
clipper.StrictlySimple(true);
clipper.Execute(ClipperLib::ctDifference, path_tree, ClipperLib::pftNonZero,
ClipperLib::pftNonZero);
// iterating into the tree
std::vector<Polygon2D> polygons;
// only store the pointer to outer polygons
std::unordered_map<ClipperLib::PolyNode*, size_t> polynode_map;
for (ClipperLib::PolyNode* node_ptr = path_tree.GetFirst(); node_ptr;
node_ptr = node_ptr->GetNext()) {
ClipperLib::PolyNode* poly_ptr = node_ptr;
while (poly_ptr && poly_ptr->IsHole()) {
poly_ptr = poly_ptr->Parent;
}
if (polynode_map.find(poly_ptr) == polynode_map.end()) {
polygons.emplace_back(Polygon2D());
polygons.back().path = DScalePathClipperToDia(poly_ptr->Contour);
polynode_map[poly_ptr] = polygons.size() - 1;
} else {
polygons[polynode_map[poly_ptr]].holes.emplace_back(
DScalePathClipperToDia(node_ptr->Contour));
}
}
return polygons;
}
开发者ID:billbudge,项目名称:Diagrams,代码行数:98,代码来源:geometry2.cpp
示例15: ConcaveHullJoinCurrent
void PlaneExt::ConcaveHullJoinCurrent(pcl::PointCloud<pcl::PointXYZ>::Ptr &plane_hull, tVertices &polygon_indices)
{
// Join new polygon with current
ClipperLib::ExPolygons newPoly = PolygonizeConcaveHull(plane_hull, polygon_indices);
ClipperLib::Clipper clipper;
// insert all existing polygons
for (unsigned int i = 0; i < planePolygonsClipper.size(); ++i)
clipper.AddPolygon(planePolygonsClipper[i].outer, ClipperLib::ptSubject);
// insert all new polygons
for (unsigned int i = 0; i < newPoly.size(); ++i)
clipper.AddPolygon(newPoly[i].outer, ClipperLib::ptClip);
// execute join operation
clipper.Execute(ClipperLib::ctUnion, planePolygonsClipper);
}
开发者ID:vstancl,项目名称:srs_public,代码行数:17,代码来源:plane.cpp
示例16: fixupPolygons
GeometryCollection fixupPolygons(const GeometryCollection& rings) {
ClipperLib::Clipper clipper;
clipper.StrictlySimple(true);
for (const auto& ring : rings) {
clipper.AddPath(toClipperPath(ring), ClipperLib::ptSubject, true);
}
ClipperLib::PolyTree polygons;
clipper.Execute(ClipperLib::ctUnion, polygons, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd);
clipper.Clear();
GeometryCollection result;
for (auto * polynode : polygons.Childs) {
processPolynodeBranch(polynode, result);
}
return result;
}
开发者ID:calendreco,项目名称:mapbox-gl-native,代码行数:18,代码来源:geometry_tile.cpp
示例17: PolyTreeToExPolygons
void
ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, Slic3r::ExPolygons &output)
{
// init Clipper
ClipperLib::Clipper clipper;
clipper.Clear();
// perform union
clipper.AddPaths(input, ClipperLib::ptSubject, true);
ClipperLib::PolyTree* polytree = new ClipperLib::PolyTree();
clipper.Execute(ClipperLib::ctUnion, *polytree, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd); // offset results work with both EvenOdd and NonZero
// write to ExPolygons object
output.clear();
PolyTreeToExPolygons(*polytree, output);
delete polytree;
}
开发者ID:jaysuk,项目名称:Slic3r,代码行数:18,代码来源:ClipperUtils.cpp
示例18: simplify_polygons_ex
ExPolygons simplify_polygons_ex(const Polygons &subject, bool preserve_collinear)
{
if (! preserve_collinear)
return union_ex(simplify_polygons(subject, false));
// convert into Clipper polygons
ClipperLib::Paths input_subject = Slic3rMultiPoints_to_ClipperPaths(subject);
ClipperLib::PolyTree polytree;
ClipperLib::Clipper c;
c.PreserveCollinear(true);
c.StrictlySimple(true);
c.AddPaths(input_subject, ClipperLib::ptSubject, true);
c.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
// convert into ExPolygons
return PolyTreeToExPolygons(polytree);
}
开发者ID:prusa3d,项目名称:Slic3r,代码行数:19,代码来源:ClipperUtils.cpp
示例19: simplify_polygons
void simplify_polygons(const Slic3r::Polygons &subject, Slic3r::Polygons* retval, bool preserve_collinear)
{
// convert into Clipper polygons
ClipperLib::Paths input_subject, output;
Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
if (preserve_collinear) {
ClipperLib::Clipper c;
c.PreserveCollinear(true);
c.StrictlySimple(true);
c.AddPaths(input_subject, ClipperLib::ptSubject, true);
c.Execute(ClipperLib::ctUnion, output, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
} else {
ClipperLib::SimplifyPolygons(input_subject, output, ClipperLib::pftNonZero);
}
// convert into Slic3r polygons
ClipperPaths_to_Slic3rMultiPoints(output, retval);
}
开发者ID:151706061,项目名称:Slic3r,代码行数:19,代码来源:ClipperUtils.cpp
示例20:
EaglePolygon::EaglePolygon(QPolygonF _vertices, qreal _width, int _layer, qreal _spacing) {
width = _width; layer = _layer; spacing = _spacing;
sourcePoly.resize(_vertices.count());
for (int i = 0; i < _vertices.count(); i++) {
ClipperLib::long64 x = (ClipperLib::long64)(_vertices.at(i).x()*RES);
ClipperLib::long64 y = (ClipperLib::long64)(_vertices.at(i).y()*RES);
sourcePoly[0].push_back(ClipperLib::IntPoint(x,y));
}
ClipperLib::Clipper c;
c.AddPolygons(sourcePoly, ClipperLib::ptSubject);
c.Execute(ClipperLib::ctUnion,sourcePoly); // only makes sure polys orientation is correct
ClipperLib::OffsetPolygons(sourcePoly,buffedPoly, width*RES/2, ClipperLib::jtRound); // offset
for (unsigned int i = 0; i < buffedPoly[0].size(); i++) {
vertices.append(QPointF(buffedPoly[0].at(i).X/RES, buffedPoly[0].at(i).Y/RES));
}
}
开发者ID:elektronisk,项目名称:edatool,代码行数:19,代码来源:eaglepolygon.cpp
注:本文中的clipperlib::Clipper类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论