library of assembled shared sources

http://lass.cocamware.com

lass::prim::Triangle3D< T > Class Template Reference

A very simple 3D polygon :). More...

#include <triangle_3d.h>


Data Structures

struct  Rebind

Public Types

enum  { dimension = TPoint::dimension }
typedef Triangle3D< T > TSelf
typedef Point3D< T > TPoint
typedef Point3DH< T > TPointH
typedef TPoint::TVector TVector
typedef LineSegment3D< T > TLineSegment
typedef Plane3D< T, Cartesian,
Normalized
TPlane
typedef TPoint::TValue TValue
typedef TPoint::TParam TParam
typedef TPoint::TReference TReference
typedef TPoint::TConstReference TConstReference
typedef TPoint::TNumTraits TNumTraits

Public Member Functions

 Triangle3D ()
 constructs an empty triangle.
 Triangle3D (const TPoint &iA, const TPoint &iB, const TPoint &iC)
 Constructs a triangle through three points in positive sequence.
const TPointoperator[] (int iIndexOfVertex) const
TPointoperator[] (int iIndexOfVertex)
const TPointat (int iIndexOfVertex) const
TPointat (int iIndexOfVertex)
const TLineSegment edge (int iIndexOfTailVertex) const
const TVector vector (int iIndexOfTailVertex) const
const TPlane plane () const
const bool isEmpty () const
const int size () const
const TValue squaredArea () const
 returns squared area of triangle to avoid the square root.
const TValue area () const
const TValue perimeter () const
const TPointH vertexCentroid () const
const TPointH surfaceCentroid () const
const bool isSimple () const
const bool isConvex () const
const bool isReflex (int iIndexOfVertex) const

Private Types

enum  { size_ = 3 }

Private Member Functions

const bool isInRange (int iIndexOfVertex) const
 return if index of vertex is in range of the std::vector

Private Attributes

TPoint vertices_ [size_]

Related Functions

(Note that these are not member functions.)

template<typename T , class NP , class PP >
Result intersect (const Triangle3D< T > &triangle, const Ray3D< T, NP, PP > &ray, T &t, const T &tMin=T())
 Find the intersection of a ray and a triangle by their parameter t on the ray.
template<typename T , class NP , class PP >
Result intersect (const Triangle3D< T > &triangle, const Ray3D< T, NP, PP > &ray, T &u, T &v, T &t, const T &tMin=T())
 Find the intersection of a ray and a triangle by their parameter t on the ray and it's coordinates (u,v) on the triangle.
template<typename T >
io::XmlOStreamoperator<< (io::XmlOStream &ioOStream, const Triangle3D< T > &iTriangle)
template<typename T >
std::ostream & operator<< (std::ostream &ioOStream, const Triangle3D< T > &iTriangle)


Detailed Description

template<typename T>
class lass::prim::Triangle3D< T >

A very simple 3D polygon :).

Author:
Bram de Greve [BdG]

Definition at line 63 of file triangle_3d.h.


Member Typedef Documentation

template<typename T >
typedef Triangle3D<T> lass::prim::Triangle3D< T >::TSelf

Definition at line 67 of file triangle_3d.h.

template<typename T >
typedef Point3D<T> lass::prim::Triangle3D< T >::TPoint

Definition at line 69 of file triangle_3d.h.

template<typename T >
typedef Point3DH<T> lass::prim::Triangle3D< T >::TPointH

Definition at line 70 of file triangle_3d.h.

template<typename T >
typedef TPoint::TVector lass::prim::Triangle3D< T >::TVector

Definition at line 71 of file triangle_3d.h.

template<typename T >
typedef LineSegment3D<T> lass::prim::Triangle3D< T >::TLineSegment

Definition at line 72 of file triangle_3d.h.

template<typename T >
typedef Plane3D<T, Cartesian, Normalized> lass::prim::Triangle3D< T >::TPlane

Definition at line 73 of file triangle_3d.h.

template<typename T >
typedef TPoint::TValue lass::prim::Triangle3D< T >::TValue

Definition at line 75 of file triangle_3d.h.

