Point Cloud Library (PCL)  1.9.1-dev
opennurbs_line.h
1 /* \$NoKeywords: \$ */
2 /*
3 //
5 // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6 // McNeel & Associates.
7 //
8 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9 // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10 // MERCHANTABILITY ARE HEREBY DISCLAIMED.
11 //
12 // For complete openNURBS copyright information see <http://www.opennurbs.org>.
13 //
14 ////////////////////////////////////////////////////////////////
15 */
16
17 #if !defined(ON_LINE_INC_)
18 #define ON_LINE_INC_
19
20 class ON_CLASS ON_Line
21 {
22 public:
23
24  ON_Line();
25  ON_Line( const ON_3dPoint& start, const ON_3dPoint& end );
26  ~ON_Line();
27
28  /*
29  Returns:
30  True if from != to.
31  */
32  bool IsValid() const;
33
34  // line[0] = start point line[1] = end point
35  ON_3dPoint& operator[](int);
36  const ON_3dPoint& operator[](int) const;
37
38
39  // Description:
40  // Create a line from two points.
41  // Parameters:
42  // start - [in] point at start of line segment
43  // end - [in] point at end of line segment
44  // Returns:
45  // true if start and end are distinct points.
46  bool Create(
47  const ON_3dPoint& start,
48  const ON_3dPoint& end
49  );
50
51  /*
52  Description:
53  Get line's 3d axis aligned bounding box.
54  Returns:
55  3d bounding box.
56  */
57  ON_BoundingBox BoundingBox() const;
58
59  /*
60  Description:
61  Get line's 3d axis aligned bounding box or the
62  union of the input box with the object's bounding box.
63  Parameters:
64  bbox - [in/out] 3d axis aligned bounding box
65  bGrowBox - [in] (default=false)
66  If true, then the union of the input bbox and the
67  object's bounding box is returned in bbox.
68  If false, the object's bounding box is returned in bbox.
69  Returns:
70  true if object has bounding box and calculation was successful.
71  */
72  bool GetBoundingBox(
73  ON_BoundingBox& bbox,
74  int bGrowBox = false
75  ) const;
76
77  /*
78  Description:
79  Get tight bounding box.
80  Parameters:
81  tight_bbox - [in/out] tight bounding box
82  bGrowBox -[in] (default=false)
83  If true and the input tight_bbox is valid, then returned
84  tight_bbox is the union of the input tight_bbox and the
85  line's tight bounding box.
86  xform -[in] (default=NULL)
87  If not NULL, the tight bounding box of the transformed
88  line is calculated. The line is not modified.
89  Returns:
90  True if a valid tight_bbox is returned.
91  */
92  bool GetTightBoundingBox(
93  ON_BoundingBox& tight_bbox,
94  int bGrowBox = false,
95  const ON_Xform* xform = 0
96  ) const;
97
98  /*
99  Description:
100  Get a plane that contains the line.
101  Parameters:
102  plane - [out] a plane that contains the line. The orgin
103  of the plane is at the start of the line. The distance
104  from the end of the line to the plane is <= tolerance.
105  If possible a plane parallel to the world xy, yz or zx
106  plane is returned.
107  tolerance - [in]
108  Returns:
109  true if a coordinate of the line's direction vector is
110  larger than tolerance.
111  */
112  bool InPlane( ON_Plane& plane, double tolerance = 0.0 ) const;
113
114  // Returns:
115  // Length of line
116  double Length() const;
117
118  // Returns:
119  // direction vector = line.to - line.from
121  // ON_Line::Tangent
122  ON_3dVector Direction() const;
123
124  // Returns:
125  // Unit tangent vector.
127  // ON_Line::Direction
128  ON_3dVector Tangent() const;
129
130  /*
131  Description:
132  Evaluate point on (infinite) line.
133  Parameters:
134  t - [in] evaluation parameter. t=0 returns line.from
135  and t=1 returns line.to.
136  Returns:
137  (1-t)*line.from + t*line.to.
139  ON_Line::Direction
140  ON_Line::Tangent
141  */
142  ON_3dPoint PointAt(
143  double t
144  ) const;
145
146  /*
147  Description:
148  Find the point on the (infinite) line that is
149  closest to the test_point.
150  Parameters:
151  test_point - [in]
152  t - [out] line.PointAt(*t) is the point on the line
153  that is closest to test_point.
154  Returns:
155  true if successful.
156  */
157  bool ClosestPointTo(
158  const ON_3dPoint& test_point,
159  double* t
160  ) const;
161
162  /*
163  Description:
164  Find the point on the (infinite) line that is
165  closest to the test_point.
166  Parameters:
167  test_point - [in]
168  Returns:
169  The point on the line that is closest to test_point.
170  */
171  ON_3dPoint ClosestPointTo(
172  const ON_3dPoint& test_point
173  ) const;
174
175  /*
176  Description:
177  Find the point on the (infinite) line that is
178  closest to the test_point.
179  Parameters:
180  test_point - [in]
181  Returns:
182  distance from the point on the line that is closest
183  to test_point.
185  ON_3dPoint::DistanceTo
186  ON_Line::ClosestPointTo
187  */
188  double DistanceTo( ON_3dPoint test_point ) const;
189
190
191  /*
192  Description:
193  Finds the shortest distance between the line as a finite
194  chord and the other object.
195  Parameters:
196  P - [in]
197  L - [in] (another finite chord)
198  Returns:
199  A value d such that if Q is any point on
200  this line and P is any point on the other object,
201  then d <= Q.DistanceTo(P).
202  */
203  double MinimumDistanceTo( const ON_3dPoint& P ) const;
204  double MinimumDistanceTo( const ON_Line& L ) const;
205
206  /*
207  Description:
208  Finds the longest distance between the line as a finite
209  chord and the other object.
210  Parameters:
211  P - [in]
212  L - [in] (another finite chord)
213  Returns:
214  A value d such that if Q is any point on this line and P is any
215  point on the other object, then d >= Q.DistanceTo(P).
216  */
217  double MaximumDistanceTo( const ON_3dPoint& P ) const;
218  double MaximumDistanceTo( const ON_Line& other ) const;
219
220
221  /*
222  Description:
223  Quickly determine if the shortest distance from
224  this line to the other object is greater than d.
225  Parameters:
226  d - [in] distance (> 0.0)
227  P - [in]
228  L - [in]
229  Returns:
230  True if if the shortest distance from this line
231  to the other object is greater than d.
232  */
233  bool IsFartherThan( double d, const ON_3dPoint& P ) const;
234  bool IsFartherThan( double d, const ON_Line& L ) const;
235
236
237  // For intersections see ON_Intersect();
238
239  // Description:
240  // Reverse line by swapping from and to.
241  void Reverse();
242
243  bool Transform(
244  const ON_Xform& xform
245  );
246
247  // rotate line about a point and axis
248  bool Rotate(
249  double sin_angle,
250  double cos_angle,
251  const ON_3dVector& axis_of_rotation,
252  const ON_3dPoint& center_of_rotation
253  );
254
255  bool Rotate(
257  const ON_3dVector& axis_of_rotation,
258  const ON_3dPoint& center_of_rotation
259  );
260
261  bool Translate(
262  const ON_3dVector& delta
263  );
264
265 public:
266  ON_3dPoint from; // start point
267  ON_3dPoint to; // end point
268 };
269
270 #endif
ON_3dPoint to
ON_3dPoint from