Converting Between Coordinate Systems

Similar documents
Computing Orthonormal Sets in 2D, 3D, and 4D

3 Orthogonal Vectors and Matrices

Notes on Determinant

Section 1.1. Introduction to R n

Figure 1.1 Vector A and Vector F

Essential Mathematics for Computer Graphics fast

A linear combination is a sum of scalars times quantities. Such expressions arise quite frequently and have the form

13 MATH FACTS a = The elements of a vector have a graphical interpretation, which is particularly easy to see in two or three dimensions.

Affine Transformations

Lecture L3 - Vectors, Matrices and Coordinate Transformations

Vectors Math 122 Calculus III D Joyce, Fall 2012

Linear Algebra Notes for Marsden and Tromba Vector Calculus

MATH10212 Linear Algebra. Systems of Linear Equations. Definition. An n-dimensional vector is a row or a column of n numbers (or letters): a 1.

Vector Spaces; the Space R n

Rotation Matrices and Homogeneous Transformations

v w is orthogonal to both v and w. the three vectors v, w and v w form a right-handed set of vectors.

What is Linear Programming?

Similarity and Diagonalization. Similar Matrices

Linearly Independent Sets and Linearly Dependent Sets

Section 10.4 Vectors

Orthogonal Projections

Mathematics Course 111: Algebra I Part IV: Vector Spaces

α = u v. In other words, Orthogonal Projection

Lecture 2 Matrix Operations

Solving simultaneous equations using the inverse matrix

Introduction to Matrices for Engineers

8.2. Solution by Inverse Matrix Method. Introduction. Prerequisites. Learning Outcomes

December 4, 2013 MATH 171 BASIC LINEAR ALGEBRA B. KITCHENS

MATRIX ALGEBRA AND SYSTEMS OF EQUATIONS

Linear Programming. March 14, 2014

Unified Lecture # 4 Vectors

Linear Algebra Notes

Notes on Orthogonal and Symmetric Matrices MENU, Winter 2013

Geometric Camera Parameters

MATRIX ALGEBRA AND SYSTEMS OF EQUATIONS. + + x 2. x n. a 11 a 12 a 1n b 1 a 21 a 22 a 2n b 2 a 31 a 32 a 3n b 3. a m1 a m2 a mn b m

1 VECTOR SPACES AND SUBSPACES

Systems of Linear Equations

TWO-DIMENSIONAL TRANSFORMATION

Cross product and determinants (Sect. 12.4) Two main ways to introduce the cross product

Solving Simultaneous Equations and Matrices

Section Continued

MATH2210 Notebook 1 Fall Semester 2016/ MATH2210 Notebook Solving Systems of Linear Equations... 3

9 MATRICES AND TRANSFORMATIONS

Torgerson s Classical MDS derivation: 1: Determining Coordinates from Euclidean Distances

5. Orthogonal matrices

Recall the basic property of the transpose (for any A): v A t Aw = v w, v, w R n.

2x + y = 3. Since the second equation is precisely the same as the first equation, it is enough to find x and y satisfying the system

LINES AND PLANES CHRIS JOHNSON

Content. Chapter 4 Functions Basic concepts on real functions 62. Credits 11

MATH APPLIED MATRIX THEORY

Vector has a magnitude and a direction. Scalar has a magnitude

8.1. Cramer s Rule for Solving Simultaneous Linear Equations. Introduction. Prerequisites. Learning Outcomes. Learning Style

DATA ANALYSIS II. Matrix Algorithms

Data Mining: Algorithms and Applications Matrix Math Review

Lecture 3: Coordinate Systems and Transformations

MATH 304 Linear Algebra Lecture 18: Rank and nullity of a matrix.

Vector Math Computer Graphics Scott D. Anderson

B4 Computational Geometry

1 Introduction to Matrices

Solving Systems of Linear Equations

Physics 235 Chapter 1. Chapter 1 Matrices, Vectors, and Vector Calculus

Introduction to Matrix Algebra

Geometry of Vectors. 1 Cartesian Coordinates. Carlo Tomasi

521493S Computer Graphics. Exercise 2 & course schedule change

x1 x 2 x 3 y 1 y 2 y 3 x 1 y 2 x 2 y 1 0.

Continued Fractions and the Euclidean Algorithm

