Assignments
Assignments
geometry.h
Go to the documentation of this file.
1/*
2Copyright (c) 2019, Michael Kazhdan
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without modification,
6are permitted provided that the following conditions are met:
7
8Redistributions of source code must retain the above copyright notice, this list of
9conditions and the following disclaimer. Redistributions in binary form must reproduce
10the above copyright notice, this list of conditions and the following disclaimer
11in the documentation and/or other materials provided with the distribution.
12
13Neither the name of the Johns Hopkins University nor the names of its contributors
14may be used to endorse or promote products derived from this software without specific
15prior written permission.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
18EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
19OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
20SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26DAMAGE.
27*/
28
29#ifndef GEOMETRY_INCLUDED
30#define GEOMETRY_INCLUDED
31
32#include <iostream>
33#include <string>
34#include <limits>
35#include <Util/algebra.h>
36
37namespace Util
38{
39 static const double Pi = 3.1415926535897932384;
40 static const double Epsilon = 1e-10;
41 static const double Infinity = std::numeric_limits< double >::infinity();
42
43 /*** This is a simple class defining globally accessible variables. */
45 {
46 static bool DebugFlag;
47 };
48
50 template< unsigned int Dim >
51 class Point : public InnerProductSpace< Point< Dim > >
52 {
54 double _p[Dim];
55
57 void _init( const double *values , unsigned int sz );
58 public:
60 Point( void );
61
63 Point( const Point &p );
64
66 template< typename ... Doubles >
67 Point( Doubles ... values );
68
70 double &operator[] ( int index );
71
73 const double &operator[] ( int index ) const;
74
76 Point operator * ( const Point &p ) const;
77
79 Point &operator *= ( const Point &p );
80
82 Point operator / ( const Point &p ) const;
83
85 Point& operator /= ( const Point &p );
86
88 template< typename ... Points >
89 static Point CrossProduct( Points ... points );
90
92 static Point CrossProduct( Point *points );
93
95 static Point CrossProduct( const Point *points );
96
98 // InnerProductSpace methods //
100
102 Point operator * ( double s ) const;
103
105 Point operator + ( const Point &p ) const;
106
108 double dot( const Point &p ) const;
109 };
110
112 template<> class Point< 0 >{};
113
115 template< unsigned int Dim >
116 std::ostream &operator << ( std::ostream &stream , const Point< Dim > &p );
117
119 template< unsigned int Dim >
120 std::istream &operator >> ( std::istream &stream , Point< Dim > &p );
121
124 template< unsigned int Rows , unsigned int Cols , typename MatrixType , typename MatrixTransposeType >
126 {
128 double _m[Rows][Cols];
129 public:
131 _BaseMatrix( void );
132
134 double &operator() ( int r , int c );
135
137 const double &operator() ( int r , int c ) const;
138
140 MatrixTransposeType transpose( void ) const;
141
143 Point< Rows > operator * ( const Point< Cols > &p ) const;
144
146 // Algebra methods //
148
149 MatrixType operator * ( double s ) const;
150
152 MatrixType operator + ( const MatrixType &m ) const;
153
155 // InnerProductSpace methods //
157
158 double dot( const _BaseMatrix &p ) const;
159 };
160
161
162 template< unsigned int Rows , unsigned int Cols > class Matrix;
163
166 template< unsigned int Rows , unsigned int Cols >
167 class Matrix : public _BaseMatrix< Rows , Cols , Matrix< Rows , Cols > , Matrix< Cols , Rows > > , InnerProductSpace< Matrix< Rows , Cols > >
168 {
169 public:
175
177 Matrix( void );
178
180 template< unsigned int _Cols >
182 };
183
185 template< unsigned int Dim >
186 class Matrix< Dim , Dim > : public _BaseMatrix< Dim , Dim , Matrix< Dim , Dim > , Matrix< Dim , Dim > > , public InnerProductSpace< Matrix< Dim , Dim > > , Algebra< Matrix< Dim , Dim > >
187 {
188 public:
194
196 Matrix( void );
197
200
203
205 double subDeterminant( int r , int c ) const;
206
208 double determinant( void ) const;
209
211 double trace( void ) const;
212
215 Matrix inverse( void ) const;
216
219 bool setInverse( Matrix &m ) const;
220
222 Point< Dim-1 > operator * ( const Point< Dim-1 > &p ) const;
223
225 static Matrix Identity( void );
226
228 static Matrix Log( const Matrix &m , double eps=0.0001 );
229
231 static Matrix SquareRoot( const Matrix &m , double eps=0.000001 );
232
235 void SVD( Matrix &r1 , Matrix &diagonal , Matrix &r2 ) const;
236
238 Matrix symmetrize( void ) const;
239
241 Matrix skewSymmetrize( void ) const;
242
244 static Matrix Exp( const Matrix &m , int terms=100 );
245
247 Matrix closestRotation( void ) const;
248
250 // Algebra methods //
252
253 template< unsigned int Cols >
255 };
256
258 template< unsigned int Rows , unsigned int Cols , typename MatrixType , typename MatrixTransposeType >
259 std::ostream &operator << ( std::ostream &stream , const _BaseMatrix< Rows , Cols , MatrixType , MatrixTransposeType > &m );
260
262 template< unsigned int Rows , unsigned int Cols , typename MatrixType , typename MatrixTransposeType >
263 std::istream &operator >> ( std::istream &stream , _BaseMatrix< Rows , Cols , MatrixType , MatrixTransposeType > &m );
264
265
267 template< unsigned int Dim >
268 class Plane
269 {
270 public:
274 double distance;
275
277 Plane( void );
278
280 Plane( const Point< Dim > &n , const Point< Dim > &p );
281
283 template< typename ... Points >
284 Plane( Points ... points );
285
287 Plane( Point< Dim > *points );
288
290 Plane( const Point< Dim > *points );
291
293 double operator()( const Point< Dim > &p ) const;
294 };
295
297 template< unsigned int Dim >
298 class Ray
299 {
300 public:
303
306
308 Ray( void );
309
312
314 Ray operator + ( const Point< Dim > &p ) const;
315
317 Ray &operator += ( const Point< Dim > &p );
318
320 Ray operator - ( const Point< Dim > &p ) const;
321
323 Ray &operator -= ( const Point< Dim > &p );
324
326 Point< Dim > operator() ( double t ) const;
327 };
328
330 template< unsigned int Dim >
332
334 template< unsigned int Dim >
335 std::ostream &operator << ( std::ostream &stream , const Ray< Dim > &ray )
336 {
337 stream << "[ " << ray.position << " ] [ " << ray.direction << " ]";
338 return stream;
339 }
340
343 template< unsigned int Dim >
345 {
346 template< unsigned int _Dim >
348
351 public:
353 BoundingBox( void );
354
356 BoundingBox( const Point< Dim > &p1 , const Point< Dim > &p2 );
357
359 BoundingBox( const Point< Dim > *pList , int pSize );
360
363 Point< Dim > &operator[] ( int index );
364
367 const Point< Dim > &operator[] ( int index ) const;
368
371 BoundingBox operator + ( const BoundingBox &b ) const;
372
376
378 BoundingBox operator ^ ( const BoundingBox &b ) const;
379
382
384 bool isInside( const Point< Dim > &p ) const;
385
387 bool isEmpty( void ) const;
388
391 BoundingBox< 1 > intersect( const Ray< Dim > &ray ) const;
392 };
393
394 template< unsigned int Dim > struct QuadricBoundingBoxIntersectionInfo;
395
397 template< unsigned int Dim >
399 {
402 double _C;
403
404 template< unsigned int _Dim >
405 friend class Quadric;
406
407 public:
409 Quadric( void );
410
413 Quadric( const Matrix< Dim , Dim > &Q , const Point< Dim > &L , const double &C );
414
417
420
422 Matrix< Dim , Dim > getQuadratic( void ) const;
423
425 Point< Dim > getLinear( void ) const;
426
428 double getConstant( void ) const;
429
432
434 void setLinear( Point< Dim > L );
435
437 void setConstant( double C );
438
440 double operator()( const Point< Dim > &p ) const;
441
443 Quadric< 1 > intersect( const Ray< Dim > &ray ) const;
444
449 bool setExtremum( Point< Dim > &extremum ) const;
450
454 template< unsigned int _Dim >
456
460 Quadric< Dim > operator + ( const Point< Dim > &t ) const;
461
463 struct BoundingBoxOverlap;
464
465 friend struct BoundingBoxOverlap;
466 };
467
468 template< unsigned int Dim >
470 {
473
475 bool operator()( const BoundingBox< Dim > & bBox ) const;
476 protected:
477 template< unsigned int _Dim > friend struct Quadric< _Dim >::BoundingBoxOverlap;
478 Quadric< Dim > _quadric;
479 Matrix< Dim , Dim > _Q , _Qinv;
480 Matrix< Dim+1 , Dim > _T;
481 Matrix< Dim , Dim+1 > _Tt , _Tt_Q;
482 struct Quadric< Dim-1 >::BoundingBoxOverlap _boundaryInfo[Dim];
483
484 BoundingBoxOverlap( void );
485 void _set( const Quadric< Dim > &Q );
486 bool _intersect( const Quadric< Dim > &Q , const BoundingBox< Dim > &bBox ) const;
487 };
488
489 template<>
491 {
493 BoundingBoxOverlap( const Quadric< 1 > &Q ){ _set(Q); }
494
496 bool operator()( const BoundingBox< 1 > & bBox ) const;
497 protected:
498 template< unsigned int _Dim > friend struct Quadric< _Dim >::BoundingBoxOverlap;
499 Quadric< 1 > _quadric;
500 Matrix< 1 , 1 > _Q , _Qinv;
501 Matrix< 2 , 1 > _T;
502 Matrix< 1 , 2 > _Tt , _Tt_Q;
503
505 void _set( const Quadric< 1 > &Q );
506 bool _intersect( const Quadric< 1 > &Q , const BoundingBox< 1 > &bBox ) const;
507 };
508
511 template< unsigned int Dim >
513
515 template< unsigned int Dim >
516 std::ostream &operator << ( std::ostream &stream , const Point< Dim > &p );
517
519 // Classes specialized for 2D, 3D, and 4D //
521
524
527
530
533
535 template< unsigned int Dim > using SquareMatrix = Matrix< Dim , Dim >;
536
539
542
545
548
551
554
557
560
563
566
569
572
575
578
581
583 class Quaternion : public Field< Quaternion > , public _InnerProductSpace< Quaternion >
584 {
585 public:
587 double real;
588
591
593 Quaternion( double r=0 , Point3D i = Point3D() );
594
596 double dot( const Quaternion& q ) const;
597
599 Quaternion conjugate( void ) const;
600
602 // Field methods //
604
606 Quaternion additiveInverse( void ) const;
607
609 Quaternion multiplicativeInverse( void ) const;
610
612 Quaternion operator * ( double scale ) const;
613
615 Quaternion operator + ( const Quaternion& q ) const;
616
618 Quaternion operator * ( const Quaternion& q ) const;
619
620 };
621
623 namespace RotationParameters
624 {
626 enum
627 {
633 COUNT
634 };
635
637 const std::string Names[] = { "trivial" , "closest rotation" , "euler" , "skew symmetric" , "quaternion" };
638 }
639
641 template< typename RotationParameterType , typename ParameterType >
643 {
644 public:
646
648 virtual Matrix3D operator()( void ) const = 0;
649
651 // VectorSpace methods //
653
655 RotationParameterType operator * ( double scale ) const;
656
658 RotationParameterType operator + ( const RotationParameterType &p ) const;
659 };
660
662 class TrivialRotationParameter : public RotationParameter< TrivialRotationParameter , Matrix3D > , public VectorSpace< TrivialRotationParameter >
663 {
664 public:
667
670
672 TrivialRotationParameter( const Matrix3D &r , const TrivialRotationParameter &previous );
673
675 Matrix3D operator()( void ) const;
676 };
677
679 class EulerRotationParameter : public RotationParameter< EulerRotationParameter , Point3D > , public VectorSpace< EulerRotationParameter >
680 {
681 public:
684
687
689 EulerRotationParameter( const Matrix3D &r , const EulerRotationParameter &previous );
690
692 Matrix3D operator()( void ) const;
693 };
694
696 class MatrixRotationParameter : public RotationParameter< MatrixRotationParameter , Matrix3D > , public VectorSpace< MatrixRotationParameter >
697 {
698 public:
701
704
706 MatrixRotationParameter( const Matrix3D &r , const MatrixRotationParameter &previous );
707
709 Matrix3D operator()( void ) const;
710 };
711
713 class SkewSymmetricRotationParameter : public RotationParameter< SkewSymmetricRotationParameter , Point3D > , public VectorSpace< SkewSymmetricRotationParameter >
714 {
715 Matrix3D _toMatrix( void ) const;
716 void _fromMatrix( const Matrix3D &skew );
717 public:
720
723
726
728 Matrix3D operator()( void ) const;
729 };
730
732 class QuaternionRotationParameter : public RotationParameter< QuaternionRotationParameter , Quaternion > , public VectorSpace< QuaternionRotationParameter >
733 {
734 public:
737
740
743
745 Matrix3D operator()( void ) const;
746 };
747
749 template< typename RotationParameterType >
750 class TransformationParameter : public VectorSpace< TransformationParameter< RotationParameterType > >
751 {
752 public:
754 RotationParameterType rotationParameter;
755
758
761
764
767
769 TransformationParameter operator * ( double scale ) const;
770
773
775 Matrix4D operator()( void ) const;
776 };
777}
778#include "geometry.inl"
779#include "geometry.todo.inl"
780#endif // GEOMETRY_INCLUDED
const GXMatrixMNTC< Coord > Identity(unsigned int cOrder)
Definition: geometry.h:126
Point< Rows > operator*(const Point< Cols > &p) const
Definition: geometry.inl:169
double & operator()(int r, int c)
Definition: geometry.inl:155
double _m[Rows][Cols]
Definition: geometry.h:128
_BaseMatrix(void)
Definition: geometry.inl:152
MatrixType operator+(const MatrixType &m) const
Definition: geometry.inl:180
double dot(const _BaseMatrix &p) const
Definition: geometry.inl:144
MatrixTransposeType transpose(void) const
Definition: geometry.inl:161
Definition: algebra.h:99
Definition: algebra.h:143
Definition: geometry.h:345
BoundingBox(void)
Definition: geometry.inl:503
friend BoundingBox< _Dim > operator*(const Matrix< _Dim+1, _Dim+1 > &, const BoundingBox< _Dim > &)
bool isEmpty(void) const
Definition: geometry.inl:580
BoundingBox & operator^=(const BoundingBox &b)
Definition: geometry.inl:557
BoundingBox & operator+=(const BoundingBox &b)
Definition: geometry.inl:543
bool isInside(const Point< Dim > &p) const
Definition: geometry.inl:573
BoundingBox operator+(const BoundingBox &b) const
Definition: geometry.inl:528
Point< Dim > & operator[](int index)
Definition: geometry.inl:522
BoundingBox operator^(const BoundingBox &b) const
Definition: geometry.inl:546
Point< Dim > _p[2]
Definition: geometry.h:350
BoundingBox< 1 > intersect(const Ray< Dim > &ray) const
Definition: geometry.todo.inl:58
Definition: geometry.h:680
Definition: algebra.h:57
Definition: algebra.h:133
Definition: geometry.h:187
Matrix(const Matrix< Dim-1, Dim-1 > &m, Point< Dim-1 > p=Point< Dim-1 >())
Matrix(const Matrix< Dim+1, Dim+1 > &m)
Definition: geometry.h:168
Matrix(void)
Definition: geometry.inl:185
Matrix< Rows, _Cols > operator*(const Matrix< Cols, _Cols > &m) const
Definition: geometry.inl:189
Definition: geometry.h:697
Definition: geometry.h:269
double distance
Definition: geometry.h:274
Point< Dim > normal
Definition: geometry.h:272
Plane(void)
Definition: geometry.inl:432
double operator()(const Point< Dim > &p) const
Definition: geometry.inl:463
Definition: geometry.h:52
static Point CrossProduct(Points ... points)
Point operator*(const Point &p) const
Definition: geometry.inl:83
double & operator[](int index)
Definition: geometry.inl:77
Point & operator/=(const Point &p)
Definition: geometry.inl:102
Point(void)
Definition: geometry.inl:48
Point operator/(const Point &p) const
Definition: geometry.inl:91
void _init(const double *values, unsigned int sz)
Definition: geometry.inl:40
double _p[Dim]
Definition: geometry.h:54
Point operator+(const Point &p) const
Definition: geometry.inl:66
Point & operator*=(const Point &p)
Definition: geometry.inl:99
double dot(const Point &p) const
Definition: geometry.inl:69
Definition: geometry.h:399
Quadric< 1 > intersect(const Ray< Dim > &ray) const
Definition: geometry.todo.inl:71
double getConstant(void) const
Definition: geometry.inl:633
Quadric< _Dim > operator*(const Matrix< Dim, _Dim > &T) const
Definition: geometry.inl:649
friend class Quadric
Definition: geometry.h:405
Point< Dim > getLinear(void) const
Definition: geometry.inl:630
Matrix< Dim+1, Dim+1 > operator()(void) const
Definition: geometry.inl:614
void setQuadratic(Matrix< Dim, Dim > Q)
Definition: geometry.inl:636
bool setExtremum(Point< Dim > &extremum) const
Definition: geometry.inl:675
void setLinear(Point< Dim > L)
Definition: geometry.inl:639
Matrix< Dim, Dim > _Q
Definition: geometry.h:400
Matrix< Dim, Dim > getQuadratic(void) const
Definition: geometry.inl:627
void setConstant(double C)
Definition: geometry.inl:642
friend struct BoundingBoxOverlap
Definition: geometry.h:463
Point< Dim > _L
Definition: geometry.h:401
Quadric< Dim > operator+(const Point< Dim > &t) const
Definition: geometry.inl:662
double _C
Definition: geometry.h:402
Definition: geometry.h:584
double real
Definition: geometry.h:587
Point3D imag
Definition: geometry.h:590
Definition: geometry.h:733
Definition: geometry.h:299
Ray operator+(const Point< Dim > &p) const
Definition: geometry.inl:481
Point< Dim > direction
Definition: geometry.h:305
Ray(void)
Definition: geometry.inl:472
Point< Dim > position
Definition: geometry.h:302
Point< Dim > operator()(double t) const
Definition: geometry.inl:478
Ray operator-(const Point< Dim > &p) const
Definition: geometry.inl:487
Ray & operator+=(const Point< Dim > &p)
Definition: geometry.inl:484
Ray & operator-=(const Point< Dim > &p)
Definition: geometry.inl:490
Definition: geometry.h:643
ParameterType parameter
Definition: geometry.h:645
virtual Matrix3D operator()(void) const =0
Definition: geometry.h:714
Definition: geometry.h:751
RotationParameterType rotationParameter
Definition: geometry.h:754
Point3D translation
Definition: geometry.h:757
Definition: geometry.h:663
Definition: algebra.h:66
CmdLineParameter< int > ParameterType("parameter", RotationParameters::TRIVIAL+1)
Definition: box.h:7
const std::string Names[]
Definition: geometry.h:637
@ ROTATION
Definition: geometry.h:629
@ QUATERNION
Definition: geometry.h:632
@ TRIVIAL
Definition: geometry.h:628
@ EULER
Definition: geometry.h:630
@ SKEW_SYMMETRIC
Definition: geometry.h:631
@ COUNT
Definition: geometry.h:633
Definition: algebra.h:7
Matrix< 3, 3 > Matrix3D
Definition: geometry.h:544
Point< 1 > Point1D
Definition: geometry.h:523
BoundingBox< 3 > BoundingBox3D
Definition: geometry.h:577
Matrix< 4, 4 > Matrix4D
Definition: geometry.h:547
Matrix< 2, 2 > Matrix2D
Definition: geometry.h:541
BoundingBox< 2 > BoundingBox2D
Definition: geometry.h:574
Matrix< 1, 1 > Matrix1D
Definition: geometry.h:538
Ray< 1 > Ray1D
Definition: geometry.h:559
Point< 3 > Point3D
Definition: geometry.h:529
static const double Infinity
Definition: geometry.h:41
std::ostream & operator<<(std::ostream &stream, const Point< Dim > &p)
Definition: geometry.inl:127
BoundingBox< 1 > BoundingBox1D
Definition: geometry.h:571
Ray< 3 > Ray3D
Definition: geometry.h:565
Plane< 4 > Plane4D
Definition: geometry.h:556
Plane< 3 > Plane3D
Definition: geometry.h:553
Ray< 2 > Ray2D
Definition: geometry.h:562
std::istream & operator>>(std::istream &stream, Point< Dim > &p)
Definition: geometry.inl:134
Ray< 4 > Ray4D
Definition: geometry.h:568
Ray< Dim > operator*(const Matrix< Dim+1, Dim+1 > &m, const Ray< Dim > &ray)
Definition: geometry.inl:493
BoundingBox< 4 > BoundingBox4D
Definition: geometry.h:580
Point< 4 > Point4D
Definition: geometry.h:532
static const double Pi
Definition: geometry.h:39
Plane< 2 > Plane2D
Definition: geometry.h:550
static const double Epsilon
Definition: geometry.h:40
Point< 2 > Point2D
Definition: geometry.h:526
const double eps
Definition: poly34.cpp:13
Definition: geometry.h:45
static bool DebugFlag
Definition: geometry.h:46
Definition: geometry.h:470
bool operator()(const BoundingBox< 1 > &bBox) const
BoundingBoxOverlap(const Quadric< 1 > &Q)
Definition: geometry.h:493