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>
56 inline bool is_point_collinear(const segment<T, D>& segment,
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>
69 inline pointnd<T, D> intersection_point(const segment<T, D>& segment1,
70  const segment<T, D>& segment2,
71  const T& fuzzy = T(0.0));
72 
73 template <typename T, std::size_t D>
74 inline pointnd<T, D> intersection_point(const line<T, D>& line1,
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>
122 inline T inverse_chebyshev_distance(const pointnd<T, D>& point1,
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,
130  const hypersphere<T, D>& hypersphere);
131 
132 template <typename T, std::size_t D>
133 inline pointnd<T, D> closest_point_on_segment_from_point(
134  const segment<T, D>& segment, const pointnd<T, D>& point);
135 
136 template <typename T, std::size_t D>
137 inline pointnd<T, D> closest_point_on_line_from_point(
138  const line<T, D>& segment, const pointnd<T, D>& point);
139 
140 template <typename T, std::size_t D>
141 inline pointnd<T, D> closest_point_on_sphere_from_point(
142  const hypersphere<T, D>& sphere, const pointnd<T, D>& point);
143 
144 template <typename T, std::size_t D>
145 inline pointnd<T, D> closest_point_on_plane_from_point(
146  const plane<T, D>& plane, const pointnd<T, D>& point);
147 
148 template <typename T, std::size_t D>
149 inline pointnd<T, D> closest_point_on_box_from_point(
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>
167 inline segment<T, D> mirror(const segment<T, D>& segment,
168  const line<T, D>& mirror_axis);
169 
170 template <typename T, std::size_t D>
171 inline line<T, D> mirror(const line<T, D>& line,
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>
178 inline triangle<T, D> mirror(const triangle<T, D>& triangle,
179  const line<T, D>& mirror_axis);
180 
181 template <typename T, std::size_t D>
182 inline quadix<T, D> mirror(const quadix<T, D>& quadix,
183  const line<T, D>& mirror_axis);
184 
185 template <typename T, std::size_t D>
186 inline hypersphere<T, D> mirror(const hypersphere<T, D>& sphere,
187  const line<T, D>& mirror_axis);
188 
189 template <typename T, std::size_t D>
190 inline polygon<T, D> mirror(const polygon<T, D>& polygon,
191  const line<T, D>& mirror_axis);
192 
193 template <typename T, std::size_t D>
194 inline segment<T, D> project_onto_axis(const pointnd<T, D>& point,
195  const line<T, D>& axis);
196 
197 template <typename T, std::size_t D>
198 inline segment<T, D> project_onto_axis(const triangle<T, D>& triangle,
199  const line<T, D>& axis);
200 
201 template <typename T, std::size_t D>
202 inline segment<T, D> project_onto_axis(const box<T, D>& box,
203  const line<T, D>& axis);
204 
205 template <typename T, std::size_t D>
206 inline segment<T, D> project_onto_axis(const quadix<T, D>& quadix,
207  const line<T, D>& axis);
208 
209 template <typename T, std::size_t D>
210 inline segment<T, D> project_onto_axis(const hypersphere<T, D>& sphere,
211  const line<T, D>& axis);
212 
213 template <typename T, std::size_t D>
214 inline segment<T, D> project_onto_axis(const polygon<T, D>& polygon,
215  const line<T, D>& axis);
216 
217 template <typename T, std::size_t D>
218 inline T perimeter(const triangle<T, D>& triangle);
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>
227 inline pointnd<T, D> generate_random_point(const segment<T, D>& segment);
228 
229 template <typename T, std::size_t D>
230 inline pointnd<T, D> generate_random_point(const triangle<T, D>& triangle);
231 
232 template <typename T, std::size_t D>
233 inline pointnd<T, D> generate_random_point(const quadix<T, D>& quadix);
234 
235 template <typename T, std::size_t D>
236 inline pointnd<T, D> generate_random_point(const box<T, D>& box);
237 
238 template <typename T, std::size_t D, typename OutputIterator>
239 inline void generate_random_points(const box<T, D>& box,
240  const std::size_t& point_count,
241  OutputIterator out);
242 
243 template <typename T, std::size_t D, typename OutputIterator>
244 inline void generate_random_points(const segment<T, D>& segment,
245  const std::size_t& point_count,
246  OutputIterator out);
247 
248 template <typename T, std::size_t D, typename OutputIterator>
249 inline void generate_random_points(const triangle<T, D>& triangle,
250  const std::size_t& point_count,
251  OutputIterator out);
252 
253 template <typename T, std::size_t D, typename OutputIterator>
254 inline void generate_random_points(const quadix<T, D>& quadix,
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>
262 inline vectornd<T, D> normalize(const vectornd<T, D>& v);
263 
264 template <typename T, std::size_t D>
265 inline vectornd<T, D> operator+(const vectornd<T, D>& v1,
266  const vectornd<T, D>& v2);
267 
268 template <typename T, std::size_t D>
269 inline vectornd<T, D> operator-(const vectornd<T, D>& v1,
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>
294 inline pointnd<T, D> operator+(const pointnd<T, D>& point,
295  const vectornd<T, D>& v);
296 
297 template <typename T, std::size_t D>
298 inline pointnd<T, D> operator+(const vectornd<T, D>& v,
299  const pointnd<T, D>& point);
300 
301 template <typename T, std::size_t D>
302 inline vectornd<T, D> operator-(const pointnd<T, D>& p1,
303  const pointnd<T, D>& p2);
304 
305 template <typename T, std::size_t D>
306 inline pointnd<T, D> operator+(const pointnd<T, D>& p1,
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>
313 inline vectornd<T, 3> operator*(const vectornd<T, 3>& v1,
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>
341 inline pointnd<T, D> degenerate_pointnd();
342 
343 template <typename T, std::size_t D>
344 inline vectornd<T, D> degenerate_vectornd();
345 
346 template <typename T, std::size_t D>
347 inline ray<T, D> degenerate_raynd();
348 
349 template <typename T, std::size_t D>
350 inline line<T, D> degenerate_linend();
351 
352 template <typename T, std::size_t D>
353 inline segment<T, D> degenerate_segmentnd();
354 
355 template <typename T, std::size_t D>
356 inline triangle<T, D> degenerate_trianglend();
357 
358 template <typename T, std::size_t D>
359 inline quadix<T, D> degenerate_quadixnd();
360 
361 template <typename T, std::size_t D>
362 inline box<T, D> degenerate_box();
363 
364 template <typename T, std::size_t D>
365 inline hypersphere<T, D> degenerate_hypersphere();
366 
367 template <typename T, std::size_t D>
368 inline pointnd<T, D> positive_infinite_pointnd();
369 
370 template <typename T, std::size_t D>
371 inline pointnd<T, D> negative_infinite_pointnd();
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>
377 inline vectornd<T, D> make_vector(const pointnd<T, D>& point);
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>
384 inline segment<T, D> make_segment(const pointnd<T, D>& point1,
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>
396 inline triangle<T, D> make_triangle(const pointnd<T, D>& point1,
397  const pointnd<T, D>& point2,
398  const pointnd<T, D>& point3);
399 
400 template <typename T, std::size_t D>
401 inline quadix<T, D> make_quadix(const pointnd<T, D>& point1,
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>
407 inline hypersphere<T, D> make_sphere(const pointnd<T, D>& point,
408  const T& radius);
409 
410 template <typename T, std::size_t D>
411 inline hypersphere<T, D> make_sphere(const pointnd<T, D>& point1,
412  const pointnd<T, D>& point2);
413 
414 template <typename T, std::size_t D>
415 inline polygon<T, D> make_polygon(
416  const std::vector<pointnd<T, D> >& point_list);
417 
418 template <typename T, std::size_t D>
419 inline polygon<T, D> make_polygon(const triangle<T, D>& triangle);
420 
421 template <typename T, std::size_t D>
422 inline polygon<T, D> make_polygon(const quadix<T, D>& quadix);
423 
424 } // namespace wykobi
425 
426 #include "wykobi_nd.inl"
427 
428 #endif
wykobi::generate_random_points
void generate_random_points(const T &x1, const T &y1, const T &x2, const T &y2, const std::size_t &point_count, OutputIterator out)
wykobi::point_in_sphere
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)
wykobi::operator+
vector2d< T > operator+(const vector2d< T > &v1, const vector2d< T > &v2)
wykobi::lay_distance
T lay_distance(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi::intersect
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)
wykobi::chebyshev_distance
T chebyshev_distance(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi::operator-
vector2d< T > operator-(const vector2d< T > &v1, const vector2d< T > &v2)
wykobi::vector_norm
T vector_norm(const vector2d< T > &v)
wykobi::operator/
vector2d< T > operator/(const vector2d< T > &v1, const T &scale)
wykobi::not_equal
bool not_equal(const T &val1, const T &val2, const T &epsilon)
wykobi::positive_infinite_pointnd
pointnd< T, D > positive_infinite_pointnd()
wykobi::degenerate_vectornd
vectornd< T, D > degenerate_vectornd()
wykobi::is_point_collinear
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)
wykobi::line
Definition: wykobi.hpp:287
wykobi::dot_product
T dot_product(const vector2d< T > &v1, const vector2d< T > &v2)
wykobi::degenerate_trianglend
triangle< T, D > degenerate_trianglend()
wykobi_math.hpp
wykobi::degenerate_raynd
ray< T, D > degenerate_raynd()
wykobi::degenerate_box
box< T, D > degenerate_box()
wykobi::closest_point_on_line_from_point
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)
wykobi::operator<
bool operator<(const point2d< T > &point1, const point2d< T > &point2)
wykobi::manhattan_distance
T manhattan_distance(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi::inverse_chebyshev_distance
T inverse_chebyshev_distance(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi::closest_point_on_segment_from_point
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)
wykobi::negative_infinite_pointnd
pointnd< T, D > negative_infinite_pointnd()
wykobi::degenerate_linend
line< T, D > degenerate_linend()
wykobi::parallel
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))
wykobi::mirror
void mirror(const T &px, const T &py, const T &x1, const T &y1, const T &x2, const T &y2, T &nx, T &ny)
wykobi::generate_random_point
point2d< T > generate_random_point(const T &dx, const T &dy)
wykobi::perimeter
T perimeter(const point2d< T > &point1, const point2d< T > &point2, const point2d< T > &point3)
wykobi::robust_collinear
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))
wykobi::project_point
void project_point(const T &srcx, const T &srcy, const T &destx, const T &desty, const T &dist, T &nx, T &ny)
wykobi::make_ray
ray< T, 2 > make_ray(const T &ox, const T &oy, const T &dir_x, const T &dir_y)
wykobi::make_triangle
triangle< T, 2 > make_triangle(const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3)
wykobi::normalize
vector2d< T > normalize(const vector2d< T > &v)
wykobi::point_in_box
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)
wykobi::perpendicular
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))
wykobi::epsilon
T epsilon()
wykobi::operator>
bool operator>(const point2d< T > &point1, const point2d< T > &point2)
wykobi::make_line
line< T, 2 > make_line(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi.hpp
wykobi::closest_point_on_box_from_point
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)
wykobi::project_point_t
void project_point_t(const T &srcx, const T &srcy, const T &destx, const T &desty, const T &t, T &nx, T &ny)
wykobi::intersection_point
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)
wykobi::closest_point_on_sphere_from_point
point3d< T > closest_point_on_sphere_from_point(const sphere< T > &sphere, const point3d< T > &point)
wykobi::make_box
box< T, 3 > make_box(const T &x1, const T &y1, const T &z1, const T &x2, const T &y2, const T &z2)
wykobi::make_polygon
polygon< T, D > make_polygon(const InputIterator begin, const InputIterator end)
wykobi::swap
void swap(point2d< T > &point1, point2d< T > &point2)
wykobi::degenerate_quadixnd
quadix< T, D > degenerate_quadixnd()
wykobi::degenerate_hypersphere
hypersphere< T, D > degenerate_hypersphere()
wykobi::make_vector
vector2d< T > make_vector(const T &x, const T &y)
wykobi::project_onto_axis
segment< T, 2 > project_onto_axis(const point2d< T > &point, const line< T, 2 > &axis)
wykobi
Definition: wykobi.hpp:32
wykobi::operator*
T operator*(const vector2d< T > &v1, const vector2d< T > &v2)
wykobi::degenerate_pointnd
pointnd< T, D > degenerate_pointnd()
wykobi::scale
point2d< T > scale(const T &dx, const T &dy, const point2d< T > &point)
wykobi::degenerate_segmentnd
segment< T, D > degenerate_segmentnd()
wykobi::is_equal
bool is_equal(const T &val1, const T &val2, const T &epsilon)
wykobi::make_quadix
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)
wykobi::closest_point_on_plane_from_point
point3d< T > closest_point_on_plane_from_point(const plane< T, 3 > &plane, const point3d< T > &point)
wykobi::make_sphere
sphere< T > make_sphere(const T &x, const T &y, const T &z, const T &radius)
wykobi::operator==
bool operator==(const point2d< T > &point1, const point2d< T > &point2)
wykobi::distance
T distance(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi::make_segment
segment< T, 2 > make_segment(const T &x1, const T &y1, const T &x2, const T &y2)
wykobi::collinear
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))