Typical Linear Equation Set and Corresponding Matrices

by the matrix A results in a vector which is a reflection of the given

ISOMETRIES OF R n KEITH CONRAD

The Characteristic Polynomial

[1] Diagonal factorization

a 11 x 1 + a 12 x a 1n x n = b 1 a 21 x 1 + a 22 x a 2n x n = b 2.

DRAFT. Further mathematics. GCE AS and A level subject content

Chapter 17. Orthogonal Matrices and Symmetries of Space

PYTHAGOREAN TRIPLES KEITH CONRAD

Geometric Transformations

The Matrix Elements of a 3 3 Orthogonal Matrix Revisited

Name: Section Registered In:

Math 241, Exam 1 Information.

Lectures notes on orthogonal matrices (with exercises) Linear Algebra II - Spring 2004 by D. Klain

Math for Game Programmers: Dual Numbers. Gino van den Bergen

Review Jeopardy. Blue vs. Orange. Review Jeopardy

Direct Methods for Solving Linear Systems. Matrix Factorization

MAT188H1S Lec0101 Burbulla

Linear Algebra I. Ronald van Luijk, 2012

Matrix Differentiation

Pennsylvania System of School Assessment

Solutions to Math 51 First Exam January 29, 2015

Rotation about an arbitrary axis and reflection through an arbitrary plane

Adding vectors We can do arithmetic with vectors. We ll start with vector addition and related operations. Suppose you have two vectors

Math 215 HW #6 Solutions

4.5 Linear Dependence and Linear Independence

Section 9.1 Vectors in Two Dimensions

Biggar High School Mathematics Department. National 5 Learning Intentions & Success Criteria: Assessing My Progress

Least-Squares Intersection of Lines

Given a point cloud, polygon, or sampled parametric curve, we can use transformations for several purposes:

Lecture 7. Matthew T. Mason. Mechanics of Manipulation. Lecture 7. Representing Rotation. Kinematic representation: goals, overview

CS3220 Lecture Notes: QR factorization and orthogonal transformations

1 Solving LPs: The Simplex Algorithm of George Dantzig

Math 4310 Handout - Quotient Vector Spaces

Transcription:

Converting Between Coordinate Systems David Eberly Geometric Tools, LLC http://www.geometrictools.com/ Copyright c 1998-2016. All Rights Reserved. Created: April 23, 2014 Last Modified: March 14, 2016 Contents 1 Coordinates for a Common World 2 2 Linear Change of Basis 3 3 Conversion of Linear Transformations 4 4 Affine Change of Basis 5 5 Conversion of Affine Transformations 6 6 An Implementation 6 1

