TriangleMesh::slice() now accepts a vector of floats instead of doubles for consistency with mesh coordinates
This commit is contained in:
parent
69f1f65a8b
commit
3637ca39df
@ -165,7 +165,7 @@ void TriangleMesh::rotate(double angle, Point* center)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers)
|
TriangleMesh::slice(const std::vector<float> &z, std::vector<Polygons>* layers)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
This method gets called with a list of unscaled Z coordinates and outputs
|
This method gets called with a list of unscaled Z coordinates and outputs
|
||||||
@ -190,6 +190,9 @@ TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers)
|
|||||||
At the end, we free the tables generated by analyze() as we don't
|
At the end, we free the tables generated by analyze() as we don't
|
||||||
need them anymore.
|
need them anymore.
|
||||||
FUTURE: parallelize slice_facet() and make_loops()
|
FUTURE: parallelize slice_facet() and make_loops()
|
||||||
|
|
||||||
|
NOTE: this method accepts a vector of floats because the mesh coordinate
|
||||||
|
type is float.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// build a table to map a facet_idx to its three edge indices
|
// build a table to map a facet_idx to its three edge indices
|
||||||
@ -256,8 +259,8 @@ TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers)
|
|||||||
stl_facet* facet = &this->stl.facet_start[facet_idx];
|
stl_facet* facet = &this->stl.facet_start[facet_idx];
|
||||||
|
|
||||||
// find facet extents
|
// find facet extents
|
||||||
double min_z = fminf(facet->vertex[0].z, fminf(facet->vertex[1].z, facet->vertex[2].z));
|
float min_z = fminf(facet->vertex[0].z, fminf(facet->vertex[1].z, facet->vertex[2].z));
|
||||||
double max_z = fmaxf(facet->vertex[0].z, fmaxf(facet->vertex[1].z, facet->vertex[2].z));
|
float max_z = fmaxf(facet->vertex[0].z, fmaxf(facet->vertex[1].z, facet->vertex[2].z));
|
||||||
|
|
||||||
#ifdef SLIC3R_DEBUG
|
#ifdef SLIC3R_DEBUG
|
||||||
printf("\n==> FACET %d (%f,%f,%f - %f,%f,%f - %f,%f,%f):\n", facet_idx,
|
printf("\n==> FACET %d (%f,%f,%f - %f,%f,%f - %f,%f,%f):\n", facet_idx,
|
||||||
@ -275,16 +278,16 @@ TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// find layer extents
|
// find layer extents
|
||||||
std::vector<double>::const_iterator min_layer, max_layer;
|
std::vector<float>::const_iterator min_layer, max_layer;
|
||||||
min_layer = std::lower_bound(z.begin(), z.end(), min_z - EPSILON); // first layer whose slice_z is >= min_z
|
min_layer = std::lower_bound(z.begin(), z.end(), min_z); // first layer whose slice_z is >= min_z
|
||||||
max_layer = std::upper_bound(z.begin() + (min_layer - z.begin()), z.end(), max_z + EPSILON) - 1; // last layer whose slice_z is <= max_z
|
max_layer = std::upper_bound(z.begin() + (min_layer - z.begin()), z.end(), max_z) - 1; // last layer whose slice_z is <= max_z
|
||||||
#ifdef SLIC3R_DEBUG
|
#ifdef SLIC3R_DEBUG
|
||||||
printf("layers: min = %d, max = %d\n", (int)(min_layer - z.begin()), (int)(max_layer - z.begin()));
|
printf("layers: min = %d, max = %d\n", (int)(min_layer - z.begin()), (int)(max_layer - z.begin()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (std::vector<double>::const_iterator it = min_layer; it != max_layer + 1; ++it) {
|
for (std::vector<float>::const_iterator it = min_layer; it != max_layer + 1; ++it) {
|
||||||
std::vector<double>::size_type layer_idx = it - z.begin();
|
std::vector<float>::size_type layer_idx = it - z.begin();
|
||||||
double slice_z = *it / SCALING_FACTOR;
|
float slice_z = *it / SCALING_FACTOR;
|
||||||
std::vector<IntersectionPoint> points;
|
std::vector<IntersectionPoint> points;
|
||||||
std::vector< std::vector<IntersectionPoint>::size_type > points_on_layer;
|
std::vector< std::vector<IntersectionPoint>::size_type > points_on_layer;
|
||||||
bool found_horizontal_edge = false;
|
bool found_horizontal_edge = false;
|
||||||
@ -521,7 +524,7 @@ class _area_comp {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
TriangleMesh::slice(const std::vector<double> &z, std::vector<ExPolygons>* layers)
|
TriangleMesh::slice(const std::vector<float> &z, std::vector<ExPolygons>* layers)
|
||||||
{
|
{
|
||||||
std::vector<Polygons> layers_p;
|
std::vector<Polygons> layers_p;
|
||||||
this->slice(z, &layers_p);
|
this->slice(z, &layers_p);
|
||||||
|
@ -30,8 +30,8 @@ class TriangleMesh
|
|||||||
void translate(float x, float y, float z);
|
void translate(float x, float y, float z);
|
||||||
void align_to_origin();
|
void align_to_origin();
|
||||||
void rotate(double angle, Point* center);
|
void rotate(double angle, Point* center);
|
||||||
void slice(const std::vector<double> &z, std::vector<Polygons>* layers);
|
void slice(const std::vector<float> &z, std::vector<Polygons>* layers);
|
||||||
void slice(const std::vector<double> &z, std::vector<ExPolygons>* layers);
|
void slice(const std::vector<float> &z, std::vector<ExPolygons>* layers);
|
||||||
TriangleMeshPtrs split() const;
|
TriangleMeshPtrs split() const;
|
||||||
void merge(const TriangleMesh* mesh);
|
void merge(const TriangleMesh* mesh);
|
||||||
void horizontal_projection(ExPolygons &retval) const;
|
void horizontal_projection(ExPolygons &retval) const;
|
||||||
|
@ -23,6 +23,7 @@ extern "C" {
|
|||||||
#define PI 3.141592653589793238
|
#define PI 3.141592653589793238
|
||||||
#define scale_(val) (val / SCALING_FACTOR)
|
#define scale_(val) (val / SCALING_FACTOR)
|
||||||
#define unscale(val) (val * SCALING_FACTOR)
|
#define unscale(val) (val * SCALING_FACTOR)
|
||||||
|
#define SCALED_EPSILON scale_(EPSILON)
|
||||||
typedef long coord_t;
|
typedef long coord_t;
|
||||||
typedef double coordf_t;
|
typedef double coordf_t;
|
||||||
|
|
||||||
|
@ -137,8 +137,12 @@ SV*
|
|||||||
TriangleMesh::slice(z)
|
TriangleMesh::slice(z)
|
||||||
std::vector<double>* z
|
std::vector<double>* z
|
||||||
CODE:
|
CODE:
|
||||||
|
// convert doubles to floats
|
||||||
|
std::vector<float> z_f(z->begin(), z->end());
|
||||||
|
delete z;
|
||||||
|
|
||||||
std::vector<ExPolygons> layers;
|
std::vector<ExPolygons> layers;
|
||||||
THIS->slice(*z, &layers);
|
THIS->slice(z_f, &layers);
|
||||||
|
|
||||||
AV* layers_av = newAV();
|
AV* layers_av = newAV();
|
||||||
av_extend(layers_av, layers.size()-1);
|
av_extend(layers_av, layers.size()-1);
|
||||||
|
Loading…
Reference in New Issue
Block a user