Simbody 3.7
Loading...
Searching...
No Matches
Geo_LineSeg.h
Go to the documentation of this file.
1#ifndef SimTK_SIMMATH_GEO_LINESEG_H_
2#define SimTK_SIMMATH_GEO_LINESEG_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"
34
35#include <cassert>
36#include <cmath>
37#include <algorithm>
38
39namespace SimTK {
40
41
42//==============================================================================
43// GEO LINESEG
44//==============================================================================
49template <class P>
51typedef P RealP;
52typedef Vec<3,RealP> Vec3P;
53
54public:
58
61LineSeg_(const Vec3P& e0, const Vec3P& e1)
62{ setEndpoints(e0,e1); }
63
65LineSeg_& setEndpoints(const Vec3P& e0, const Vec3P& e1)
66{ e[0]=e0; e[1]=e1; return *this; }
67
69LineSeg_& setEndpoint(int which, const Vec3P& p)
70{ assert(which==0 || which==1); e[which] = p; return *this; }
71
77bool isDegenerate(RealP tol = Geo::getDefaultTol<P>()) const
78{ assert(tol >= 0); return calcLengthSqr() <= square(tol); }
79
82const Vec3P& getEndpoint(int which) const
83{ assert(which==0 || which==1); return e[which]; }
84
88Vec3P& updEndpoint(int which)
89{ assert(which==0 || which==1); return e[which]; }
90
92const Vec3P& operator[](int which) const {return getEndpoint(which);}
94Vec3P& operator[](int which) {return updEndpoint(which);}
95
98RealP calcLength() const {return (e[1]-e[0]).norm(); }
99
102RealP calcLengthSqr() const {return (e[1]-e[0]).normSqr(); }
103
108Vec3P findPoint(RealP t) const
109{ return t*e[0] + (1-t)*e[1]; }
110
114{ return (e[0]+e[1]) / RealP(2); }
115
121
124RealP findDistanceToPoint(const Vec3P& p2) const
125{SimTK_ASSERT_ALWAYS(!"implemented",
126"Geo::LineSeg_::findDistanceToPoint(): Not implemented yet.");
127return Geo::getNaN<P>();}
128
131RealP findDistanceToPointSqr(const Vec3P& p2) const
132{SimTK_ASSERT_ALWAYS(!"implemented",
133"Geo::LineSeg_::findDistanceToPointSqr(): Not implemented yet.");
134return Geo::getNaN<P>();}
135
142private:
143Vec3P e[2];
144};
145
146
147} // namespace SimTK
148
149#endif // SimTK_SIMMATH_GEO_LINESEG_H_
#define SimTK_ASSERT_ALWAYS(cond, msg)
Definition ExceptionMacros.h:349
Defines geometric primitive shapes and algorthms.
Defines primitive operations on spheres.
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
LineSeg_ & setEndpoints(const Vec3P &e0, const Vec3P &e1)
Change the end points of this line segment.
Definition Geo_LineSeg.h:65
RealP findDistanceToPointSqr(const Vec3P &p2) const
Find the square of the distance between this line segment and a point expressed in the same frame.
Definition Geo_LineSeg.h:131
RealP calcLength() const
Calculate the length of this line segment (expensive).
Definition Geo_LineSeg.h:98
LineSeg_ & setEndpoint(int which, const Vec3P &p)
Change one end point of this line segment.
Definition Geo_LineSeg.h:69
Sphere_< P > calcBoundingSphere() const
Calculate a minimal bounding sphere for this line segment.
Definition Geo_LineSeg.h:119
RealP findDistanceToPoint(const Vec3P &p2) const
Find the distance between this line segment and a point expressed in the same frame.
Definition Geo_LineSeg.h:124
Vec3P findMidpoint() const
Return the center point of the line segment; this is the same as findPoint(1/2) but faster.
Definition Geo_LineSeg.h:113
Vec3P findPoint(RealP t) const
Return a point along the line segment given by its coordinate t, where t==0 gives end point 0,...
Definition Geo_LineSeg.h:108
LineSeg_()
Construct an uninitialized LineSeg object; the end points will be garbage (NaN in Debug builds).
Definition Geo_LineSeg.h:57
Vec3P & updEndpoint(int which)
Get a writable reference to the location of an end point. Order is the same as construction.
Definition Geo_LineSeg.h:88
LineSeg_(const Vec3P &e0, const Vec3P &e1)
Construct a LineSeg with the given end points.
Definition Geo_LineSeg.h:61
bool isDegenerate(RealP tol=Geo::getDefaultTol< P >()) const
Determine whether this line segment is degenerate to a given tolerance, meaning that its length is le...
Definition Geo_LineSeg.h:77
Vec3P & operator[](int which)
Get writable access to an end point by indexing the line segment.
Definition Geo_LineSeg.h:94
const Vec3P & operator[](int which) const
Access an end point by indexing the line segment.
Definition Geo_LineSeg.h:92
RealP calcLengthSqr() const
Calculate the square of the length of this line segment (cheap).
Definition Geo_LineSeg.h:102
const Vec3P & getEndpoint(int which) const
Get the location of an end point. Order is the same as construction.
Definition Geo_LineSeg.h:82
A 3d point primitive represented by a Vec3 from the origin of an unspecified frame,...
Definition Geo_Point.h:46
A geometric primitive representing a sphere by its radius and center point, and a collection of spher...
Definition Geo_Sphere.h:47
The Geo class collects geometric primitives intended to deal with raw, fixed-size geometric shapes oc...
Definition Geo.h:53
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
unsigned char square(unsigned char u)
Definition Scalar.h:349