The original version of this document was entitled Conversion of Left-Handed Coordinates to Right-Handed Coordinates and was written to handle the conversion of LightWave coordinate systems (left-handed) to Wild Magic coordinate systems (right-handed). The process was specific to LightWave s choice of representing rotations using Euler angles, and the discussion included how to deal with cameras, lights, and transformation hierarchies. The original document was first written in December 2003 and was last modified in March 2008. When someone wants to convert between coordinate systems, the question is generally: I have my coordinate system and I want to convert to someone else s coordinate system. Moreover, given an affine transformation (usually rotation) in the first coordinate system, one wants the equivalent transformation in the second coordinate system that performs the same geometric operation in the common world to which the coordinate systems are attached. This topic is generally referred to as affine change of basis. I have rewritten the document to show how to do this, and pseudocode is provided so that you can automate this process in a program. 1 Coordinates for a Common World When working with multiple coordinate systems, the presumption is that these are for a common world. We need a simple affine algebra framework for this world. Let IR n denote the set of n-tuples whose components are real numbers, where the question of coordinate system conversion in computer graphics tends to be for n = 2 or n = 3. The discussion here applies generally, though, for any n > 1. To locate points in the world, we need a reference point, called the origin, and a set of n linearly independent directions in which to measure distances from the origin. There are many choices, which really is the heart of converting between coordinate systems. The standard origin of the world is denoted O and, by default, the n-tuple of measurements to locate the origin are all zero; that is, the standard origin is represented by the n-tuple (0,..., 0), whose components are all zero. The standard directions are chosen to be vectors E i for 0 i n 1, where the components of E i are zero except for component i which is 1. In 2D, the origin is (0, 0) and the directions are (1, 0) and (0, 1). In 3D, the origin is (0, 0, 0) and the directions are (1, 0, 0), (0, 1, 0), and (0, 0, 1). Any point P in the world is identified by an n-tuple of signed distances from the origin, say, P = (p 0,..., p n 1 ), where p i is the signed distance measured from P in the direction E i. The order of the standard directions is implied in the n-tuple; that is, the i-th component of the n-tuple is a measurement in the direction of E i. It is possible to rearrange the standard directions and, simultaneously, rearrange the components. The resulting n-tuple, viewed as a collection of measurements of signed distances, represents the same geometric point in the world. All we have done is change the bookkeeping, so to speak. The geometry is the same but the algebra has changed. For example, if (p 0, p 1 ) is the 2-tuple for the ordered direction set (1, 0), (0, 1), the 2-tuple (p 1, p 0 ) for the ordered direction set (0, 1), (1, 0) represents the same point in the 2D world. However, if you do not tell others about your bookkeeping conventions, it will be difficult to communicate information to them properly about your view of the world. Let s consider the standard directions to be n 1 column vectors. The ordered set E 0,..., E n 1 is referred to as the standard Euclidean basis for IR n. The ordering is said to form a right-handed coordinate system. If you swap the order of two of the directions, the ordering is said to form a left-handed coordinate system. The motivation for using the term handedness comes from 3D, where you discuss the right-hand or left-hand rule for cross products. This is a natural way for tagging the ordering of a set of linearly independent directions, but the ancient ones could have just as easily used a 2-tag system, say, standard ordering and not-standard ordering or even type 1 and type 2. What s in a name anyway? If you create an n n matrix [E 0 E n ] whose columns are the specified vectors, the matrix is actually the identity matrix. The determinant of this 2

matrix is positive. If you were to swap the order of two columns, the determinant of the resulting matrix is negative. The determinant of a matrix whose columns are from a basis is either positive or negative. If positive, we call the basis right-handed. If negative, we call the basis left-handed. The process of converting between two coordinate systems may be coded in a manner that does not require the handedness of the inputs to be specified explicitly. 2 Linear Change of Basis Consider two observers, each using the standard origin for their coordinate systems. However, one observer decides to use n linearly independent directions that are different from the standard ones; call these U i for 0 i n 1. The set of these directions is a basis for IR n. Another observer decides to use n linearly independent directions that are different from the standard ones and different from those of the other observer; call these V i for 0 i n 1. The set of these directions is another basis for IR n. Both bases provide bookkeeping information for representing points in the common world. To convert from the first coordinate system to the second is a matter of converting the first to the common world s coordinate system and then converting the common world s coordinate system to the second coordinate system. Let P = (p 0,..., p n 1 ) be the n-tuple of signed distance measurements that locate the point in the common world. The n-tuple is referred to as the coordinates of the point relative to the standard Euclidean basis. The observers store the location of the point in their own coordinate systems. The first observer stores n 1 P = x i U i (1) i=0 where (x 0,..., x n 1 ) are referred to as the coordinates of the point relative to the U-basis. The second observer stores n 1 P = y i V i (2) i=0 where (y 0,..., y n 1 ) are referred to as the coordinates of the point relative to the V-basis. Define two n n matrices, U = [U 0 U n 1 ] and V = [V 0 V n 1 ], each having columns that are the specified vectors. Define two n 1 vectors X and Y, where the rows of x are the x i and the rows of Y are the y i. Equation (1) becomes P = UX and equation (2) becomes P = V Y. Equating these, we have Y = V 1 UX, X = U 1 V Y (3) which specifies how to convert the coordinates of one system to those of the other. Each basis vector V i may be written as a linear combination of the U-basis, namely, V i = n 1 j=0 U ic ij for some scalars c ij. The matrix C = [c ij ] is n n and the basis relationship in matrix form is V = UC, which implies Equation (3) becomes C = U 1 V (4) Y = C 1 X, X = CY (5) The process is referred to as a linear change of basis. The matrix C represents that change. Although linear algebra books refer to this solely as change of basis, I added the modifier linear to distinguish this from coordinate system conversions when the two systems have origins not equal to the standard origin of the common world. In the latter case, I call the related process an affine change of basis. 3

