Simbody  3.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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>
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]; }
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 
112 { return (v[0]+v[1]+v[2]) / RealP(3); }
113 
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_