Added holes to my tape.

This commit is contained in:
Edward R. Gonzalez 2020-04-06 20:09:57 -04:00
parent 3bda314253
commit b0b228d613
2 changed files with 160 additions and 10 deletions

View File

@ -1,5 +1,8 @@
#pragma once #pragma once
#include "DGL/DGL.hpp" #include "DGL/DGL.hpp"
#include "Cpp_Alias.hpp" #include "Cpp_Alias.hpp"
@ -11,19 +14,100 @@ namespace Execution
inline namespace LibraryReferences inline namespace LibraryReferences
{ {
using DGL::HE_Model; using DGL::HE_Model;
using OMeshInterface::OMesh_HE;
}
bool Float64_ApproxEqual(double _first, double _second)
{
//Implementation influenced by: https://floating-point-gui.de/errors/comparison/, https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
double firstAbs = fabsl(_first ),
secondAbs = fabsl(_second ),
diffAbs = fabsl(_first - _second) ;
bool ExactlyEqual,
CloseToZero ;
ExactlyEqual = (_first == _second );
CloseToZero = (_first == 0 || _second == 0 || diffAbs < DBL_MIN);
if (ExactlyEqual) //Handles infinites
{
return true;
}
else if (CloseToZero) //Close to zero
{
return (diffAbs < (DBL_EPSILON * DBL_EPSILON));
}
else //Relative Error
{
return (diffAbs / fminl(firstAbs + secondAbs, DBL_MAX) < DBL_EPSILON);
}
}
void VerifyMesh(string _filePathForMesh, int genus)
{
cout << "Verifying: " << _filePathForMesh << endl;
OMesh_HE mesh;
mesh.Load(_filePathForMesh);
// Euler Number:
int eulerNumLeft = mesh.GetVerticies().size() + mesh.GetFaces().size() - mesh.GetEdges().size();
cout << "Left Side Value: " << eulerNumLeft << endl;
int eulerNumRight = 2 - 2 * genus;
cout << "Right Side Value: " << eulerNumRight << endl << endl;
// Gauss Curvatures:
cout << "Calculating Discrete Gauss Curvatures..." << endl;
double curvatureByVertex = mesh.GetGuassianCurvature_Discretely();
cout << "Curvature by Vertex: " << curvatureByVertex << endl;
double curvatureByEuler = 2 * OMeshInterface::PI() * eulerNumRight;
cout << "Curvature by Euler : " << curvatureByEuler << endl << endl;
if (eulerNumRight == eulerNumLeft && Float64_ApproxEqual(curvatureByVertex, curvatureByEuler))
{
cout << _filePathForMesh << " is valid." << endl << endl;;
}
else
{
cout << _filePathForMesh << " is invalid." << endl << endl;;
}
} }
int Execute_Assignment2() int Execute_Assignment2()
{ {
cout << "Assignment 2:" << endl << endl; cout << "Assignment 2: Mesh operations" << endl << endl;
HE_Model BlenderTorus("./Models/torus_Blender.obj"); VerifyMesh("./Models/bunny.obj", 0);
BlenderTorus.Load(); VerifyMesh("./Models/eight.obj", 2);
VerifyMesh("./Models/gargoyle.obj", 0);
VerifyMesh("./Models/hand.obj", 1);
VerifyMesh("./Models/horse.obj", 0);
VerifyMesh("./Models/sculpture.obj", 3);
VerifyMesh("./Models/topology.obj", 13);
VerifyMesh("./Models/torus.obj", 1);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
#include <math.h>
// DGL // DGL
#include "DGL/DGL_Types.hpp" #include "DGL/DGL_Types.hpp"
@ -46,10 +48,14 @@ namespace OMeshInterface
using FaceHandles = vector<FaceHandle >; using FaceHandles = vector<FaceHandle >;
using HalfEdgeHandles = vector<HalfEdgeHandle>; using HalfEdgeHandles = vector<HalfEdgeHandle>;
using VertHandles = vector<VertexHandle >; using VertHandles = vector<VertexHandle >;
using std::atan;
} }
double PI()
{
return std::atan(1) * 4;
}
class OMesh_HE class OMesh_HE
{ {
@ -88,7 +94,7 @@ namespace OMeshInterface
GenerateVertexList (); GenerateVertexList ();
GenerateVertexNormalList(); GenerateVertexNormalList();
GenerateFaceNormalList (); GenerateFaceNormalList ();
GenerateVertexEdgeList (); GenerateEdgeList ();
GenerateFaceList (); GenerateFaceList ();
return; return;
@ -104,7 +110,7 @@ namespace OMeshInterface
return vertNormals; return vertNormals;
} }
const EdgeList& GetVertEdges() const const EdgeList& GetEdges() const
{ {
return edges; return edges;
} }
@ -119,6 +125,62 @@ namespace OMeshInterface
return faceNormals; return faceNormals;
} }
const int GetGenus() const
{
}
void GetInteriorAngle()
{
}
const double GetGuassianCurvature_Discretely()
{
double result = 2 * PI();
using FAngleList = vector<float>;
using AngleList = vector<double>;
AngleList vertAngleSumList;
for (HE_Mesh::VertexIter vertElem = oMeshObj.vertices_begin(); vertElem != oMeshObj.vertices_end(); vertElem++)
{
using OutgoingEdgeIter = HE_Mesh::VertexOHalfedgeIter;
FAngleList interiorAngles;
double sumOfAngles = 0.0;
for (OutgoingEdgeIter oEdgeElem = oMeshObj.voh_begin(*vertElem); oEdgeElem != oMeshObj.voh_end(*vertElem); oEdgeElem++)
{
/*OutgoingEdgeIter next = oEdgeElem; next++;
if (next == oMeshObj.voh_end(*vertElem))
{
continue;
}*/
float angle = oMeshObj.calc_sector_angle(*oEdgeElem);
angle *= PI() / 180.0; // To Radians
interiorAngles.push_back(angle);
sumOfAngles += angle;
}
vertAngleSumList.push_back(sumOfAngles);
result -= sumOfAngles;
}
return result;
}
protected: protected:
void GenerateVertexList() void GenerateVertexList()
@ -161,11 +223,11 @@ namespace OMeshInterface
} }
} }
void GenerateVertexEdgeList() void GenerateEdgeList()
{ {
using EdgeIter = HE_Mesh::EdgeIter; using EdgeIter = HE_Mesh::EdgeIter;
for (EdgeIter element = oMeshObj.edges_begin(); element != oMeshObj.edges_begin(); element++) for (EdgeIter element = oMeshObj.edges_begin(); element != oMeshObj.edges_end(); element++)
{ {
using OEdge = decltype(oMeshObj.edge(*element)); using OEdge = decltype(oMeshObj.edge(*element));
@ -203,6 +265,10 @@ namespace OMeshInterface
VertexList verticies ; VertexList verticies ;
VertexList vertNormals; VertexList vertNormals;
VertexList faceNormals; VertexList faceNormals;
HalfEdgeHandles LeftHandles ;
HalfEdgeHandles RightHandles;
EdgeList edges ; EdgeList edges ;
FaceList faces ; FaceList faces ;
}; };