For example, the first observer uses the standard Euclidean basis for locating points. The basis is U 0, U 1, U 2 = (1, 0, 0), (0, 1, 0), (0, 0, 1). The second observer uses the basis V 0, V 1, V 2 = (1, 0, 0), (0, 0, 1), (0, 1, 0). The matrices of basis vectors and the change-of-basis matrix and its inverse are 1 0 0 1 0 0 1 0 0 1 0 0 U = 0 1 0, V = 0 0 1, C = U 1 V = 0 0 1, C 1 = V 1 U = 0 0 1 (6) 0 0 1 0 1 0 0 1 0 0 1 0 Note that det(u) > 0, so the U-basis is right-handed, and det(v ) < 0, so the V-basis is left-handed. Figure 1 shows the coordinate systems. The points labeled with trigonometric components are used in an example in the next section. Figure 1. Two coordinate systems with common origin. The system of (a) is right-handed and the system of (b) is left-handed. The x 1 -axis and the y 2 -axis both point into the plane of the page. The conversions X = CY and Y = C 1 X are (x 0, x 1, x 2 ) = (y 0, y 2, y 1 ) and (y 0, y 1, y 2 ) = (x 0, x 2, x 1 ), which are just swaps in the last two components. This agrees with the illustrations in Figure 1. 3 Conversion of Linear Transformations Once we have established the change of basis, the next natural question is how to represent a geometric action in the common world as matrix transformations relative to the observers coordinate systems. For example, consider a rotation in the common world by a positive angle θ around the up-axis. Figure 1 shows this geometric action applied to a point using coordinates relative to each coordinate system. Define c = cos θ and s = sin θ. In Figure 1(a), the point (x 0, x 1, x 2 ) = (1, 0, 0) is rotated to (x 0, x 1, x 2) = (c, s, 0), the point (x 0, x 1, x 2 ) = (0, 1, 0) is rotated to (x 0, x 1, x 2) = ( s, c, 0), and the point (x 0, x 1, x 2 ) = (0, 0, 1) is unchanged by the rotation. The matrix R that represents the rotation with respect to the U-basis 4

is X = x 0 x 1 x 2 = c s 0 s c 0 0 0 1 x 0 x 1 x 2 = RX (7) In Figure 1(b), the point (y 0, y 1, y 2 ) = (1, 0, 0) is rotated to (y 0, y 1, y 2) = (c, 0, s), the point (y 0, y 1, y 2 ) = (0, 0, 1) is rotated to (y 0, y 1, y 2) = ( s, 0, c), and the point (y 0, y 1, y 2 ) = (0, 1, 0) is unchanged by the rotation. The matrix R that represents the rotation with respect to the V-basis is y 0 c 0 s y 0 Y = y 1 = 0 1 0 y 1 = RY (8) s 0 c y 2 We can obtain the relationship between R and R by applying equation (3) to equations (7) and (8). Specifically, the change of basis leads to X = CY, X = CY, Y = C 1 X, and Y = C 1 X. This leads to CY = RCY and C 1 X = RC 1 X, Y = C 1 RCY and X = C RC 1 X, and subsequently y 2 R = C 1 RC, R = C RC 1 (9) These are referred to as similarity transformations. Generally, given a matrix transformation M relative to the U-basis and the change of basis matrix C to convert to the V-basis, the matrix transformation in the latter basis is M = C 1 MC. 4 Affine Change of Basis The process for linear change of basis applies when the two observers use the same origin for their coordinate systems. However, in some applications the origins might be different. Let the origin for the first coordinate system be located at E and the origin for the second coordinate system be located at F, neither origin necessarily the standard one. We will use the same basis vectors as before. A point P in the world now has representations that are translations of those in equations (1) and (2), namely, for the first observer and for the second observer. n 1 P = E + x i U i (10) i=0 n 1 P = F + y i V i (11) In matrix-vector form, the representations are P = E + UX and P = F + V Y. For matrix-vector notation, we may use 4 4 matrices written in block form and store the point representations in homogenous form, U E X = P = V F Y (12) 1 1 1 i=0 5

We may solve for either coordinate vector by inversion, Y = A 1 X, X 1 1 1 = A Y 1 (13) where and A = U E 1 A 1 = V F V 1 F U = E = U 1 V U 1 (F E) V 1 U V 1 (E F), (14) (15) 5 Conversion of Affine Transformations The conversion between matrix representations of affine transformations is similar to that of linear transformations. An affine transformation for the first coordinate system is X = MX + T. In homogeneous form, X = M T X = H X (16) 1 1 1 where the last equality defines the 4 4 matrix H. Let the transformation for the second coordinate system representing the same action in the common world be Y M T = Y = H Y (17) 1 1 1 where the last equality defines the 4 4 matrix H. Using the affine change of basis from equation (13), we obtain the relationships H = A 1 HA, H = A HA 1 (18) The computation of H from H depends on the assumption that we are using the vector-on-the-right convention for matrix-vector multiplication; that is, to transform an n 1 vector W by an n n matrix H, we consider W a n 1 vector and multiply using HW. The vector-on-the-left convention performs the multiplication by W T H. When H is not a symmetric matrix, these products are generally different: written as n 1 outputs, the two conventions produce HW and H T W. The multiplication convention must be taken into account when converting transformations between coordinate systems. 6 An Implementation The source code shown next uses the GTEngine, but it should be straightforward to write your own with whatever mathematics library you use. Some samples are mentioned in the comments at the top of the file GteConvertCoordinates.h. 6

// David Eberly, Geometric Tools, Redmond WA 98052 // Copyright ( c ) 1998 2016 // D i s t r i b u t e d under t h e Boost S o f t w a r e L i c e n s e, V e r s i o n 1. 0. // h t t p : / /www. b o o s t. org / LICENSE 1 0. t x t // h t t p : / /www. g e o m e t r i c t o o l s. com/ L i c e n s e / Boost / LICENSE 1 0. t x t // F i l e V e r s i o n : 2. 1. 1 (2016/03/14) #pragma once #i n c l u d e GteMatrix. h #i n c l u d e G t e G a u s s i a n E l i m i n a t i o n. h // Convert p o i n t s and t r a n s f o r m a t i o n s between two c o o r d i n a t e s y s t e m s. // The mathematics i n v o l v e s a change o f b a s i s. See t h e document // h t t p : / /www. g e o m e t r i c t o o l s. com/ Documentation / C o n v e r t i n g B e t w e e n C o o r d i n a t e S y s t e m s. pdf // f o r t h e d e t a i l s. T y p i c a l usage f o r 3D c o n v e r s i o n i s shown n e x t. // // // L i n e a r change o f b a s i s. // C o n v e r t C o o r d i n a t e s <3, double> c o n v e r t ; // Vector <3, double> X, Y, P0, P1, d i f f ; // Matrix <3, 3, double> U, V, A, B ; // bool isrhu, isrhv ; // U. S e t C o l ( 0, Vector3<double >1.0, 0. 0, 0. 0 ) ; // U. S e t C o l ( 1, Vector3<double >0.0, 1. 0, 0. 0 ) ; // U. S e t C o l ( 2, Vector3<double >0.0, 0. 0, 1. 0 ) ; // V. S e t C o l ( 0, Vector3<double >1.0, 0. 0, 0. 0 ) ; // V. S e t C o l ( 1, Vector3<double >0.0, 0. 0, 1. 0 ) ; // V. S e t C o l ( 2, Vector3<double >0.0, 1. 0, 0. 0 ) ; // c o n v e r t (U, t r u e, V, t r u e ) ; // isrhu = c o n v e r t. IsRightHandedU ( ) ; // t r u e // isrhv = c o n v e r t. IsRightHandedV ( ) ; // f a l s e // X = 1. 0, 2. 0, 3. 0 ; // Y = c o n v e r t. UToV(X ) ; // 1. 0, 3. 0, 2. 0 // d i f f = P0 P1 ; // 0, 0, 0 // Y = 0. 0, 1. 0, 2. 0 ; // X = c o n v e r t. VToU(Y ) ; // 0. 0, 2. 0, 1. 0 // d i f f = P0 P1 ; // 0, 0, 0 // d o u b l e c s = 0. 6, sn = 0. 8 ; // c s c s + sn sn = 1 // A. S e t C o l ( 0, Vector3<double > c, s, 0. 0 ) ; // A. S e t C o l ( 1, Vector3<double > s, c, 0. 0 ) ; // A. S e t C o l ( 2, Vector3<double >0.0, 0. 0, 1. 0 ) ; // B = c o n v e r t. UToV(A ) ; // // B. GetCol ( 0 ) = c, 0, s // // B. GetCol ( 1 ) = 0, 1, 0 // // B. GetCol ( 2 ) = s, 0, c // X = A X ; // U i s VOR // Y = B Y ; // V i s VOR // d i f f = P0 P1 ; // 0, 0, 0 // // // A f f i n e change o f b a s i s. // C o n v e r t C o o r d i n a t e s <4, double> c o n v e r t ; // Vector <4, double> X, Y, P0, P1, d i f f ; // Matrix <4, 4, double> U, V, A, B ; // bool isrhu, isrhv ; // U. S e t C o l ( 0, Vector4<double > 1.0, 0. 0, 0. 0, 0. 0 ) ; // U. S e t C o l ( 1, Vector4<double >0.0, 0. 0, 1. 0, 0. 0 ) ; // U. S e t C o l ( 2, Vector4<double >0.0, 1.0, 0. 0, 0. 0 ) ; // U. S e t C o l ( 3, Vector4<double >1.0, 2. 0, 3. 0, 1. 0 ) ; // V. S e t C o l ( 0, Vector4<double >0.0, 1. 0, 0. 0, 0. 0 ) ; // V. S e t C o l ( 1, Vector4<double > 1.0, 0. 0, 0. 0, 0. 0 ) ; // V. S e t C o l ( 2, Vector4<double >0.0, 0. 0, 1. 0, 0. 0 ) ; // V. S e t C o l ( 3, Vector4<double >4.0, 5. 0, 6. 0, 1. 0 ) ; // c o n v e r t (U, t r u e, V, f a l s e ) ; // isrhu = c o n v e r t. IsRightHandedU ( ) ; // f a l s e // isrhv = c o n v e r t. IsRightHandedV ( ) ; // t r u e // X = 1.0, 4. 0, 3.0, 1. 0 ; 7

// Y = c o n v e r t. UToV(X ) ; // 0. 0, 2. 0, 1. 0, 1. 0 // d i f f = P0 P1 ; // 0, 0, 0, 0 // Y = 1. 0, 2. 0, 3. 0, 1. 0 ; // X = c o n v e r t. VToU(Y ) ; // 1.0, 6. 0, 4.0, 1. 0 // d i f f = P0 P1 ; // 0, 0, 0, 0 // d o u b l e c = 0. 6, s = 0. 8 ; // c c + s s = 1 // A. S e t C o l ( 0, Vector4<double > c, s, 0. 0, 0. 0 ) ; // A. S e t C o l ( 1, Vector4<double > s, c, 0. 0, 0. 0 ) ; // A. S e t C o l ( 2, Vector4<double >0.0, 0. 0, 1. 0, 0. 0 ) ; // A. S e t C o l ( 3, Vector4<double >0.3, 1. 0, 2.0, 1. 0 ) ; // B = c o n v e r t. UToV(A ) ; // // B. GetCol ( 0 ) = 1, 0, 0, 0 // // B. GetCol ( 1 ) = 0, c, s, 0 // // B. GetCol ( 2 ) = 0, s, c, 0 // // B. GetCol ( 3 ) = 2. 0, 0.9, 2.6, 1 // X = A X ; // U i s VOR // Y = Y B ; // V i s VOL ( not VOR) // d i f f = P0 P1 ; // 0, 0, 0, 0 namespace g t e template <i n t N, typename Real> c l a s s C o n v e r t C o o r d i n a t e s p u b l i c : // C o n s t r u c t i o n o f t h e change o f b a s i s m a t r i x. The i m p l e m e n t a t i o n // s u p p o r t s both l i n e a r change o f b a s i s and a f f i n e change o f b a s i s. C o n v e r t C o o r d i n a t e s ( ) ; // Compute a change o f b a s i s between two c o o r d i n a t e s y s t e m s. The r e t u r n // v a l u e i s t r u e i f f U and V a r e i n v e r t i b l e. The matrix v e c t o r // m u l t i p l i c a t i o n c o n v e n t i o n s a f f e c t t h e c o n v e r s i o n o f m a t r i x // t r a n s f o r m a t i o n s. The Boolean i n p u t s i n d i c a t e how you want t h e m a t r i c e s // to be i n t e r p r e t e d when a p p l i e d as t r a n s f o r m a t i o n s o f a v e c t o r. b o o l o p e r a t o r ( ) ( Matrix<N, N, Real> c o n s t& U, b o o l vectoronrightu, Matrix<N, N, Real> c o n s t& V, b o o l vectoronrightv ) ; // Member a c c e s s. i n l i n e Matrix<N, N, Real> c o n s t& GetC ( ) c o n s t ; i n l i n e Matrix<N, N, Real> c o n s t& G e t I n v e r s e C ( ) c o n s t ; i n l i n e b o o l IsVectorOnRightU ( ) c o n s t ; i n l i n e b o o l IsVectorOnRightV ( ) c o n s t ; i n l i n e b o o l IsRightHandedU ( ) c o n s t ; i n l i n e b o o l IsRightHandedV ( ) c o n s t ; // Convert p o i n t s between c o o r d i n a t e s y s t e m s. The names o f t h e s y s t e m s // a r e U and V to make i t c l e a r which i n p u t s o f o p e r a t o r ( ) t h e y a r e // a s s o c i a t e d w i t h. The X v e c t o r s t o r e s c o o r d i n a t e s f o r t h e U system and // t h e Y v e c t o r s t o r e s c o o r d i n a t e s f o r t h e V system. // Y = Cˆ 1 X i n l i n e Vector<N, Real> UToV( Vector<N, Real> const& X) const ; // X = C Y i n l i n e Vector<N, Real> VToU( Vector<N, Real> const& Y) const ; // Convert t r a n s f o r m a t i o n s between c o o r d i n a t e s y s t e m s. The o u t p u t s a r e // computed a c c o r d i n g to t h e t a b l e s shown b e f o r e t h e f u n c t i o n // d e c l a r a t i o n s. The s u p e r s c r i p t T d e n o t e s t h e t r a n s p o s e o p e r a t o r. // vectoronrightu = t r u e : t r a n s f o r m a t i o n i s X = A X // vectoronrightu = f a l s e : t r a n s f o r m a t i o n i s (X ) ˆT = XˆT A // vectoronrightv = t r u e : t r a n s f o r m a t i o n i s Y = B Y // vectoronrightv = f a l s e : t r a n s f o r m a t i o n i s (Y ) ˆT = YˆT B 8

