51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
|
#pragma once
|
||
|
|
||
|
#include <cgv/math/vec.h>
|
||
|
|
||
|
namespace cgv {
|
||
|
namespace media {
|
||
|
|
||
|
/**
|
||
|
* A plane of arbitrary dimension stored as a homogeneous vector that
|
||
|
defines the coefficients of the plane equation.
|
||
|
*/
|
||
|
template <class T>
|
||
|
class plane
|
||
|
{
|
||
|
public:
|
||
|
cgv::math::vec<T> h;
|
||
|
/// construct plane of give dimension allocating a homogenous vector of one dimension mor
|
||
|
plane(int dim = 3)
|
||
|
{
|
||
|
h.resize(dim+1);
|
||
|
}
|
||
|
/// construct from normal vector and distance of plane to origin, which
|
||
|
/// is negated before it is copied to the last component of the stored
|
||
|
/// homogenous vector
|
||
|
plane(const cgv::math::vec<T> &n, const T &distance)
|
||
|
{
|
||
|
h.resize(n.size()+1);
|
||
|
for (unsigned int i=0; i<n.size(); ++i)
|
||
|
h(i) = n(i);
|
||
|
h(n.size()) = -distance;
|
||
|
}
|
||
|
/// return the normal vector
|
||
|
cgv::math::vec<T> get_normal() const
|
||
|
{
|
||
|
cgv::math::vec<T> n;
|
||
|
n.resize(h.size()-1);
|
||
|
for (unsigned int i=0; i<n.size(); ++i)
|
||
|
n(i) = h(i);
|
||
|
return n;
|
||
|
}
|
||
|
/// return the distance of the plane to the origin
|
||
|
T get_distance() const
|
||
|
{
|
||
|
return -h(h.size()-1);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|