template<typename T >
typedef TPoint::TParam lass::prim::Triangle3D< T >::TParam

Definition at line 76 of file triangle_3d.h.

template<typename T >
typedef TPoint::TReference lass::prim::Triangle3D< T >::TReference

Definition at line 77 of file triangle_3d.h.

template<typename T >
typedef TPoint::TConstReference lass::prim::Triangle3D< T >::TConstReference

Definition at line 78 of file triangle_3d.h.

template<typename T >
typedef TPoint::TNumTraits lass::prim::Triangle3D< T >::TNumTraits

Definition at line 79 of file triangle_3d.h.


Member Enumeration Documentation

template<typename T >
anonymous enum

Enumerator:
dimension 

Definition at line 81 of file triangle_3d.h.

template<typename T >
anonymous enum [private]

Enumerator:
size_ 

Definition at line 117 of file triangle_3d.h.


Constructor & Destructor Documentation

template<typename T >
lass::prim::Triangle3D< T >::Triangle3D (  )  [inline]

constructs an empty triangle.

all vertices are (0, 0) and thus equal.

Definition at line 60 of file triangle_3d.inl.

template<typename T >
lass::prim::Triangle3D< T >::Triangle3D ( const TPoint iA,
const TPoint iB,
const TPoint iC 
) [inline]

Constructs a triangle through three points in positive sequence.

Definition at line 69 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::vertices_.


Member Function Documentation

template<typename T >
const Triangle3D< T >::TPoint & lass::prim::Triangle3D< T >::operator[] ( int  iIndexOfVertex  )  const [inline]

return vertex of polygon by its index, not wrapped, no bounds check.

Definition at line 82 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::isInRange(), LASS_ASSERT, and lass::prim::Triangle3D< T >::vertices_.

template<typename T >
Triangle3D< T >::TPoint & lass::prim::Triangle3D< T >::operator[] ( int  iIndexOfVertex  )  [inline]

return vertex of polygon by its index, not wrapped, no bounds check.

Definition at line 94 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::isInRange(), LASS_ASSERT, and lass::prim::Triangle3D< T >::vertices_.

template<typename T >
const Triangle3D< T >::TPoint & lass::prim::Triangle3D< T >::at ( int  iIndexOfVertex  )  const [inline]

return vertex of polygon by its index, but wrap around the bounds.

this->at(-1) will return the same vertex as this->at(this->size() - 1);

Definition at line 106 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::isInRange(), LASS_ASSERT, lass::num::mod(), lass::prim::Triangle3D< T >::size_, and lass::prim::Triangle3D< T >::vertices_.

Referenced by lass::prim::Triangle3D< T >::edge(), and lass::prim::Triangle3D< T >::vector().

template<typename T >
Triangle3D< T >::TPoint & lass::prim::Triangle3D< T >::at ( int  iIndexOfVertex  )  [inline]

return vertex of polygon by its index, but wrap around the bounds.

this->at(-1) will return the same vertex as this->at(this->size() - 1);

Definition at line 119 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::isInRange(), LASS_ASSERT, lass::num::mod(), lass::prim::Triangle3D< T >::size_, and lass::prim::Triangle3D< T >::vertices_.

template<typename T >
const Triangle3D< T >::TLineSegment lass::prim::Triangle3D< T >::edge ( int  iIndexOfTailVertex  )  const [inline]

return the edge of the polygon between vertices at(iIndex) and at(iIndex + 1).

Definition at line 132 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::at().

template<typename T >
const Triangle3D< T >::TVector lass::prim::Triangle3D< T >::vector ( int  iIndexOfTailVertex  )  const [inline]

return the vector between vertices at(iIndex) and at(iIndex + 1)\

Definition at line 143 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::at().

template<typename T >
const Triangle3D< T >::TPlane lass::prim::Triangle3D< T >::plane (  )  const [inline]

return support plane of polygon.

Definition at line 154 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::vertices_.

template<typename T >
const bool lass::prim::Triangle3D< T >::isEmpty (  )  const [inline]

return true if polygon has no vertices

Triangle specific:
if all vertices are equal, we assume the triangle is empty

