Add conversion into Lines for ThickPolyline.

This commit is contained in:
Lukáš Hejl 2024-07-08 14:20:36 +02:00 committed by Lukas Matena
parent 5cc2e5eb0b
commit 2cba980a8b
3 changed files with 69 additions and 16 deletions

View File

@ -194,7 +194,7 @@ template<class L> bool intersection(const L &l1, const L &l2, Vec<Dim<L>, Scalar
class Line class Line
{ {
public: public:
Line() {} Line() = default;
Line(const Point& _a, const Point& _b) : a(_a), b(_b) {} Line(const Point& _a, const Point& _b) : a(_a), b(_b) {}
explicit operator Lines() const { Lines lines; lines.emplace_back(*this); return lines; } explicit operator Lines() const { Lines lines; lines.emplace_back(*this); return lines; }
void scale(double factor) { this->a *= factor; this->b *= factor; } void scale(double factor) { this->a *= factor; this->b *= factor; }

View File

@ -297,6 +297,44 @@ std::pair<int, Point> foot_pt(const Points &polyline, const Point &pt)
return std::make_pair(int(it_proj - polyline.begin()) - 1, foot_pt_min); return std::make_pair(int(it_proj - polyline.begin()) - 1, foot_pt_min);
} }
size_t total_lines_count(const ThickPolylines &thick_polylines) {
size_t lines_cnt = 0;
for (const ThickPolyline &thick_polyline : thick_polylines) {
if (thick_polyline.points.size() > 1) {
lines_cnt += thick_polyline.points.size() - 1;
}
}
return lines_cnt;
}
Lines to_lines(const ThickPolyline &thick_polyline) {
Lines lines;
if (thick_polyline.points.size() >= 2) {
lines.reserve(thick_polyline.points.size() - 1);
for (Points::const_iterator it = thick_polyline.points.begin(); it != thick_polyline.points.end() - 1; ++it) {
lines.emplace_back(*it, *(it + 1));
}
}
return lines;
}
Lines to_lines(const ThickPolylines &thick_polylines) {
const size_t lines_cnt = total_lines_count(thick_polylines);
Lines lines;
lines.reserve(lines_cnt);
for (const ThickPolyline &thick_polyline : thick_polylines) {
for (Points::const_iterator it = thick_polyline.points.begin(); it != thick_polyline.points.end() - 1; ++it) {
lines.emplace_back(*it, *(it + 1));
}
}
return lines;
}
ThickLines ThickPolyline::thicklines() const ThickLines ThickPolyline::thicklines() const
{ {
ThickLines lines; ThickLines lines;

View File

@ -119,30 +119,40 @@ inline double total_length(const Polylines &polylines) {
return total; return total;
} }
inline Lines to_lines(const Polyline &poly) inline size_t total_lines_count(const Polylines &polylines) {
{ size_t lines_cnt = 0;
for (const Polyline &polyline : polylines) {
if (polyline.points.size() > 1) {
lines_cnt += polyline.points.size() - 1;
}
}
return lines_cnt;
}
inline Lines to_lines(const Polyline &poly) {
Lines lines; Lines lines;
if (poly.points.size() >= 2) { if (poly.points.size() >= 2) {
lines.reserve(poly.points.size() - 1); lines.reserve(poly.points.size() - 1);
for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it) for (Points::const_iterator it = poly.points.begin(); it != poly.points.end() - 1; ++it) {
lines.push_back(Line(*it, *(it + 1))); lines.emplace_back(*it, *(it + 1));
}
} }
return lines; return lines;
} }
inline Lines to_lines(const Polylines &polys) inline Lines to_lines(const Polylines &polylines) {
{ const size_t lines_cnt = total_lines_count(polylines);
size_t n_lines = 0;
for (size_t i = 0; i < polys.size(); ++ i)
if (polys[i].points.size() > 1)
n_lines += polys[i].points.size() - 1;
Lines lines; Lines lines;
lines.reserve(n_lines); lines.reserve(lines_cnt);
for (size_t i = 0; i < polys.size(); ++ i) { for (const Polyline &polyline : polylines) {
const Polyline &poly = polys[i]; for (Points::const_iterator it = polyline.points.begin(); it != polyline.points.end() - 1; ++it) {
for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it) lines.emplace_back(*it, *(it + 1));
lines.push_back(Line(*it, *(it + 1))); }
} }
return lines; return lines;
} }
@ -251,6 +261,11 @@ inline ThickPolylines to_thick_polylines(Polylines &&polylines, const coordf_t w
return out; return out;
} }
size_t total_lines_count(const ThickPolylines &thick_polylines);
Lines to_lines(const ThickPolyline &thick_polyline);
Lines to_lines(const ThickPolylines &thick_polylines);
class Polyline3 : public MultiPoint3 class Polyline3 : public MultiPoint3
{ {
public: public: