mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-07-27 18:52:00 +08:00
parent
6071cd72ec
commit
e8ccb9e104
@ -265,7 +265,7 @@ std::vector<Point> MultiPoint::_douglas_peucker_plus(const std::vector<Point>& p
|
|||||||
{
|
{
|
||||||
std::vector<Point> result_pts;
|
std::vector<Point> result_pts;
|
||||||
std::vector<size_t> result_idx;
|
std::vector<size_t> result_idx;
|
||||||
double tolerance_sq = tolerance * tolerance;
|
const double tolerance_sq = tolerance * tolerance;
|
||||||
if (!pts.empty()) {
|
if (!pts.empty()) {
|
||||||
const Point* anchor = &pts.front();
|
const Point* anchor = &pts.front();
|
||||||
size_t anchor_idx = 0;
|
size_t anchor_idx = 0;
|
||||||
@ -314,9 +314,9 @@ std::vector<Point> MultiPoint::_douglas_peucker_plus(const std::vector<Point>& p
|
|||||||
|
|
||||||
//TODO use linked list if needed.
|
//TODO use linked list if needed.
|
||||||
// add other points that are at not less than min_length dist of the other points.
|
// add other points that are at not less than min_length dist of the other points.
|
||||||
std::vector<double> distances;
|
//std::vector<double> distances;
|
||||||
for (size_t segment_idx = 0; segment_idx < result_idx.size()-1; segment_idx++) {
|
for (size_t segment_idx = 0; segment_idx < result_idx.size()-1; segment_idx++) {
|
||||||
distances.clear();
|
//distances.clear();
|
||||||
size_t start_idx = result_idx[segment_idx];
|
size_t start_idx = result_idx[segment_idx];
|
||||||
size_t end_idx = result_idx[segment_idx + 1];
|
size_t end_idx = result_idx[segment_idx + 1];
|
||||||
if (end_idx - start_idx == 1) continue;
|
if (end_idx - start_idx == 1) continue;
|
||||||
@ -324,57 +324,63 @@ std::vector<Point> MultiPoint::_douglas_peucker_plus(const std::vector<Point>& p
|
|||||||
double sum = 0;
|
double sum = 0;
|
||||||
for (size_t i = start_idx; i < end_idx; i++) {
|
for (size_t i = start_idx; i < end_idx; i++) {
|
||||||
double dist = pts[i].distance_to(pts[i + 1]);
|
double dist = pts[i].distance_to(pts[i + 1]);
|
||||||
distances.push_back(dist);
|
//distances.push_back(dist);
|
||||||
sum += dist;
|
sum += dist;
|
||||||
}
|
}
|
||||||
if (sum < min_length * 2) continue;
|
if (sum < min_length * 2) continue;
|
||||||
//if there are too many points and dist, then choose a more difficult sections of ~min_length * 2-4, where we will at least one
|
//if there are too many points and dist, then choose a more difficult sections of ~min_length * 2-4, where we will at least one
|
||||||
if (sum > min_length * 4) {
|
//if (sum > min_length * 4) {
|
||||||
//check what is the last index possible
|
// //check what is the last index possible
|
||||||
double current_sum = 0;
|
// double current_sum = 0;
|
||||||
size_t last_possible_idx = end_idx;
|
// size_t last_possible_idx = end_idx;
|
||||||
while (current_sum < min_length * 2) {
|
// while (current_sum < min_length * 2) {
|
||||||
last_possible_idx--;
|
// last_possible_idx--;
|
||||||
current_sum += distances[last_possible_idx - start_idx];
|
// current_sum += distances[last_possible_idx - start_idx];
|
||||||
}
|
// }
|
||||||
|
|
||||||
//find the new end point
|
// //find the new end point
|
||||||
current_sum = 0;
|
// current_sum = 0;
|
||||||
size_t current_idx = start_idx;
|
// size_t current_idx = start_idx;
|
||||||
while (current_sum < min_length * 4 && current_idx < last_possible_idx){
|
// while (current_sum < min_length * 4 && current_idx < last_possible_idx){
|
||||||
current_sum += distances[current_idx - start_idx];
|
// current_sum += distances[current_idx - start_idx];
|
||||||
current_idx ++;
|
// current_idx ++;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// last check, to see if the points are well distributed enough.
|
// // last check, to see if the points are well distributed enough.
|
||||||
if (current_sum > min_length * 2 && current_idx > start_idx + 1) {
|
// if (current_sum > min_length * 2 && current_idx > start_idx + 1) {
|
||||||
//set new end
|
// //set new end
|
||||||
sum = current_sum;
|
// sum = current_sum;
|
||||||
end_idx = current_idx;
|
// end_idx = current_idx;
|
||||||
result_idx.insert(result_idx.begin() + segment_idx + 1, end_idx);
|
// result_idx.insert(result_idx.begin() + segment_idx + 1, end_idx);
|
||||||
result_pts.insert(result_pts.begin() + segment_idx + 1, pts[end_idx]);
|
// result_pts.insert(result_pts.begin() + segment_idx + 1, pts[end_idx]);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
Point* start_point = &result_pts[segment_idx];
|
Point* start_point = &result_pts[segment_idx];
|
||||||
Point* end_point = &result_pts[segment_idx + 1];
|
Point* end_point = &result_pts[segment_idx + 1];
|
||||||
|
|
||||||
//use at least a point, even if it's not in the middle and sum ~= min_length * 2
|
//use at least a point, even if it's not in the middle and sum ~= min_length * 2
|
||||||
double max_dist_sq = 0.0;
|
double max_dist_sq = 0.0;
|
||||||
size_t furthest_idx = start_idx + 1;
|
size_t furthest_idx = start_idx;
|
||||||
|
const double half_min_length_sq = min_length * min_length / 4;
|
||||||
// find point furthest from line seg created by (anchor, floater) and note it
|
// find point furthest from line seg created by (anchor, floater) and note it
|
||||||
for (size_t i = start_idx + 1; i < end_idx; ++i) {
|
for (size_t i = start_idx + 1; i < end_idx; ++i) {
|
||||||
|
if (start_point->distance_to_square(pts[i]) > half_min_length_sq && end_point->distance_to_square(pts[i]) > half_min_length_sq) {
|
||||||
double dist_sq = Line::distance_to_squared(pts[i], *start_point, *end_point);
|
double dist_sq = Line::distance_to_squared(pts[i], *start_point, *end_point);
|
||||||
if (dist_sq > max_dist_sq) {
|
if (dist_sq > max_dist_sq) {
|
||||||
max_dist_sq = dist_sq;
|
max_dist_sq = dist_sq;
|
||||||
furthest_idx = i;
|
furthest_idx = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//add this point and skip it
|
if (furthest_idx > start_idx) {
|
||||||
|
//add this point
|
||||||
result_idx.insert(result_idx.begin() + segment_idx + 1, furthest_idx);
|
result_idx.insert(result_idx.begin() + segment_idx + 1, furthest_idx);
|
||||||
result_pts.insert(result_pts.begin() + segment_idx + 1, pts[furthest_idx]);
|
result_pts.insert(result_pts.begin() + segment_idx + 1, pts[furthest_idx]);
|
||||||
segment_idx++;
|
//and retry to simplify it
|
||||||
|
segment_idx--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user