wykobi_nd.hpp
Go to the documentation of this file.
1 /*
2 (***********************************************************************)
3 (* *)
4 (* Wykobi Computational Geometry Library *)
5 (* Release Version 0.0.5 *)
6 (* http://www.wykobi.com *)
7 (* Copyright (c) 2005-2017 Arash Partow, All Rights Reserved. *)
8 (* *)
9 (* The Wykobi computational geometry library and its components are *)
10 (* supplied under the terms of the open source MIT License. *)
11 (* The contents of the Wykobi computational geometry library and its *)
12 (* components may not be copied or disclosed except in accordance with *)
13 (* the terms of the MIT License. *)
14 (* *)
15 (* URL: https://opensource.org/licenses/MIT *)
16 (* *)
17 (***********************************************************************)
18 */
19 
20 #ifndef INCLUDE_WYKOBI_ND
21 #define INCLUDE_WYKOBI_ND
22 
23 #include <algorithm>
24 #include <cassert>
25 #include <limits>
26 #include <vector>
27 
28 #include "wykobi.hpp"
29 #include "wykobi_math.hpp"
30 
31 namespace wykobi {
32 template <typename T, std::size_t D>
33 inline bool parallel(const line<T, D>& line1, const line<T, D>& line2);
34 
35 template <typename T, std::size_t D>
36 inline bool parallel(const segment<T, D>& segment1,
37  const segment<T, D>& segment2);
38 
39 template <typename T, std::size_t D>
40 inline bool perpendicular(const line<T, D>& line1, const line<T, D>& line2);
41 
42 template <typename T, std::size_t D>
43 inline bool perpendicular(const segment<T, D>& segment1,
44  const segment<T, D>& segment2);
45 
46 template <typename T, std::size_t D>
47 inline bool collinear(const pointnd<T, D>& point1, const pointnd<T, D>& point2,
48  const pointnd<T, D>& point3);
49 
50 template <typename T, std::size_t D>
51 inline bool robust_collinear(const pointnd<T, D>& point1,
52  const pointnd<T, D>& point2,
53  const pointnd<T, D>& point3);
54 
55 template <typename T, std::size_t D>
57  const pointnd<T, D>& point,
58  const bool robust = false);
59 
60 template <typename T, std::size_t D>
61 inline bool intersect(const segment<T, D>& segment1,
62  const segment<T, D>& segment2, const T& fuzzy = T(0.0));
63 
64 template <typename T, std::size_t D>
65 inline bool intersect(const line<T, D>& line1, const line<T, D>& line2,
66  const T& fuzzy = T(0.0));
67 
68 template <typename T, std::size_t D>
70  const segment<T, D>& segment2,
71  const T& fuzzy = T(0.0));
72 
73 template <typename T, std::size_t D>
75  const line<T, D>& line2,
76  const T& fuzzy = T(0.0));
77 
78 template <typename T, std::size_t D>
79 inline T distance(const pointnd<T, D>& point1, const pointnd<T, D>& point2);
80 
81 template <typename T, std::size_t D>
82 inline T distance(const pointnd<T, D>& point, const segment<T, D>& segment);
83 
84 template <typename T, std::size_t D>
85 inline T distance(const pointnd<T, D>& point, const line<T, D>& line);
86 
87 template <typename T, std::size_t D>
88 inline T distance(const segment<T, D>& segment1, const segment<T, D>& segment2);
89 
90 template <typename T, std::size_t D>
91 inline T distance(const line<T, D>& line1, const line<T, D>& line2);
92 
93 template <typename T, std::size_t D>
94 inline T lay_distance(const pointnd<T, D>& point1, const pointnd<T, D>& point2);
95 
96 template <typename T, std::size_t D>
97 inline T lay_distance(const pointnd<T, D>& point, const segment<T, D>& segment);
98 
99 template <typename T, std::size_t D>
100 inline T lay_distance(const pointnd<T, D>& point, const line<T, D>& line);
101 
102 template <typename T, std::size_t D>
103 inline T lay_distance(const segment<T, D>& segment1,
104  const segment<T, D>& segment2);
105 
106 template <typename T, std::size_t D>
107 inline T lay_distance(const line<T, D>& line1, const line<T, D>& line2);
108 
109 template <typename T, std::size_t D>
110 inline T manhattan_distance(const pointnd<T, D>& point1,
111  const pointnd<T, D>& point2);
112 
113 template <typename T, std::size_t D>
114 inline T chebyshev_distance(const pointnd<T, D>& point1,
115  const pointnd<T, D>& point2);
116 
117 template <typename T, std::size_t D>
118 inline T manhattan_distance(const pointnd<T, D>& point1,
119  const pointnd<T, D>& point2);
120 
121 template <typename T, std::size_t D>
123  const pointnd<T, D>& point2);
124 
125 template <typename T, std::size_t D>
126 inline bool point_in_box(const pointnd<T, D>& point, const box<T, D>& box);
127 
128 template <typename T, std::size_t D>
129 inline bool point_in_sphere(const pointnd<T, D>& point,
131 
132 template <typename T, std::size_t D>
134  const segment<T, D>& segment, const pointnd<T, D>& point);
135 
136 template <typename T, std::size_t D>
138  const line<T, D>& segment, const pointnd<T, D>& point);
139 
140 template <typename T, std::size_t D>
142  const hypersphere<T, D>& sphere, const pointnd<T, D>& point);
143 
144 template <typename T, std::size_t D>
146  const plane<T, D>& plane, const pointnd<T, D>& point);
147 
148 template <typename T, std::size_t D>
150  const box<T, D>& box, const pointnd<T, D>& point);
151 
152 template <typename T, std::size_t D>
153 inline pointnd<T, D> project_point_t(const pointnd<T, D>& source_point,
154  const pointnd<T, D>& destination_point,
155  const T& t);
156 
157 template <typename T, std::size_t D>
158 inline pointnd<T, D> project_point(const pointnd<T, D>& source_point,
159  const pointnd<T, D>& destination_point,
160  const T& distance);
161 
162 template <typename T, std::size_t D>
163 inline pointnd<T, D> mirror(const pointnd<T, D>& point,
164  const line<T, D>& mirror_axis);
165 
166 template <typename T, std::size_t D>
168  const line<T, D>& mirror_axis);
169 
170 template <typename T, std::size_t D>
172  const wykobi::line<T, D>& mirror_axis);
173 
174 template <typename T, std::size_t D>
175 inline box<T, D> mirror(const box<T, D>& box, const line<T, D>& mirror_axis);
176 
177 template <typename T, std::size_t D>
179  const line<T, D>& mirror_axis);
180 
181 template <typename T, std::size_t D>
183  const line<T, D>& mirror_axis);
184 
185 template <typename T, std::size_t D>
187  const line<T, D>& mirror_axis);
188 
189 template <typename T, std::size_t D>
191  const line<T, D>& mirror_axis);
192 
193 template <typename T, std::size_t D>
195  const line<T, D>& axis);
196 
197 template <typename T, std::size_t D>
199  const line<T, D>& axis);
200 
201 template <typename T, std::size_t D>
203  const line<T, D>& axis);
204 
205 template <typename T, std::size_t D>
207  const line<T, D>& axis);
208 
209 template <typename T, std::size_t D>
211  const line<T, D>& axis);
212 
213 template <typename T, std::size_t D>
215  const line<T, D>& axis);
216 
217 template <typename T, std::size_t D>
219 
220 template <typename T, std::size_t D>
221 inline T perimeter(const quadix<T, D>& quadix);
222 
223 template <typename T, std::size_t D>
224 inline T perimeter(const polygon<T, D>& polygon);
225 
226 template <typename T, std::size_t D>
228 
229 template <typename T, std::size_t D>
231 
232 template <typename T, std::size_t D>
234 
235 template <typename T, std::size_t D>
237 
238 template <typename T, std::size_t D, typename OutputIterator>
240  const std::size_t& point_count,
241  OutputIterator out);
242 
243 template <typename T, std::size_t D, typename OutputIterator>
245  const std::size_t& point_count,
246  OutputIterator out);
247 
248 template <typename T, std::size_t D, typename OutputIterator>
250  const std::size_t& point_count,
251  OutputIterator out);
252 
253 template <typename T, std::size_t D, typename OutputIterator>
255  const std::size_t& point_count,
256  OutputIterator out);
257 
258 template <typename T, std::size_t D>
259 inline T vector_norm(const vectornd<T, D>& v);
260 
261 template <typename T, std::size_t D>
263 
264 template <typename T, std::size_t D>
266  const vectornd<T, D>& v2);
267 
268 template <typename T, std::size_t D>
270  const vectornd<T, D>& v2);
271 
272 template <typename T, std::size_t D>
273 inline T dot_product(const vectornd<T, D>& v1, const vectornd<T, D>& v2);
274 
275 template <typename T, std::size_t D>
276 inline vectornd<T, D> operator*(const vectornd<T, D>& v1, const T& scale);
277 
278 template <typename T, std::size_t D>
279 inline vectornd<T, D> operator*(const T& scale, const vectornd<T, D>& v1);
280 
281 template <typename T, std::size_t D>
282 inline pointnd<T, D> operator*(const pointnd<T, D>& point, const T& scale);
283 
284 template <typename T, std::size_t D>
285 inline pointnd<T, D> operator*(const T& scale, const pointnd<T, D>& point);
286 
287 template <typename T, std::size_t D>
288 inline vectornd<T, D> operator/(const vectornd<T, D>& v1, const T& scale);
289 
290 template <typename T, std::size_t D>
291 inline pointnd<T, D> operator/(const pointnd<T, D>& point, const T& scale);
292 
293 template <typename T, std::size_t D>
295  const vectornd<T, D>& v);
296 
297 template <typename T, std::size_t D>
299  const pointnd<T, D>& point);
300 
301 template <typename T, std::size_t D>
303  const pointnd<T, D>& p2);
304 
305 template <typename T, std::size_t D>
307  const pointnd<T, D>& p2);
308 
309 template <typename T>
310 inline T operator*(const vectornd<T, 2>& v1, const vectornd<T, 2>& v2);
311 
312 template <typename T>
314  const vectornd<T, 3>& v2);
315 
316 template <typename T, std::size_t D>
317 inline bool operator<(const pointnd<T, D>& point1, const pointnd<T, D>& point2);
318 
319 template <typename T, std::size_t D>
320 inline bool operator>(const pointnd<T, D>& point1, const pointnd<T, D>& point2);
321 
322 template <typename T, std::size_t D>
323 inline bool operator==(const pointnd<T, D>& point1,
324  const pointnd<T, D>& point2);
325 
326 template <typename T, std::size_t D>
327 inline bool is_equal(const pointnd<T, D>& point1, const pointnd<T, D>& point2,
328  const T& epsilon);
329 
330 template <typename T, std::size_t D>
331 inline bool is_equal(const pointnd<T, D>& point1, const pointnd<T, D>& point2);
332 
333 template <typename T, std::size_t D>
334 inline bool not_equal(const pointnd<T, D>& point1, const pointnd<T, D>& point2,
335  const T& epsilon);
336 
337 template <typename T, std::size_t D>
338 inline bool not_equal(const pointnd<T, D>& point1, const pointnd<T, D>& point2);
339 
340 template <typename T, std::size_t D>
342 
343 template <typename T, std::size_t D>
345 
346 template <typename T, std::size_t D>
348 
349 template <typename T, std::size_t D>
351 
352 template <typename T, std::size_t D>
354 
355 template <typename T, std::size_t D>
357 
358 template <typename T, std::size_t D>
360 
361 template <typename T, std::size_t D>
363 
364 template <typename T, std::size_t D>
366 
367 template <typename T, std::size_t D>
369 
370 template <typename T, std::size_t D>
372 
373 template <typename T, std::size_t D>
374 inline void swap(pointnd<T, D>& point1, pointnd<T, D>& point2);
375 
376 template <typename T, std::size_t D>
378 
379 template <typename T, std::size_t D>
380 inline ray<T, D> make_ray(const pointnd<T, D>& origin,
381  const vectornd<T, D>& direction);
382 
383 template <typename T, std::size_t D>
385  const pointnd<T, D>& point2);
386 
387 template <typename T, std::size_t D>
388 inline line<T, D> make_line(const pointnd<T, D>& point1,
389  const pointnd<T, D>& point2);
390 
391 template <typename T, std::size_t D>
392 inline box<T, D> make_box(const pointnd<T, D>& point1,
393  const pointnd<T, D>& point2);
394 
395 template <typename T, std::size_t D>
397  const pointnd<T, D>& point2,
398  const pointnd<T, D>& point3);
399 
400 template <typename T, std::size_t D>
402  const pointnd<T, D>& point2,
403  const pointnd<T, D>& point3,
404  const pointnd<T, D>& point4);
405 
406 template <typename T, std::size_t D>
408  const T& radius);
409 
410 template <typename T, std::size_t D>
412  const pointnd<T, D>& point2);
413 
414 template <typename T, std::size_t D>
416  const std::vector<pointnd<T, D> >& point_list);
417 
418 template <typename T, std::size_t D>
420 
421 template <typename T, std::size_t D>
423 
424 } // namespace wykobi
425 
426 #include "wykobi_nd.inl"
427 
428 #endif
Definition: wykobi.hpp:702
Definition: wykobi.hpp:440
Definition: wykobi.hpp:287
Definition: wykobi.hpp:688
Definition: wykobi.hpp:166
Definition: wykobi.hpp:383
Definition: wykobi.hpp:359
Definition: wykobi.hpp:674
Definition: wykobi.hpp:263
Definition: wykobi.hpp:433
Definition: wykobi.hpp:311
Definition: wykobi.hpp:614
Definition: wykobi.hpp:32
point3d< T > closest_point_on_plane_from_point(const plane< T, 3 > &plane, const point3d< T > &point)
T manhattan_distance(const T &x1, const T &y1, const T &x2, const T &y2)
T vector_norm(const vector2d< T > &v)
polygon< T, D > make_polygon(const InputIterator begin, const InputIterator end)
sphere< T > make_sphere(const T &x, const T &y, const T &z, const T &radius)
segment< T, 2 > make_segment(const T &x1, const T &y1, const T &x2, const T &y2)
ray< T, 2 > make_ray(const T &ox, const T &oy, const T &dir_x, const T &dir_y)
void swap(point2d< T > &point1, point2d< T > &point2)
bool is_point_collinear(const T &x1, const T &y1, const T &x2, const T &y2, const T &px, const T &py, const bool robust=false)
void project_point(const T &srcx, const T &srcy, const T &destx, const T &desty, const T &dist, T &nx, T &ny)
vectornd< T, D > degenerate_vectornd()
bool parallel(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &x4, const T &y4, const T &epsilon=T(Epsilon))
T epsilon()
bool perpendicular(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &x4, const T &y4, const T &epsilon=T(Epsilon))
bool intersect(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &x4, const T &y4)
bool operator<(const point2d< T > &point1, const point2d< T > &point2)
triangle< T, D > degenerate_trianglend()
bool is_equal(const T &val1, const T &val2, const T &epsilon)
bool collinear(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &epsilon=T(Epsilon))
quadix< T, 2 > make_quadix(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &x4, const T &y4)
point3d< T > closest_point_on_sphere_from_point(const sphere< T > &sphere, const point3d< T > &point)
T perimeter(const point2d< T > &point1, const point2d< T > &point2, const point2d< T > &point3)
pointnd< T, D > negative_infinite_pointnd()
void project_point_t(const T &srcx, const T &srcy, const T &destx, const T &desty, const T &t, T &nx, T &ny)
vector2d< T > operator+(const vector2d< T > &v1, const vector2d< T > &v2)
bool operator>(const point2d< T > &point1, const point2d< T > &point2)
void closest_point_on_line_from_point(const T &x1, const T &y1, const T &x2, const T &y2, const T &px, const T &py, T &nx, T &ny)
ray< T, D > degenerate_raynd()
void closest_point_on_box_from_point(const T &x1, const T &y1, const T &z1, const T &x2, const T &y2, const T &z2, const T &px, const T &py, const T &pz, T &nx, T &ny, T &nz)
bool robust_collinear(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &epsilon=T(Epsilon))
void closest_point_on_segment_from_point(const T &x1, const T &y1, const T &x2, const T &y2, const T &px, const T &py, T &nx, T &ny)
bool not_equal(const T &val1, const T &val2, const T &epsilon)
box< T, 3 > make_box(const T &x1, const T &y1, const T &z1, const T &x2, const T &y2, const T &z2)
pointnd< T, D > degenerate_pointnd()
T chebyshev_distance(const T &x1, const T &y1, const T &x2, const T &y2)
point2d< T > generate_random_point(const T &dx, const T &dy)
bool point_in_sphere(const T &px, const T &py, const T &pz, const T &cx, const T &cy, const T &cz, const T &radius)
T lay_distance(const T &x1, const T &y1, const T &x2, const T &y2)
hypersphere< T, D > degenerate_hypersphere()
void intersection_point(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3, const T &x4, const T &y4, T &ix, T &iy)
segment< T, D > degenerate_segmentnd()
void generate_random_points(const T &x1, const T &y1, const T &x2, const T &y2, const std::size_t &point_count, OutputIterator out)
line< T, D > degenerate_linend()
T operator*(const vector2d< T > &v1, const vector2d< T > &v2)
triangle< T, 2 > make_triangle(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3)
segment< T, 2 > project_onto_axis(const point2d< T > &point, const line< T, 2 > &axis)
bool operator==(const point2d< T > &point1, const point2d< T > &point2)
vector2d< T > operator/(const vector2d< T > &v1, const T &scale)
void mirror(const T &px, const T &py, const T &x1, const T &y1, const T &x2, const T &y2, T &nx, T &ny)
box< T, D > degenerate_box()
vector2d< T > operator-(const vector2d< T > &v1, const vector2d< T > &v2)
pointnd< T, D > positive_infinite_pointnd()
T dot_product(const vector2d< T > &v1, const vector2d< T > &v2)
vector2d< T > make_vector(const T &x, const T &y)
quadix< T, D > degenerate_quadixnd()
bool point_in_box(const T &px, const T &py, const T &pz, const T &x1, const T &y1, const T &z1, const T &x2, const T &y2, const T &z2)
point2d< T > scale(const T &dx, const T &dy, const point2d< T > &point)
T inverse_chebyshev_distance(const T &x1, const T &y1, const T &x2, const T &y2)
line< T, 2 > make_line(const T &x1, const T &y1, const T &x2, const T &y2)
vector2d< T > normalize(const vector2d< T > &v)
T distance(const T &x1, const T &y1, const T &x2, const T &y2)