Simbody  3.7
Go to the documentation of this file.
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 *
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 *
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  * -------------------------------------------------------------------------- */
30 #include "SimTKcommon.h"
32 #include "simmath/internal/Geo.h"
36 #include <cassert>
37 #include <cmath>
38 #include <algorithm>
40 namespace SimTK {
42 //==============================================================================
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]); }
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; }
83 const Vec3P& getVertex(int i) const
84 { SimTK_INDEXCHECK(i,3,"Geo::Triangle_::getVertex()");
85  return v[i]; }
89 { SimTK_INDEXCHECK(i,3,"Geo::Triangle_::updVertex()");
90  return v[i]; }
93 const Vec3P& operator[](int i) const {return getVertex(i);}
95 Vec3P& operator[](int i) {return updVertex(i);}
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]); }
106 Vec3P findPoint(const Vec2P& uv) const
107 { return uv[0]*v[0] + uv[1]*v[1] + (1-uv[0]-uv[1])*v[2]; }
112 { return (v[0]+v[1]+v[2]) / RealP(3); }
117 { return UnitVec3P((v[1]-v[0]) % (v[2]-v[0])); }
123 { return Geo::Point_<P>::calcBoundingSphere(v[0],v[1],v[2]); }
126 RealP calcArea() const
127 { return ((v[1]-v[0]) % (v[2]-v[0])).norm() / 2; }
130 RealP calcAreaSqr() const
131 { return ((v[1]-v[0]) % (v[2]-v[0])).normSqr() / 4; }
136 Vec3P findNearestPoint(const Vec3P& position, Vec2P& uv) const
137 {SimTK_ASSERT_ALWAYS(!"implemented",
138 "Geo::Triangle_::findNearestPoint(): Not implemented yet.");
139 return Vec3P();}
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;}
150 SimTK_SIMMATH_EXPORT bool overlapsTriangle(const Triangle_<P>& other) const;
158  bool& isCoplanar) const;
166 private:
167 // Vertices in the order they were supplied in the constructor.
168 Vec3P v[3];
169 };
171 } // namespace SimTK
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
A geometric primitive representing a triangle by its vertices as points in some unspecified frame...
Definition: Geo.h:64
const Vec3P & operator[](int i) const
Access a vertex by indexing the triangle.
Definition: Geo_Triangle.h:93
Triangle_ & setVertex(int i, const Vec3P &p)
Change one vertex of this triangle.
Definition: Geo_Triangle.h:71
Sphere_< P > calcBoundingSphere() const
Calculate the smallest bounding sphere enclosing the three vertices of this triangle.
Definition: Geo_Triangle.h:122
Triangle_ & setVertices(const Vec3P &v0, const Vec3P &v1, const Vec3P &v2)
Change the vertices of this triangle.
Definition: Geo_Triangle.h:74
UnitVec3P calcUnitNormal() const
Calculate the unit normal to the triangle face taking the vertices in counterclockwise order...
Definition: Geo_Triangle.h:116
Construct an uninitialized Triangle object; the vertices will be garbage.
Definition: Geo_Triangle.h:57
This class is a Vec3 plus an ironclad guarantee either that:
Definition: UnitVec.h:40
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
Triangle_(const Vec3P &v0, const Vec3P &v1, const Vec3P &v2)
Construct a triangle from its vertices.
Definition: Geo_Triangle.h:59
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
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
Collects primitive operations involving line segments.
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 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...
This is the header file that every Simmath compilation unit should include first. ...
RealP calcArea() const
Return the area of this triangle.
Definition: Geo_Triangle.h:126
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 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
const Vec3P & getVertex(int i) const
Access a vertex by index. Order is the same as construction.
Definition: Geo_Triangle.h:83
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
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
Definition: SimTKmath/include/simmath/internal/common.h:64
bool overlapsTriangle(const Triangle_< P > &other) const
Determine yes/no whether this triangle overlaps another one.
RealP calcAreaSqr() const
Return the square of the area of this triangle.
Definition: Geo_Triangle.h:130
static Sphere_< P > calcBoundingSphere(const Vec3P &p)
Create a tiny bounding sphere around a single point.
Definition: Geo_Point.h:333