RigsofRods
Soft-body Physics Simulation
Data Structures | Public Member Functions | Private Member Functions | Private Attributes
CartesianToTriangleTransform Class Reference

Defines a linear transformation from cartesian coordinates to local (barycentric) coordinates of a specified triangle. More...

#include <CartesianToTriangleTransform.h>

+ Collaboration diagram for CartesianToTriangleTransform:

Data Structures

struct  TriangleCoord
 Return type of CartesianToTriangleTransform transformation. More...
 

Public Member Functions

 CartesianToTriangleTransform (const Triangle &triangle)
 Construct transformation for specified triangle. More...
 
TriangleCoord operator() (const Ogre::Vector3 &p) const
 Transform point into local triangle coordinates. More...
 

Private Member Functions

void InitMatrix () const
 Initialize the transformation matrix. More...
 

Private Attributes

const Triangle m_triangle
 The triangle on which the transformation is based. More...
 
bool m_initialized
 
Ogre::Matrix3 m_matrix
 Cached transformation matrix. More...
 

Detailed Description

Defines a linear transformation from cartesian coordinates to local (barycentric) coordinates of a specified triangle.

The barycentric coordinate system of the triangle is defined in terms of its three vertices \((\mathbf{a}, \mathbf{b}, \mathbf{c})\). Since an arbitrary three-dimensional point \(\mathbf{p}\) is not guaranteed to lie within the plane defined by this triangle, the barycentric coordinates \((\alpha, \beta, \gamma)\) are instead determined for the point \(\mathbf{p}'\) which denotes the projection of \(\mathbf{p}\) onto this plane. In addition, the shortest (signed) distance \(d\) between the point \(\mathbf{p}\) and the triangle plane is returned by this transformation.

The transformation is evaluated lazily, i.e. creating new instances of CartesianToTriangleTransform is relatively cheap. Actual calculations are deferred until the transformation is applied to a point for the first time.

Definition at line 47 of file CartesianToTriangleTransform.h.

Constructor & Destructor Documentation

◆ CartesianToTriangleTransform()

CartesianToTriangleTransform::CartesianToTriangleTransform ( const Triangle triangle)
inlineexplicit

Construct transformation for specified triangle.

Definition at line 66 of file CartesianToTriangleTransform.h.

Member Function Documentation

◆ InitMatrix()

void CartesianToTriangleTransform::InitMatrix ( ) const
inlineprivate

Initialize the transformation matrix.

Definition at line 128 of file CartesianToTriangleTransform.h.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ operator()()

TriangleCoord CartesianToTriangleTransform::operator() ( const Ogre::Vector3 &  p) const
inline

Transform point into local triangle coordinates.

The calculation of the barycentric coordinates and the perpendicular distance to the triangle plane for a given point p is explained in the following.

Let \(\mathbf{p}'\) denote the projection of point \(\mathbf{p}\) onto the triangle plane. I.e. \(\mathbf{p} = \mathbf{p}' + d \cdot \mathbf{n}\), where \(\mathbf{n}\) is the normal vector of the plane and \(d\) is the shortest (signed) distance between point \(\mathbf{p}\) and the plane.

The point \(\mathbf{p}'\) can be expressed in barycentric coordinates \((\alpha, \beta, \gamma)\) as follows:

\[ \mathbf{p}' = \alpha \cdot \mathbf{a} + \beta \cdot \mathbf{b} + \gamma \cdot \mathbf{c}, \quad \text{with } \alpha + \beta + \gamma = 1 \]

The variable \(\gamma\) is redundant and can be substituted by \(1-\alpha-\beta\):

\begin{eqnarray*} \mathbf{p}' &=& \alpha \cdot \mathbf{a} + \beta \cdot \mathbf{b} + (1-\alpha -\beta) \cdot \mathbf{c} \\ &=& \alpha \cdot (\mathbf{a} - \mathbf{c}) + \beta \cdot (\mathbf{b} - \mathbf{c}) + \mathbf{c} \end{eqnarray*}

The distance \(d\) between point \(\mathbf{p}\) and the plane is calculated by projecting the vector \((\mathbf{p} - \mathbf{c})\) onto the normal vector \(\mathbf{n}\):

\[ d = \mathbf{n}^T \cdot (\mathbf{p}-\mathbf{c}), \quad \text{with } ||n|| = 1 \]

Combining this with the expression of point \(\mathbf{p}'\) in barycentric coordinates allows to formulate the problem in matrix form:

\[ \mathbf{M} = \begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{n} \end{bmatrix}, \quad \text{with } \mathbf{u} = (\mathbf{a} - \mathbf{c}) \text{ and } \mathbf{v} = (\mathbf{b} - \mathbf{c}) \]

\[ \mathbf{M} \cdot \begin{bmatrix} \alpha \\ \beta \\ d \end{bmatrix} = \mathbf{p}' + \mathbf{n} \cdot d - \mathbf{c} = \mathbf{p} - \mathbf{c} \]

The solution is obtained by inverting matrix \(\mathbf{M}\):

\[ \begin{bmatrix} \alpha \\ \beta \\ d \end{bmatrix} = \mathbf{M}^{-1} \cdot (\mathbf{p} - \mathbf{c}) \]

\(\gamma\) can be immediately calculated from known values \(\alpha\) and \(\beta\) because \(\alpha + \beta + \gamma = 1\) always holds.

Definition at line 113 of file CartesianToTriangleTransform.h.

+ Here is the call graph for this function:

Field Documentation

◆ m_initialized

bool CartesianToTriangleTransform::m_initialized
mutableprivate

Definition at line 141 of file CartesianToTriangleTransform.h.

◆ m_matrix

Ogre::Matrix3 CartesianToTriangleTransform::m_matrix
mutableprivate

Cached transformation matrix.

Definition at line 142 of file CartesianToTriangleTransform.h.

◆ m_triangle

const Triangle CartesianToTriangleTransform::m_triangle
private

The triangle on which the transformation is based.

Definition at line 140 of file CartesianToTriangleTransform.h.


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