Implement basic mesh functions
This commit is contained in:
parent
ba7245eeea
commit
a1347434e7
3 changed files with 64 additions and 2 deletions
29
Mesh.cpp
29
Mesh.cpp
|
@ -1,3 +1,30 @@
|
||||||
#include "Mesh.h"
|
#include "Mesh.hpp"
|
||||||
|
|
||||||
|
Mesh::Mesh()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Mesh::add_vertice(const Point& pt) {
|
||||||
|
// Does the vertice already exists?
|
||||||
|
if (rev_vertices.find(pt) != rev_vertices.end())
|
||||||
|
return rev_vertices.find(pt)->second;
|
||||||
|
|
||||||
|
vertices.push_back(pt);
|
||||||
|
rev_vertices.insert(std::make_pair(pt, vertices.size() - 1));
|
||||||
|
return vertices.size() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::add_face(const Face& face) {
|
||||||
|
faces.push_back(face);
|
||||||
|
}
|
||||||
|
void Mesh::add_face(size_t f1, size_t f2, size_t f3) {
|
||||||
|
add_face(Face(f1, f2, f3));
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<Point>& Mesh::get_vertices() const {
|
||||||
|
return vertices;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<Face>& Mesh::get_faces() const {
|
||||||
|
return faces;
|
||||||
|
}
|
||||||
|
|
3
Mesh.hpp
3
Mesh.hpp
|
@ -3,6 +3,8 @@
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <cstddef> // size_t
|
||||||
#include "common_structures.hpp"
|
#include "common_structures.hpp"
|
||||||
|
|
||||||
class Mesh {
|
class Mesh {
|
||||||
|
@ -24,5 +26,6 @@ class Mesh {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Point> vertices;
|
std::vector<Point> vertices;
|
||||||
|
std::unordered_map<Point, size_t> rev_vertices;
|
||||||
std::vector<Face> faces;
|
std::vector<Face> faces;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,13 +2,45 @@
|
||||||
* Defines a few widely used, widely spread structures. Imported pervasively.
|
* Defines a few widely used, widely spread structures. Imported pervasively.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
#include <functional> // Hash
|
||||||
|
|
||||||
struct Point {
|
struct Point {
|
||||||
|
Point(double x, double y, double z) : x(x), y(y), z(z) {}
|
||||||
double x, y, z;
|
double x, y, z;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Face {
|
struct Face {
|
||||||
|
Face(int v0, int v1, int v2) {
|
||||||
|
vert[0] = v0;
|
||||||
|
vert[1] = v1;
|
||||||
|
vert[2] = v2;
|
||||||
|
}
|
||||||
int vert[3];
|
int vert[3];
|
||||||
int operator[](unsigned i) {
|
int operator[](unsigned i) const {
|
||||||
return vert[i % 3]; // dodge errors
|
return vert[i % 3]; // dodge errors
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
template<> struct hash<Point> { typedef Point argument_type;
|
||||||
|
typedef std::size_t result_type;
|
||||||
|
result_type operator()(const argument_type& pt) const noexcept {
|
||||||
|
return (hash<double>()(pt.x) << 2)
|
||||||
|
^ (hash<double>()(pt.y) << 1)
|
||||||
|
^ hash<double>()(pt.z);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct hash<Face>
|
||||||
|
{
|
||||||
|
typedef Face argument_type;
|
||||||
|
typedef std::size_t result_type;
|
||||||
|
result_type operator()(argument_type const& s) const noexcept
|
||||||
|
{
|
||||||
|
result_type const h1 ( std::hash<int>{}(s[0]) );
|
||||||
|
result_type const h2 ( std::hash<int>{}(s[1]) );
|
||||||
|
result_type const h3 ( std::hash<int>{}(s[2]) );
|
||||||
|
return h1 ^ h2 ^ h3;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue