This document is for a version of USD that is under development. See this page for the current release.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
vec3d.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
8// This file is generated by a script. Do not edit directly. Edit the
9// vec.template.h file to make changes.
10
11#ifndef PXR_BASE_GF_VEC3D_H
12#define PXR_BASE_GF_VEC3D_H
13
16
17#include "pxr/pxr.h"
19#include "pxr/base/gf/api.h"
20#include "pxr/base/gf/limits.h"
21#include "pxr/base/gf/traits.h"
22#include "pxr/base/gf/math.h"
23#include "pxr/base/tf/hash.h"
24
25#include <cstddef>
26#include <cmath>
27
28#include <iosfwd>
29
30PXR_NAMESPACE_OPEN_SCOPE
31
32class GfVec3d;
33
34template <>
35struct GfIsGfVec<class GfVec3d> { static const bool value = true; };
36
46{
47public:
49 typedef double ScalarType;
50 static const size_t dimension = 3;
51
53 GfVec3d() = default;
54
56 constexpr explicit GfVec3d(double value)
57 : _data{ value, value, value }
58 {
59 }
60
62 constexpr GfVec3d(double s0, double s1, double s2)
63 : _data{ s0, s1, s2 }
64 {
65 }
66
68 template <class Scl>
69 constexpr explicit GfVec3d(Scl const *p)
70 : _data{ p[0], p[1], p[2] }
71 {
72 }
73
75 GfVec3d(class GfVec3f const &other);
76
78 GfVec3d(class GfVec3h const &other);
79
81 GfVec3d(class GfVec3i const &other);
82
84 static GfVec3d XAxis() {
85 GfVec3d result(0);
86 result[0] = 1;
87 return result;
88 }
90 static GfVec3d YAxis() {
91 GfVec3d result(0);
92 result[1] = 1;
93 return result;
94 }
96 static GfVec3d ZAxis() {
97 GfVec3d result(0);
98 result[2] = 1;
99 return result;
100 }
101
104 static GfVec3d Axis(size_t i) {
105 GfVec3d result(0);
106 if (i < 3)
107 result[i] = 1;
108 return result;
109 }
110
112 GfVec3d &Set(double s0, double s1, double s2) {
113 _data[0] = s0;
114 _data[1] = s1;
115 _data[2] = s2;
116 return *this;
117 }
118
120 GfVec3d &Set(double const *a) {
121 return Set(a[0], a[1], a[2]);
122 }
123
125 double const *data() const { return _data; }
126 double *data() { return _data; }
127 double const *GetArray() const { return data(); }
128
130 double const &operator[](size_t i) const { return _data[i]; }
131 double &operator[](size_t i) { return _data[i]; }
132
134 friend inline size_t hash_value(GfVec3d const &vec) {
135 return TfHash::Combine(vec[0], vec[1], vec[2]);
136 }
137
139 bool operator==(GfVec3d const &other) const {
140 return _data[0] == other[0] &&
141 _data[1] == other[1] &&
142 _data[2] == other[2];
143 }
144 bool operator!=(GfVec3d const &other) const {
145 return !(*this == other);
146 }
147
148 // TODO Add inequality for other vec types...
150 GF_API
151 bool operator==(class GfVec3f const &other) const;
153 GF_API
154 bool operator==(class GfVec3h const &other) const;
156 GF_API
157 bool operator==(class GfVec3i const &other) const;
158
161 return GfVec3d(-_data[0], -_data[1], -_data[2]);
162 }
163
165 GfVec3d &operator+=(GfVec3d const &other) {
166 _data[0] += other[0];
167 _data[1] += other[1];
168 _data[2] += other[2];
169 return *this;
170 }
171 friend GfVec3d operator+(GfVec3d const &l, GfVec3d const &r) {
172 return GfVec3d(l) += r;
173 }
174
176 GfVec3d &operator-=(GfVec3d const &other) {
177 _data[0] -= other[0];
178 _data[1] -= other[1];
179 _data[2] -= other[2];
180 return *this;
181 }
182 friend GfVec3d operator-(GfVec3d const &l, GfVec3d const &r) {
183 return GfVec3d(l) -= r;
184 }
185
187 GfVec3d &operator*=(double s) {
188 _data[0] *= s;
189 _data[1] *= s;
190 _data[2] *= s;
191 return *this;
192 }
193 GfVec3d operator*(double s) const {
194 return GfVec3d(*this) *= s;
195 }
196 friend GfVec3d operator*(double s, GfVec3d const &v) {
197 return v * s;
198 }
199
201 // TODO should divide by the scalar type.
202 GfVec3d &operator/=(double s) {
203 // TODO This should not multiply by 1/s, it should do the division.
204 // Doing the division is more numerically stable when s is close to
205 // zero.
206 return *this *= (1.0 / s);
207 }
208 GfVec3d operator/(double s) const {
209 return *this * (1.0 / s);
210 }
211
213 double operator*(GfVec3d const &v) const {
214 return _data[0] * v[0] + _data[1] * v[1] + _data[2] * v[2];
215 }
216
221 GfVec3d GetProjection(GfVec3d const &v) const {
222 return v * (*this * v);
223 }
224
230 GfVec3d GetComplement(GfVec3d const &b) const {
231 return *this - this->GetProjection(b);
232 }
233
235 double GetLengthSq() const {
236 return *this * *this;
237 }
238
240 double GetLength() const {
241 return GfSqrt(GetLengthSq());
242 }
243
252 double Normalize(double eps = GF_MIN_VECTOR_LENGTH) {
253 // TODO this seems suspect... suggest dividing by length so long as
254 // length is not zero.
255 double length = GetLength();
256 *this /= (length > eps) ? length : eps;
257 return length;
258 }
259
260 GfVec3d GetNormalized(double eps = GF_MIN_VECTOR_LENGTH) const {
261 GfVec3d normalized(*this);
262 normalized.Normalize(eps);
263 return normalized;
264 }
265
275 GF_API
277 GfVec3d *tx, GfVec3d *ty, GfVec3d *tz,
278 const bool normalize,
279 double eps = GF_MIN_ORTHO_TOLERANCE);
280
285 GF_API
287 double eps = GF_MIN_VECTOR_LENGTH) const;
288
289
290private:
291 double _data[3];
292};
293
296GF_API std::ostream& operator<<(std::ostream &, GfVec3d const &);
297
298
299PXR_NAMESPACE_CLOSE_SCOPE
300
301#include "pxr/base/gf/vec3f.h"
302#include "pxr/base/gf/vec3h.h"
303#include "pxr/base/gf/vec3i.h"
304
305PXR_NAMESPACE_OPEN_SCOPE
306
307inline
308GfVec3d::GfVec3d(class GfVec3f const &other)
309{
310 _data[0] = other[0];
311 _data[1] = other[1];
312 _data[2] = other[2];
313}
314inline
315GfVec3d::GfVec3d(class GfVec3h const &other)
316{
317 _data[0] = other[0];
318 _data[1] = other[1];
319 _data[2] = other[2];
320}
321inline
322GfVec3d::GfVec3d(class GfVec3i const &other)
323{
324 _data[0] = other[0];
325 _data[1] = other[1];
326 _data[2] = other[2];
327}
328
330inline GfVec3d
331GfCompMult(GfVec3d const &v1, GfVec3d const &v2) {
332 return GfVec3d(
333 v1[0] * v2[0],
334 v1[1] * v2[1],
335 v1[2] * v2[2]
336 );
337}
338
340inline GfVec3d
341GfCompDiv(GfVec3d const &v1, GfVec3d const &v2) {
342 return GfVec3d(
343 v1[0] / v2[0],
344 v1[1] / v2[1],
345 v1[2] / v2[2]
346 );
347}
348
350inline double
351GfDot(GfVec3d const &v1, GfVec3d const &v2) {
352 return v1 * v2;
353}
354
355
357inline double
359{
360 return v.GetLength();
361}
362
366inline double
368{
369 return v->Normalize(eps);
370}
371
375inline GfVec3d
377{
378 return v.GetNormalized(eps);
379}
380
385inline GfVec3d
386GfGetProjection(GfVec3d const &a, GfVec3d const &b)
387{
388 return a.GetProjection(b);
389}
390
395inline GfVec3d
396GfGetComplement(GfVec3d const &a, GfVec3d const &b)
397{
398 return a.GetComplement(b);
399}
400
403inline bool
404GfIsClose(GfVec3d const &v1, GfVec3d const &v2, double tolerance)
405{
406 GfVec3d delta = v1 - v2;
407 return delta.GetLengthSq() <= tolerance * tolerance;
408}
409
410
411GF_API bool
412GfOrthogonalizeBasis(GfVec3d *tx, GfVec3d *ty, GfVec3d *tz,
413 bool normalize, double eps = GF_MIN_ORTHO_TOLERANCE);
414
415GF_API void
416GfBuildOrthonormalFrame(GfVec3d const &v0,
417 GfVec3d* v1,
418 GfVec3d* v2,
419 double eps = GF_MIN_VECTOR_LENGTH);
420
422inline GfVec3d
423GfCross(GfVec3d const &v1, GfVec3d const &v2)
424{
425 return GfVec3d(
426 v1[1] * v2[2] - v1[2] * v2[1],
427 v1[2] * v2[0] - v1[0] * v2[2],
428 v1[0] * v2[1] - v1[1] * v2[0]);
429}
430
433inline GfVec3d
434operator^(GfVec3d const &v1, GfVec3d const &v2)
435{
436 return GfCross(v1, v2);
437}
438
440GF_API GfVec3d
441GfSlerp(double alpha, GfVec3d const &v0, GfVec3d const &v1);
442
443
444
445PXR_NAMESPACE_CLOSE_SCOPE
446
447#endif // PXR_BASE_GF_VEC3D_H
Low-level utilities for informing users of various internal and external diagnostic conditions.
Basic type for a vector of 3 double components.
Definition: vec3d.h:46
GfVec3d operator-() const
Create a vec with negated elements.
Definition: vec3d.h:160
GfVec3d & Set(double const *a)
Set all elements with a pointer to data.
Definition: vec3d.h:120
GF_API bool operator==(class GfVec3h const &other) const
Equality comparison.
constexpr GfVec3d(double value)
Initialize all elements to a single value.
Definition: vec3d.h:56
static GfVec3d ZAxis()
Create a unit vector along the Z-axis.
Definition: vec3d.h:96
double GetLengthSq() const
Squared length.
Definition: vec3d.h:235
GfVec3d & operator+=(GfVec3d const &other)
Addition.
Definition: vec3d.h:165
GF_API void BuildOrthonormalFrame(GfVec3d *v1, GfVec3d *v2, double eps=GF_MIN_VECTOR_LENGTH) const
Sets v1 and v2 to unit vectors such that v1, v2 and *this are mutually orthogonal.
constexpr GfVec3d(Scl const *p)
Construct with pointer to values.
Definition: vec3d.h:69
GfVec3d & operator*=(double s)
Multiplication by scalar.
Definition: vec3d.h:187
GF_API bool operator==(class GfVec3f const &other) const
Equality comparison.
GfVec3d GetProjection(GfVec3d const &v) const
Returns the projection of this onto v.
Definition: vec3d.h:221
double ScalarType
Scalar element type and dimension.
Definition: vec3d.h:49
double const * data() const
Direct data access.
Definition: vec3d.h:125
double Normalize(double eps=GF_MIN_VECTOR_LENGTH)
Normalizes the vector in place to unit length, returning the length before normalization.
Definition: vec3d.h:252
static GfVec3d XAxis()
Create a unit vector along the X-axis.
Definition: vec3d.h:84
GfVec3d & operator-=(GfVec3d const &other)
Subtraction.
Definition: vec3d.h:176
static GfVec3d YAxis()
Create a unit vector along the Y-axis.
Definition: vec3d.h:90
static GfVec3d Axis(size_t i)
Create a unit vector along the i-th axis, zero-based.
Definition: vec3d.h:104
GfVec3d & Set(double s0, double s1, double s2)
Set all elements with passed arguments.
Definition: vec3d.h:112
bool operator==(GfVec3d const &other) const
Equality comparison.
Definition: vec3d.h:139
friend size_t hash_value(GfVec3d const &vec)
Hash.
Definition: vec3d.h:134
GfVec3d()=default
Default constructor does no initialization.
double const & operator[](size_t i) const
Indexing.
Definition: vec3d.h:130
GF_API bool operator==(class GfVec3i const &other) const
Equality comparison.
static GF_API bool OrthogonalizeBasis(GfVec3d *tx, GfVec3d *ty, GfVec3d *tz, const bool normalize, double eps=GF_MIN_ORTHO_TOLERANCE)
Orthogonalize and optionally normalize a set of basis vectors.
GfVec3d GetComplement(GfVec3d const &b) const
Returns the orthogonal complement of this->GetProjection(b).
Definition: vec3d.h:230
double GetLength() const
Length.
Definition: vec3d.h:240
double operator*(GfVec3d const &v) const
See GfDot().
Definition: vec3d.h:213
GfVec3d & operator/=(double s)
Division by scalar.
Definition: vec3d.h:202
constexpr GfVec3d(double s0, double s1, double s2)
Initialize all elements with explicit arguments.
Definition: vec3d.h:62
Basic type for a vector of 3 float components.
Definition: vec3f.h:46
Basic type for a vector of 3 GfHalf components.
Definition: vec3h.h:47
Basic type for a vector of 3 int components.
Definition: vec3i.h:44
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
Definition: hash.h:487
Assorted mathematical utility functions.
double GfSqrt(double f)
Return sqrt(f).
Definition: math.h:187
#define GF_MIN_VECTOR_LENGTH
This constant is used to determine whether the length of a vector is too small to handle accurately.
Definition: limits.h:17
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
#define GF_MIN_ORTHO_TOLERANCE
This constant is used to determine when a set of basis vectors is close to orthogonal.
Definition: limits.h:22
Defines useful mathematical limits.
A metafunction with a static const bool member 'value' that is true for GfVec types,...
Definition: traits.h:19
double GfDot(GfVec3d const &v1, GfVec3d const &v2)
Returns the dot (inner) product of two vectors.
Definition: vec3d.h:351
GfVec3d operator^(GfVec3d const &v1, GfVec3d const &v2)
Returns the cross product of v1 and v2.
Definition: vec3d.h:434
GfVec3d GfGetNormalized(GfVec3d const &v, double eps=GF_MIN_VECTOR_LENGTH)
Returns a normalized (unit-length) vector with the same direction as v.
Definition: vec3d.h:376
double GfNormalize(GfVec3d *v, double eps=GF_MIN_VECTOR_LENGTH)
Normalizes *v in place to unit length, returning the length before normalization.
Definition: vec3d.h:367
GF_API GfVec3d GfSlerp(double alpha, GfVec3d const &v0, GfVec3d const &v1)
Spherical linear interpolation in three dimensions.
GfVec3d GfCompDiv(GfVec3d const &v1, GfVec3d const &v2)
Returns component-wise quotient of vectors v1 and v2.
Definition: vec3d.h:341
GfVec3d GfGetComplement(GfVec3d const &a, GfVec3d const &b)
Returns the orthogonal complement of a.GetProjection(b).
Definition: vec3d.h:396
double GfGetLength(GfVec3d const &v)
Returns the geometric length of v.
Definition: vec3d.h:358
GfVec3d GfCompMult(GfVec3d const &v1, GfVec3d const &v2)
Returns component-wise multiplication of vectors v1 and v2.
Definition: vec3d.h:331
bool GfIsClose(GfVec3d const &v1, GfVec3d const &v2, double tolerance)
Tests for equality within a given tolerance, returning true if the length of the difference vector is...
Definition: vec3d.h:404
GfVec3d GfGetProjection(GfVec3d const &a, GfVec3d const &b)
Returns the projection of a onto b.
Definition: vec3d.h:386
GfVec3d GfCross(GfVec3d const &v1, GfVec3d const &v2)
Returns the cross product of v1 and v2.
Definition: vec3d.h:423