CGI/exercise4/include/Triangle.h
2018-11-13 09:22:16 +01:00

48 lines
2 KiB
C++

// This source code is property of the Computer Graphics and Visualization
// chair of the TU Dresden. Do not distribute!
// Copyright (C) CGV TU Dresden - All Rights Reserved
#pragma once
#include "Box.h"
#include "util/OpenMeshUtils.h"
/*
a triangle primitive which can be used with the AABBTree and the HashGrid data structure
*/
class Triangle
{
//internal storage of the first vertex position of the triangle
Eigen::Vector3f v0;
//internal storage of the second vertex position of the triangle
Eigen::Vector3f v1;
//internal storage of the third vertex position of the triangle
Eigen::Vector3f v2;
//internal storage of the optional face handle to identify the originating face in a half edge mesh instance
OpenMesh::FaceHandle h;
public:
//default constructor
Triangle();
//constructs a triangle using the vertex positions v0,v1 and v2
Triangle(const Eigen::Vector3f& v0, const Eigen::Vector3f& v1,const Eigen::Vector3f& v2);
//constructs a triangle from the face f of the given halfedge mesh m
Triangle(const HEMesh&m, const OpenMesh::FaceHandle& f);
//returns the axis aligned bounding box of the triangle
Box ComputeBounds() const;
//returns true if the triangle overlaps the given box b
bool Overlaps(const Box& b) const;
//returns the barycentric coordinates of the point with thesmallest distance to point p which lies on the triangle
void ClosestPointBarycentric(const Eigen::Vector3f& p, float& l0, float& l1, float& l2) const;
//returns the point with smallest distance to point p which lies on the triangle
Eigen::Vector3f ClosestPoint(const Eigen::Vector3f& p) const;
//returns the squared distance between point p and the triangle
float SqrDistance(const Eigen::Vector3f& p) const;
//returns the euclidean distance between point p and the triangle
float Distance(const Eigen::Vector3f& p) const;
//returns a reference point which is on the triangle and is used to sort the primitive in the AABB tree construction
Eigen::Vector3f ReferencePoint() const;
};