From: Matt Keeter Date: Sat, 8 Mar 2014 21:47:51 +0000 (-0800) Subject: Reinstate min/max methods X-Git-Tag: v0.9.0~32^2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=cef3c92b1192c18f7aeffdbedc610628fa03a659;p=fstl Reinstate min/max methods --- diff --git a/src/canvas.cpp b/src/canvas.cpp index a5509c0..39081b0 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -23,7 +23,6 @@ Canvas::~Canvas() void Canvas::load_mesh(Mesh* m) { mesh = new GLMesh(m); - /* center = QVector3D(m->xmin() + m->xmax(), m->ymin() + m->ymax(), m->zmin() + m->zmax()) / 2; @@ -31,7 +30,6 @@ void Canvas::load_mesh(Mesh* m) pow(m->xmax() - m->xmin(), 2) + pow(m->ymax() - m->ymin(), 2) + pow(m->zmax() - m->zmin(), 2)); - */ update(); delete m; diff --git a/src/mesh.cpp b/src/mesh.cpp index 3a97120..36ad10e 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -3,9 +3,39 @@ #include #include +#include #include "mesh.h" +//////////////////////////////////////////////////////////////////////////////// + +Mesh::Mesh(std::vector v, std::vector i) + : vertices(v), indices(i) +{ + // Nothing to do here +} + +float Mesh::min(size_t start) const +{ + float v = vertices[start]; + for (size_t i=start; i < vertices.size(); i += 3) + { + v = fmin(v, vertices[i]); + } + return v; +} + +float Mesh::max(size_t start) const +{ + float v = vertices[start]; + for (size_t i=start; i < vertices.size(); i += 3) + { + v = fmax(v, vertices[i]); + } + return v; +} +//////////////////////////////////////////////////////////////////////////////// + struct Vec3 { GLfloat x, y, z; @@ -22,12 +52,9 @@ struct Vec3 } }; +typedef std::pair Vec3i; -Mesh::Mesh(std::vector v, std::vector i) - : vertices(v), indices(i) -{ - // Nothing to do here -} +//////////////////////////////////////////////////////////////////////////////// Mesh* Mesh::load_stl(const QString& filename) { @@ -46,7 +73,7 @@ Mesh* Mesh::load_stl(const QString& filename) data >> tri_count; // Extract vertices into an array of xyz, unsigned pairs - QVector> verts(tri_count*3); + QVector verts(tri_count*3); // Store vertices in the array, processing one triangle at a time. for (auto v=verts.begin(); v != verts.end(); v += 3) @@ -89,15 +116,16 @@ Mesh* Mesh::load_stl(const QString& filename) } indices[v.second] = vertex_count - 1; } + verts.resize(vertex_count); - // Finally, pack unique vertices into a flat array. - std::vector unique_verts(vertex_count*3); - for (size_t i=0; i < vertex_count; ++i) + std::vector flat_verts; + flat_verts.reserve(vertex_count*3); + for (auto v : verts) { - unique_verts[3*i] = verts[i].first.x; - unique_verts[3*i + 1] = verts[i].first.y; - unique_verts[3*i + 2] = verts[i].first.z; + flat_verts.push_back(v.first.x); + flat_verts.push_back(v.first.y); + flat_verts.push_back(v.first.z); } - return new Mesh(unique_verts, indices); + return new Mesh(flat_verts, indices); } diff --git a/src/mesh.h b/src/mesh.h index f8da3e3..f83a477 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -11,14 +11,17 @@ class Mesh public: Mesh(std::vector vertices, std::vector indices); static Mesh* load_stl(const QString& filename); -/* - float xmin() const { return vertices.row(0).minCoeff(); } - float xmax() const { return vertices.row(0).maxCoeff(); } - float ymin() const { return vertices.row(1).minCoeff(); } - float ymax() const { return vertices.row(1).maxCoeff(); } - float zmin() const { return vertices.row(2).minCoeff(); } - float zmax() const { return vertices.row(2).maxCoeff(); } -*/ + + float min(size_t start) const; + float max(size_t start) const; + + float xmin() const { return min(0); } + float ymin() const { return min(1); } + float zmin() const { return min(2); } + float xmax() const { return max(0); } + float ymax() const { return max(1); } + float zmax() const { return max(2); } + private: std::vector vertices; std::vector indices;