Simbody  3.5
Geo_Triangle.h
Go to the documentation of this file.
1 #ifndef SimTK_SIMMATH_GEO_TRIANGLE_H_
2 #define SimTK_SIMMATH_GEO_TRIANGLE_H_
3 
4 /* -------------------------------------------------------------------------- *
5  * Simbody(tm): SimTKmath *
6  * -------------------------------------------------------------------------- *
7  * This is part of the SimTK biosimulation toolkit originating from *
8  * Simbios, the NIH National Center for Physics-Based Simulation of *
9  * Biological Structures at Stanford, funded under the NIH Roadmap for *
10  * Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
11  * *
12  * Portions copyright (c) 2011-12 Stanford University and the Authors. *
13  * Authors: Michael Sherman *
14  * Contributors: *
15  * *
16  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
17  * not use this file except in compliance with the License. You may obtain a *
18  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
19  * *
20  * Unless required by applicable law or agreed to in writing, software *
21  * distributed under the License is distributed on an "AS IS" BASIS, *
22  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
23  * See the License for the specific language governing permissions and *
24  * limitations under the License. *
25  * -------------------------------------------------------------------------- */
26 
30 #include "SimTKcommon.h"
32 #include "simmath/internal/Geo.h"
35 
36 #include <cassert>
37 #include <cmath>
38 #include <algorithm>
39 
40 namespace SimTK {
41 
42 //==============================================================================
43 // GEO TRIANGLE
44 //==============================================================================
48 template <class P>
49 class Geo::Triangle_ {
50 typedef P RealP;
51 typedef Vec<2,P> Vec2P;
52 typedef Vec<3,P> Vec3P;
53 typedef UnitVec<P,1> UnitVec3P;
54 public:
59 Triangle_(const Vec3P& v0, const Vec3P& v1, const Vec3P& v2)
60 { setVertices(v0,v1,v2); }
63 explicit Triangle_(const Vec3P* vertices)
64 { setVertices(vertices); }
67 explicit Triangle_(const Vec3P** vertexPointers)
68 { setVertices(*vertexPointers[0], *vertexPointers[1], *vertexPointers[2]); }
69 
71 Triangle_& setVertex(int i, const Vec3P& p)
72 { assert(0<=i && i<3); v[i] = p; return *this; }
74 Triangle_& setVertices(const Vec3P& v0, const Vec3P& v1, const Vec3P& v2)
75 { v[0]=v0; v[1]=v1; v[2]=v2; return *this; }
78 Triangle_& setVertices(const Vec3P* vertices)
79 { v[0]=vertices[0]; v[1]=vertices[1]; v[2]=vertices[2]; return *this; }
80 
83 const Vec3P& getVertex(int i) const
84 { SimTK_INDEXCHECK(i,3,"Geo::Triangle_::getVertex()");
85  return v[i]; }
88 Vec3P& updVertex(int i)
89 { SimTK_INDEXCHECK(i,3,"Geo::Triangle_::updVertex()");
90  return v[i]; }
91 
93 const Vec3P& operator[](int i) const {return getVertex(i);}
95 Vec3P& operator[](int i) {return updVertex(i);}
96 
100 LineSeg_<P> getEdge(int i) const
101 { SimTK_INDEXCHECK(i,3,"Geo::Triangle_::getEdge()");
102  return LineSeg_<P>(v[i],v[(i+1)%3]); }
103 
106 Vec3P findPoint(const Vec2P& uv) const
107 { return uv[0]*v[0] + uv[1]*v[1] + (1-uv[0]-uv[1])*v[2]; }
108 
111 Vec3P findCentroid() const
112 { return (v[0]+v[1]+v[2]) / RealP(3); }
113 
116 UnitVec3P calcUnitNormal() const
117 { return UnitVec3P((v[1]-v[0]) % (v[2]-v[0])); }
118 
123 { return Geo::Point_<P>::calcBoundingSphere(v[0],v[1],v[2]); }
124 
126 RealP calcArea() const
127 { return ((v[1]-v[0]) % (v[2]-v[0])).norm() / 2; }
128 
130 RealP calcAreaSqr() const
131 { return ((v[1]-v[0]) % (v[2]-v[0])).normSqr() / 4; }
132 
136 Vec3P findNearestPoint(const Vec3P& position, Vec2P& uv) const
137 {SimTK_ASSERT_ALWAYS(!"implemented",
138 "Geo::Triangle_::findNearestPoint(): Not implemented yet.");
139 return Vec3P();}
140 
143 bool intersectsRay(const Vec3P& origin, const UnitVec3P& direction,
144  RealP& distance, Vec2P& uv) const
145 {SimTK_ASSERT_ALWAYS(!"implemented",
146 "Geo::Triangle_::intersectsRay(): Not implemented yet."); return false;}
147 
150 SimTK_SIMMATH_EXPORT bool overlapsTriangle(const Triangle_<P>& other) const;
158  bool& isCoplanar) const;
159 
166 private:
167 // Vertices in the order they were supplied in the constructor.
168 Vec3P v[3];
169 };
170 
171 } // namespace SimTK
172 
173 #endif // SimTK_SIMMATH_GEO_TRIANGLE_H_
A geometric primitive representing a triangle by its vertices as points in some unspecified frame...
Definition: Geo.h:64
Triangle_ & setVertex(int i, const Vec3P &p)
Change one vertex of this triangle.
Definition: Geo_Triangle.h:71
Triangle_ & setVertices(const Vec3P &v0, const Vec3P &v1, const Vec3P &v2)
Change the vertices of this triangle.
Definition: Geo_Triangle.h:74
Triangle_()
Construct an uninitialized Triangle object; the vertices will be garbage.
Definition: Geo_Triangle.h:57
Sphere_< P > calcBoundingSphere() const
Calculate the smallest bounding sphere enclosing the three vertices of this triangle.
Definition: Geo_Triangle.h:122
const Vec3P & getVertex(int i) const
Access a vertex by index. Order is the same as construction.
Definition: Geo_Triangle.h:83
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
#define SimTK_ASSERT_ALWAYS(cond, msg)
Definition: ExceptionMacros.h:349
Vec3P & operator[](int i)
Get writable access to a vertex by indexing the triangle.
Definition: Geo_Triangle.h:95
Vec3P findPoint(const Vec2P &uv) const
Return a point on the triangle&#39;s face given by its (u,v) coordinates.
Definition: Geo_Triangle.h:106
Vec3P findCentroid() const
Return the centroid point on the triangle&#39;s face; this is the same as findPoint(1/3,1/3) but faster.
Definition: Geo_Triangle.h:111
bool intersectsRay(const Vec3P &origin, const UnitVec3P &direction, RealP &distance, Vec2P &uv) const
Determine whether a given ray intersects this triangle.
Definition: Geo_Triangle.h:143
bool overlapsTriangle(const Triangle_< P > &other) const
Determine yes/no whether this triangle overlaps another one.
Triangle_(const Vec3P &v0, const Vec3P &v1, const Vec3P &v2)
Construct a triangle from its vertices.
Definition: Geo_Triangle.h:59
Includes internal headers providing declarations for the basic SimTK Core classes, including Simmatrix.
Defines geometric primitive shapes and algorthms.
A 3d line segment primitive represented by its end points in an unspecified frame, and a collection of line segment-related utility methods.
Definition: Geo.h:57
Vec3P & updVertex(int i)
Get writable access to a vertex by index. Order is the same as construction.
Definition: Geo_Triangle.h:88
RealP calcArea() const
Return the area of this triangle.
Definition: Geo_Triangle.h:126
Collects primitive operations involving line segments.
const Vec3P & operator[](int i) const
Access a vertex by indexing the triangle.
Definition: Geo_Triangle.h:93
This is the header file that every Simmath compilation unit should include first. ...
bool intersectsTriangle(const Triangle_< P > &other, LineSeg_< P > &seg, bool &isCoplanar) const
Determine whether this triangle intersects another one, and if so then if they are not coplanar retur...
Triangle_(const Vec3P *vertices)
Construct a triangle from vertices stored in array which is presumed to contain at least three points...
Definition: Geo_Triangle.h:63
Defines primitive computations involving points.
Triangle_ & setVertices(const Vec3P *vertices)
Change the vertices of this triangle, taking the new ones from an array which is presumed to contain ...
Definition: Geo_Triangle.h:78
#define SimTK_INDEXCHECK(ix, ub, where)
Definition: ExceptionMacros.h:145
A geometric primitive representing a sphere by its radius and center point, and a collection of spher...
Definition: Geo.h:56
Vec3P findNearestPoint(const Vec3P &position, Vec2P &uv) const
Given a location in space, find the point of this triangular face that is closest to that location...
Definition: Geo_Triangle.h:136
LineSeg_< P > getEdge(int i) const
Return a LineSeg_ containing an edge of this triangle, with edges numbered in a counterclockwise dire...
Definition: Geo_Triangle.h:100
RealP calcAreaSqr() const
Return the square of the area of this triangle.
Definition: Geo_Triangle.h:130
Triangle_(const Vec3P **vertexPointers)
Construct a triangle from an indirect list of vertices stored in array which is presumed to contain a...
Definition: Geo_Triangle.h:67
#define SimTK_SIMMATH_EXPORT
Definition: SimTKmath/include/simmath/internal/common.h:64
UnitVec3P calcUnitNormal() const
Calculate the unit normal to the triangle face taking the vertices in counterclockwise order...
Definition: Geo_Triangle.h:116
static Sphere_< P > calcBoundingSphere(const Vec3P &p)
Create a tiny bounding sphere around a single point.
Definition: Geo_Point.h:333