1 // 2 // Copyright 2016 Pixar 3 // 4 // Licensed under the Apache License, Version 2.0 (the "Apache License") 5 // with the following modification; you may not use this file except in 6 // compliance with the Apache License and the following modification to it: 7 // Section 6. Trademarks. is deleted and replaced with: 8 // 9 // 6. Trademarks. This License does not grant permission to use the trade 10 // names, trademarks, service marks, or product names of the Licensor 11 // and its affiliates, except as required to comply with Section 4(c) of 12 // the License and to reproduce the content of the NOTICE file. 13 // 14 // You may obtain a copy of the Apache License at 15 // 16 // http://www.apache.org/licenses/LICENSE-2.0 17 // 18 // Unless required by applicable law or agreed to in writing, software 19 // distributed under the Apache License with the above modification is 20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 21 // KIND, either express or implied. See the Apache License for the specific 22 // language governing permissions and limitations under the Apache License. 23 // 24 #ifndef PXR_BASE_GF_LINE2D_H 25 #define PXR_BASE_GF_LINE2D_H 26 27 /// \file gf/line2d.h 28 /// \ingroup group_gf_BasicGeometry 29 30 #include "pxr/pxr.h" 31 #include "pxr/base/gf/vec2d.h" 32 #include "pxr/base/gf/api.h" 33 34 #include <float.h> 35 36 PXR_NAMESPACE_OPEN_SCOPE 37 38 /// \class GfLine2d 39 /// \ingroup group_gf_BasicGeometry 40 /// 41 /// Basic type: 2D line 42 /// 43 /// This class represents a two-dimensional line in space. Lines are 44 /// constructed from a point, \p p0, and a direction, dir. The direction is 45 /// normalized in the constructor. 46 /// 47 /// The line is kept in a parametric represention, p = p0 + t * dir. 48 /// 49 class GfLine2d { 50 51 public: 52 53 /// The default constructor leaves line parameters undefined. GfLine2d()54 GfLine2d() { 55 } 56 57 /// Construct a line from a point and a direction. GfLine2d(const GfVec2d & p0,const GfVec2d & dir)58 GfLine2d(const GfVec2d &p0, const GfVec2d &dir ) { 59 Set( p0, dir ); 60 } 61 Set(const GfVec2d & p0,const GfVec2d & dir)62 double Set(const GfVec2d &p0, const GfVec2d &dir ) { 63 _p0 = p0; 64 _dir = dir; 65 return _dir.Normalize(); 66 } 67 68 /// Return the point on the line at \p ( p0 + t * dir ). 69 /// Remember dir has been normalized so t represents a unit distance. GetPoint(double t)70 GfVec2d GetPoint( double t ) const { return _p0 + _dir * t; } 71 72 /// Return the normalized direction of the line. GetDirection()73 const GfVec2d &GetDirection() const { return _dir; } 74 75 /// Returns the point on the line that is closest to \p point. If \p t is 76 /// not \c NULL, it will be set to the parametric distance along the line 77 /// of the returned point. 78 GF_API 79 GfVec2d FindClosestPoint(const GfVec2d &point, double *t = NULL) const; 80 81 /// Component-wise equality test. The starting points and directions, must 82 /// match exactly for lines to be considered equal. 83 bool operator ==(const GfLine2d &l) const { 84 return _p0 == l._p0 && _dir == l._dir; 85 } 86 87 /// Component-wise inequality test. The starting points, and directions 88 /// must match exactly for lines to be considered equal. 89 bool operator !=(const GfLine2d &r) const { 90 return ! (*this == r); 91 } 92 93 private: 94 GF_API 95 friend bool GfFindClosestPoints( const GfLine2d &, const GfLine2d &, 96 GfVec2d *, GfVec2d *, 97 double *, double *); 98 99 // Parametric description: 100 // l(t) = _p0 + t * _length * _dir; 101 GfVec2d _p0; 102 GfVec2d _dir; 103 }; 104 105 /// Computes the closets points between two lines. 106 /// 107 /// The two points are returned in \p p1 and \p p2. The parametric distance 108 /// of each point on the lines is returned in \p t1 and \p t2. 109 /// 110 /// This returns \c false if the lines were close enough to parallel that no 111 /// points could be computed; in this case, the other return values are 112 /// undefined. 113 GF_API 114 bool GfFindClosestPoints(const GfLine2d &l1, const GfLine2d &l2, 115 GfVec2d *p1 = nullptr, GfVec2d *p2 = nullptr, 116 double *t1 = nullptr, double *t2 = nullptr); 117 118 PXR_NAMESPACE_CLOSE_SCOPE 119 120 #endif // PXR_BASE_GF_LINE2D_H 121