// vectoronrightu vectoronrightv o u t p u t // + + // t r u e t r u e Cˆ 1 A C // t r u e f a l s e (Cˆ 1 A C)ˆT // f a l s e t r u e Cˆ 1 AˆT C // f a l s e f a l s e (Cˆ 1 AˆT C)ˆT Matrix<N, N, Real> UToV( Matrix<N, N, Real> const& A) const ; // vectoronrightu vectoronrightv o u t p u t // + + // t r u e t r u e C B Cˆ 1 // t r u e f a l s e C BˆT Cˆ 1 // f a l s e t r u e (C B Cˆ 1)ˆT // f a l s e f a l s e (C BˆT Cˆ 1)ˆT Matrix<N, N, Real> VToU( Matrix<N, N, Real> const& B) const ; p r i v a t e : // C = Uˆ 1 V, Cˆ 1 = Vˆ 1 U Matrix<N, N, Real> mc, minversec ; b o o l misvectoronrightu, misvectoronrightv ; b o o l misrighthandedu, misrighthandedv ; ; template <i n t N, typename Real> C o n v e r t C o o r d i n a t e s <N, Real >:: C o n v e r t C o o r d i n a t e s ( ) : misvectoronrightu ( true ), misvectoronrightv ( true ), misrighthandedu ( true ), misrighthandedv ( t r u e ) mc. M a k e I d e n t i t y ( ) ; minversec. M a k e I d e n t i t y ( ) ; template <i n t N, typename Real> bool ConvertCoordinates <N, Real >:: operator ( ) ( Matrix<N, N, Real> c o n s t& U, b o o l vectoronrightu, Matrix<N, N, Real> c o n s t& V, b o o l vectoronrightv ) // I n i t i a l i z e i n c a s e o f e a r l y e x i t. mc. M a k e I d e n t i t y ( ) ; minversec. M a k e I d e n t i t y ( ) ; misvectoronrightu = true ; misvectoronrightv = true ; misrighthandedu = true ; misrighthandedv = true ; Matrix<N, N, Real> i n v e r s e U ; Real determinantu ; b o o l i n v e r t i b l e U = G a u s s i a n E l i m i n a t i o n <Real >()(N, &U [ 0 ], &i n v e r s e U [ 0 ], determinantu, n u l l p t r, n u l l p t r, n u l l p t r, 0, n u l l p t r ) ; i f (! i n v e r t i b l e U ) r e t u r n f a l s e ; Matrix<N, N, Real> i n v e r s e V ; Real determinantv ; b o o l i n v e r t i b l e V = G a u s s i a n E l i m i n a t i o n <Real >()(N, &V [ 0 ], &i n v e r s e V [ 0 ], determinantv, n u l l p t r, n u l l p t r, n u l l p t r, 0, n u l l p t r ) ; i f (! i n v e r t i b l e V ) r e t u r n f a l s e ; mc = i n v e r s e U V ; minversec = i n v e r s e V U; misvectoronrightu = vectoronrightu ; misvectoronrightv = vectoronrightv ; misrighthandedu = ( determinantu > ( Real ) 0 ) ; 9

misrighthandedv = ( determinantv > ( Real ) 0 ) ; r e t u r n t r u e ; Matrix<N, N, Real> c o n s t& ConvertCoordinates <N, Real >:: GetC ( ) c o n s t r e t u r n mc; Matrix<N, N, Real> c o n s t& ConvertCoordinates <N, Real >:: G et In ve rs ec ( ) c o n s t r e t u r n minversec ; b o o l ConvertCoordinates <N, Real >:: IsVectorOnRightU ( ) c o n s t r e t u r n misvectoronrightu ; b o o l ConvertCoordinates <N, Real >:: IsVectorOnRightV ( ) c o n s t r e t u r n misvectoronrightv ; b o o l ConvertCoordinates <N, Real >:: IsRightHandedU ( ) c o n s t r e t u r n misrighthandedu ; b o o l ConvertCoordinates <N, Real >:: IsRightHandedV ( ) c o n s t r e t u r n misrighthandedv ; Vector<N, Real> ConvertCoordinates <N, Real >::UToV( Vector<N, Real> c o n s t& X) c o n s t r e t u r n minversec X ; Vector<N, Real> ConvertCoordinates <N, Real >::VToU( Vector<N, Real> c o n s t& Y) c o n s t r e t u r n mc Y ; template <i n t N, typename Real> Matrix<N, N, Real> ConvertCoordinates <N, Real >::UToV( Matrix<N, N, Real> c o n s t& A) c o n s t Matrix<N, N, Real> product ; i f ( misvectoronrightu ) p r o d u c t = minversec A mc; i f ( misvectoronrightv ) r e t u r n p r o d u c t ; e l s e r e t u r n Transpose ( p r o d u c t ) ; 10

e l s e product = minversec MultiplyATB (A, mc) ; i f ( misvectoronrightv ) r e t u r n p r o d u c t ; e l s e r e t u r n Transpose ( p r o d u c t ) ; template <i n t N, typename Real> Matrix<N, N, Real> ConvertCoordinates <N, Real >::VToU( Matrix<N, N, Real> c o n s t& B) c o n s t // vectoronrightu vectoronrightv o u t p u t // + + // t r u e t r u e C B Cˆ 1 // t r u e f a l s e C BˆT Cˆ 1 // f a l s e t r u e (C B Cˆ 1)ˆT // f a l s e f a l s e (C BˆT Cˆ 1)ˆT Matrix<N, N, Real> product ; i f ( misvectoronrightv ) product = mc B minversec ; i f ( misvectoronrightu ) r e t u r n p r o d u c t ; e l s e r e t u r n Transpose ( p r o d u c t ) ; e l s e product = mc MultiplyATB (B, minversec ) ; i f ( misvectoronrightu ) r e t u r n p r o d u c t ; e l s e r e t u r n Transpose ( p r o d u c t ) ; 11