Definition at line 166 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::vertices_.

template<typename T >
const int lass::prim::Triangle3D< T >::size (  )  const [inline]

return number of vertices

Definition at line 176 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::size_.

template<typename T >
const Triangle3D< T >::TValue lass::prim::Triangle3D< T >::squaredArea (  )  const [inline]

returns squared area of triangle to avoid the square root.

Returns:
num::sqr(area()) but faster :)

Definition at line 188 of file triangle_3d.inl.

References lass::prim::cross(), LASS_ASSERT, lass::prim::Triangle3D< T >::size_, and lass::prim::Triangle3D< T >::vertices_.

Referenced by lass::prim::Triangle3D< T >::area().

template<typename T >
const Triangle3D< T >::TValue lass::prim::Triangle3D< T >::area (  )  const [inline]

return area of the polygons surface.

The area of a surface is the amount of material needed to "cover" it completely, Eric W. Weisstein. "Area." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Area.html

Definition at line 200 of file triangle_3d.inl.

References sqrt(), and lass::prim::Triangle3D< T >::squaredArea().

template<typename T >
const Triangle3D< T >::TValue lass::prim::Triangle3D< T >::perimeter (  )  const [inline]

return sum of the lengths of all edges

Definition at line 211 of file triangle_3d.inl.

References lass::prim::distance(), and lass::prim::Triangle3D< T >::vertices_.

template<typename T >
const Triangle3D< T >::TPointH lass::prim::Triangle3D< T >::vertexCentroid (  )  const [inline]

return the barycenter of all vertices.

The barycenter is the homogenous sum of all vertices.

Warning:
for non-convex polygons, it's NOT guaranteed that this center is inside the polygon.

Definition at line 224 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::vertices_.

Referenced by lass::prim::Triangle3D< T >::surfaceCentroid().

template<typename T >
const Triangle3D< T >::TPointH lass::prim::Triangle3D< T >::surfaceCentroid (  )  const [inline]

return the centroid of the filled polygon.

Eric W. Weisstein. "Geometric Centroid." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/GeometricCentroid.html

Algorithm:
comp.graphics.algorithms Frequently Asked Questions: Subject 2.02: "How can the centroid of a polygon be computed?" http://www.faqs.org/faqs/graphics/algorithms-faq/
Warning:
for non-convex polygons, it's NOT guaranteed that this center is inside the polygon.

Definition at line 236 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::vertexCentroid().

template<typename T >
const bool lass::prim::Triangle3D< T >::isSimple (  )  const [inline]

return true if polygon is simple, false if not.

A polygon P is said to be simple (or Jordan) if the only points of the plane belonging to two polygon edges of P are the polygon vertices of P. Such a polygon has a well defined interior and exterior. Simple polygons are topologically equivalent to a disk., Eric W. Weisstein. "Simple Polygon." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/SimplePolygon.html

In 3D, we test if the 2D mapping on the major axis is simple.

Warning:
this is a brute force test. we simple test for all edges if they are not intersecting Hence, this is O(n^2).
Triangle specific:
A triangle is always simple

Definition at line 248 of file triangle_3d.inl.

template<typename T >
const bool lass::prim::Triangle3D< T >::isConvex (  )  const [inline]

return true if polygon is convex, false if not.

Warning:
assumes polygon is simple
A planar polygon is convex if it contains all the line segments connecting any pair of its points. Thus, for example, a regular pentagon is convex, while an indented pentagon is not. A planar polygon that is not convex is said to be a concave polygon, Eric W. Weisstein. "Convex Polygon." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/ConvexPolygon.html

A simple polygon is convex if all the cross products of adjacent edges will be the same sign (we ignore zero signs, only + or - are taken in account), a concave polygon will have a mixture of cross product signs.

A polygon with less than three vertices is always convex. A polygon with all colinear vertices is considered convex (not very usefull maybe, but convex).

Triangle specific:
A triangle is always convex

Definition at line 260 of file triangle_3d.inl.

template<typename T >
const bool lass::prim::Triangle3D< T >::isReflex ( int  iIndexOfVertex  )  const [inline]

