Ported TriangleMesh::scale_xyz()

This commit is contained in:
Alessandro Ranellucci 2013-09-09 23:38:49 +02:00
parent 5e34a9cf21
commit 9b12d6037a
7 changed files with 45 additions and 17 deletions

View file

@ -126,6 +126,15 @@ void TriangleMesh::scale(float factor)
stl_scale(&(this->stl), factor);
}
void TriangleMesh::scale(std::vector<double> versor)
{
float fversor[3];
fversor[0] = versor[0];
fversor[1] = versor[1];
fversor[2] = versor[2];
stl_scale(&this->stl, fversor);
}
void TriangleMesh::translate(float x, float y, float z)
{
stl_translate(&(this->stl), x, y, z);

View file

@ -23,6 +23,7 @@ class TriangleMesh
void repair();
void WriteOBJFile(char* output_file);
void scale(float factor);
void scale(std::vector<double> versor);
void translate(float x, float y, float z);
void align_to_origin();
void rotate(double angle, Point* center);

View file

@ -155,6 +155,7 @@ extern void stl_fix_normal_directions(stl_file *stl);
extern void stl_fix_normal_values(stl_file *stl);
extern void stl_reverse_all_facets(stl_file *stl);
extern void stl_translate(stl_file *stl, float x, float y, float z);
extern void stl_scale(stl_file *stl, float versor[3]);
extern void stl_scale(stl_file *stl, float factor);
extern void stl_rotate_x(stl_file *stl, float angle);
extern void stl_rotate_y(stl_file *stl, float angle);

View file

@ -102,42 +102,52 @@ stl_translate(stl_file *stl, float x, float y, float z)
}
void
stl_scale(stl_file *stl, float factor)
stl_scale(stl_file *stl, float versor[3])
{
int i;
int j;
// scale extents
stl->stats.min.x *= factor;
stl->stats.min.y *= factor;
stl->stats.min.z *= factor;
stl->stats.max.x *= factor;
stl->stats.max.y *= factor;
stl->stats.max.z *= factor;
stl->stats.min.x *= versor[0];
stl->stats.min.y *= versor[1];
stl->stats.min.z *= versor[2];
stl->stats.max.x *= versor[0];
stl->stats.max.y *= versor[1];
stl->stats.max.z *= versor[2];
// scale size
stl->stats.size.x *= factor;
stl->stats.size.y *= factor;
stl->stats.size.z *= factor;
stl->stats.size.x *= versor[0];
stl->stats.size.y *= versor[1];
stl->stats.size.z *= versor[2];
// scale volume
if (stl->stats.volume > 0.0) {
stl->stats.volume *= (factor * factor * factor);
stl->stats.volume *= (versor[0] * versor[1] * versor[2]);
}
for(i = 0; i < stl->stats.number_of_facets; i++)
{
for(j = 0; j < 3; j++)
{
stl->facet_start[i].vertex[j].x *= factor;
stl->facet_start[i].vertex[j].y *= factor;
stl->facet_start[i].vertex[j].z *= factor;
stl->facet_start[i].vertex[j].x *= versor[0];
stl->facet_start[i].vertex[j].y *= versor[1];
stl->facet_start[i].vertex[j].z *= versor[2];
}
}
stl_invalidate_shared_vertices(stl);
}
void
stl_scale(stl_file *stl, float factor)
{
float versor[3];
versor[0] = factor;
versor[1] = factor;
versor[2] = factor;
stl_scale(stl, versor);
}
static void calculate_normals(stl_file *stl)
{
long i;