Simbody 3.7
Loading...
Searching...
No Matches
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"
35
36#include <cassert>
37#include <cmath>
38#include <algorithm>
39
40namespace SimTK {
41
42//==============================================================================
43// GEO TRIANGLE
44//==============================================================================
48template <class P>
50typedef P RealP;
51typedef Vec<2,P> Vec2P;
52typedef Vec<3,P> Vec3P;
54public:
59Triangle_(const Vec3P& v0, const Vec3P& v1, const Vec3P& v2)
60{ setVertices(v0,v1,v2); }
63explicit Triangle_(const Vec3P* vertices)
64{ setVertices(vertices); }
67explicit Triangle_(const Vec3P** vertexPointers)
68{ setVertices(*vertexPointers[0], *vertexPointers[1], *vertexPointers[2]); }
69
71Triangle_& setVertex(int i, const Vec3P& p)
72{ assert(0<=i && i<3); v[i] = p; return *this; }
74Triangle_& setVertices(const Vec3P& v0, const Vec3P& v1, const Vec3P& v2)
75{ v[0]=v0; v[1]=v1; v[2]=v2; return *this; }
78Triangle_& setVertices(const Vec3P* vertices)
79{ v[0]=vertices[0]; v[1]=vertices[1]; v[2]=vertices[2]; return *this; }
80
83const 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
93const Vec3P& operator[](int i) const {return getVertex(i);}
95Vec3P& operator[](int i) {return updVertex(i);}
96
101{ SimTK_INDEXCHECK(i,3,"Geo::Triangle_::getEdge()");
102 return LineSeg_<P>(v[i],v[(i+1)%3]); }
103
106Vec3P 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
124
126RealP calcArea() const
127{ return ((v[1]-v[0]) % (v[2]-v[0])).norm() / 2; }
128
130RealP calcAreaSqr() const
131{ return ((v[1]-v[0]) % (v[2]-v[0])).normSqr() / 4; }
132
136Vec3P findNearestPoint(const Vec3P& position, Vec2P& uv) const
137{SimTK_ASSERT_ALWAYS(!"implemented",
138"Geo::Triangle_::findNearestPoint(): Not implemented yet.");
139return Vec3P();}
140
143bool 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
158 bool& isCoplanar) const;
159
166private:
167// Vertices in the order they were supplied in the constructor.
168Vec3P v[3];
169};
170
171} // namespace SimTK
172
173#endif // SimTK_SIMMATH_GEO_TRIANGLE_H_
#define SimTK_INDEXCHECK(ix, ub, where)
Definition ExceptionMacros.h:145
#define SimTK_ASSERT_ALWAYS(cond, msg)
Definition ExceptionMacros.h:349
Defines geometric primitive shapes and algorthms.
Collects primitive operations involving line segments.
Defines primitive computations involving points.
Includes internal headers providing declarations for the basic SimTK Core classes,...
This is the header file that every Simmath compilation unit should include first.
#define SimTK_SIMMATH_EXPORT
Definition SimTKmath/include/simmath/internal/common.h:64
A 3d line segment primitive represented by its end points in an unspecified frame,...
Definition Geo_LineSeg.h:50
static Sphere_< P > calcBoundingSphere(const Vec3P &p)
Create a tiny bounding sphere around a single point.
Definition Geo_Point.h:333
A geometric primitive representing a sphere by its radius and center point, and a collection of spher...
Definition Geo_Sphere.h:47
A geometric primitive representing a triangle by its vertices as points in some unspecified frame,...
Definition Geo_Triangle.h:49
Vec3P findPoint(const Vec2P &uv) const
Return a point on the triangle's face given by its (u,v) coordinates.
Definition Geo_Triangle.h:106
Vec3P findCentroid() const
Return the centroid point on the triangle's face; this is the same as findPoint(1/3,...
Definition Geo_Triangle.h:111
bool overlapsTriangle(const Triangle_< P > &other) const
Determine yes/no whether this triangle overlaps another one.
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
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
Vec3P & updVertex(int i)
Get writable access to a vertex by index. Order is the same as construction.
Definition Geo_Triangle.h:88
RealP calcAreaSqr() const
Return the square of the area of this triangle.
Definition Geo_Triangle.h:130
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...
Vec3P & operator[](int i)
Get writable access to a vertex by indexing the triangle.
Definition Geo_Triangle.h:95
const Vec3P & operator[](int i) const
Access a vertex by indexing the triangle.
Definition Geo_Triangle.h:93
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
RealP calcArea() const
Return the area of this triangle.
Definition Geo_Triangle.h:126
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
UnitVec3P calcUnitNormal() const
Calculate the unit normal to the triangle face taking the vertices in counterclockwise order.
Definition Geo_Triangle.h:116
const Vec3P & getVertex(int i) const
Access a vertex by index. Order is the same as construction.
Definition Geo_Triangle.h:83
Triangle_ & setVertex(int i, const Vec3P &p)
Change one vertex of this triangle.
Definition Geo_Triangle.h:71
Triangle_()
Construct an uninitialized Triangle object; the vertices will be garbage.
Definition Geo_Triangle.h:57
Triangle_ & setVertices(const Vec3P &v0, const Vec3P &v1, const Vec3P &v2)
Change the vertices of this triangle.
Definition Geo_Triangle.h:74
Sphere_< P > calcBoundingSphere() const
Calculate the smallest bounding sphere enclosing the three vertices of this triangle.
Definition Geo_Triangle.h:122
Triangle_(const Vec3P &v0, const Vec3P &v1, const Vec3P &v2)
Construct a triangle from its vertices.
Definition Geo_Triangle.h:59
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
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
This class is a Vec3 plus an ironclad guarantee either that:
Definition UnitVec.h:56
This is a fixed-length column vector designed for no-overhead inline computation.
Definition Vec.h:184
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37