return true if inner angle of vertex is reflex (is > 180 degrees).

Warning:
assumes polygon is simple
Triangle specific:
A triangle never has reflex vertices

Definition at line 272 of file triangle_3d.inl.

template<typename T >
const bool lass::prim::Triangle3D< T >::isInRange ( int  iIndexOfVertex  )  const [inline, private]

return if index of vertex is in range of the std::vector

Definition at line 284 of file triangle_3d.inl.

References lass::prim::Triangle3D< T >::size_.

Referenced by lass::prim::Triangle3D< T >::at(), and lass::prim::Triangle3D< T >::operator[]().


Friends And Related Function Documentation

template<typename T , class NP , class PP >
Result intersect ( const Triangle3D< T > &  triangle,
const Ray3D< T, NP, PP > &  ray,
T &  t,
const T &  tMin = T() 
) [related]

Find the intersection of a ray and a triangle by their parameter t on the ray.

A maximum of two possible intersections with t > 0.

Parameters:
triangle [in] the triangle
ray [in] the ray
t [out] the parameter of the intersection point > tMin.
tMin [in] the minimum t that may be returned as valid intersection.
Returns:
  • rNone no intersections with t > tMin found t is not assigned.
  • rOne a intersection with t > tMin is found t is assigned.
Note:
MOLLER T. and TRUMBORE B. <q>Fast, Minimum Storage Ray/Triangle Intersection</q>, Journal of Graphics Tools, 2(1), 21-28 (1997). http://www.graphics.cornell.edu/pubs/1997/MT97.html

Definition at line 76 of file ray_3d_triangle_3d.h.

References lass::prim::Ray3D< T, NormalizingPolicy, ParameterPolicy >::direction(), lass::prim::impl::intersectTriangle3D(), lass::prim::Ray3D< T, NormalizingPolicy, ParameterPolicy >::support(), and lass::stde::T.

template<typename T , class NP , class PP >
Result intersect ( const Triangle3D< T > &  triangle,
const Ray3D< T, NP, PP > &  ray,
T &  u,
T &  v,
T &  t,
const T &  tMin = T() 
) [related]

Find the intersection of a ray and a triangle by their parameter t on the ray and it's coordinates (u,v) on the triangle.

A maximum of two possible intersections with t > 0.

Parameters:
triangle [in] the triangle
ray [in] the ray
u [out] the parameter of the intersection point on the triangle.
v [out] the parameter of the intersection point on the triangle.
t [out] the parameter of the intersection point > tMin.
tMin [in] the minimum t that may be returned as valid intersection.
Returns:
  • rNone no intersections with t > tMin found t is not assigned.
  • rOne a intersection with t > tMin is found t is assigned.
Note:
MOLLER T. and TRUMBORE B. <q>Fast, Minimum Storage Ray/Triangle Intersection</q>, Journal of Graphics Tools, 2(1), 21-28 (1997). http://www.graphics.cornell.edu/pubs/1997/MT97.html

Definition at line 113 of file ray_3d_triangle_3d.h.

References lass::prim::Ray3D< T, NormalizingPolicy, ParameterPolicy >::direction(), lass::prim::impl::intersectTriangle3D(), and lass::prim::Ray3D< T, NormalizingPolicy, ParameterPolicy >::support().

template<typename T >
io::XmlOStream & operator<< ( io::XmlOStream ioOStream,
const Triangle3D< T > &  iTriangle 
) [related]

Definition at line 296 of file triangle_3d.inl.

References LASS_ENFORCE_STREAM.

template<typename T >
std::ostream & operator<< ( std::ostream &  ioOStream,
const Triangle3D< T > &  iTriangle 
) [related]

Definition at line 312 of file triangle_3d.inl.

References LASS_ENFORCE_STREAM.


Field Documentation

template<typename T >
TPoint lass::prim::Triangle3D< T >::vertices_[size_] [private]


The documentation for this class was generated from the following files:

Generated on Mon Nov 10 14:22:14 2008 for Library of Assembled Shared Sources by doxygen 1.5.7.1
SourceForge.net Logo