gonum.org/v1/gonum@v0.14.0/num/dualquat/dual_simple_example_test.go (about)

     1  // Copyright ©2018 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package dualquat_test
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"gonum.org/v1/gonum/num/dualquat"
    11  	"gonum.org/v1/gonum/num/quat"
    12  )
    13  
    14  func Example_displace() {
    15  	// Displace a point [3, 4, 5] by [4, 2, 6].
    16  	// See http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/other/dualQuaternion/index.htm
    17  
    18  	// Point to be transformed in the dual imaginary vector.
    19  	p := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 3, Jmag: 4, Kmag: 5}}
    20  
    21  	// Displacement vector, half [4, 2, 6], in the dual imaginary vector.
    22  	d := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 2, Jmag: 1, Kmag: 3}}
    23  
    24  	fmt.Println(dualquat.Mul(dualquat.Mul(d, p), dualquat.Conj(d)).Dual)
    25  
    26  	// Output:
    27  	//
    28  	// (0+7i+6j+11k)
    29  }
    30  
    31  func Example_rotate() {
    32  	// Rotate a point [3, 4, 5] by 180° around the x axis.
    33  	// See http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/other/dualQuaternion/index.htm
    34  
    35  	// Point to be transformed in the dual imaginary vector.
    36  	p := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 3, Jmag: 4, Kmag: 5}}
    37  
    38  	// Rotation in the real quaternion.
    39  	r := dualquat.Number{Real: quat.Number{Real: 0, Imag: 1}}
    40  
    41  	fmt.Println(dualquat.Mul(dualquat.Mul(r, p), dualquat.Conj(r)).Dual)
    42  
    43  	// Output:
    44  	//
    45  	// (0+3i-4j-5k)
    46  }
    47  
    48  func Example_displaceAndRotate() {
    49  	// Displace a point [3, 4, 5] by [4, 2, 6] and then rotate
    50  	// by 180° around the x axis.
    51  	// See http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/other/dualQuaternion/index.htm
    52  
    53  	// Point to be transformed in the dual imaginary vector.
    54  	p := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 3, Jmag: 4, Kmag: 5}}
    55  
    56  	// Displacement vector, half [4, 2, 6], in the dual imaginary vector.
    57  	d := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 2, Jmag: 1, Kmag: 3}}
    58  
    59  	// Rotation in the real quaternion.
    60  	r := dualquat.Number{Real: quat.Number{Real: 0, Imag: 1}}
    61  
    62  	// Combine the rotation and displacement so
    63  	// the displacement is performed first.
    64  	q := dualquat.Mul(r, d)
    65  
    66  	fmt.Println(dualquat.Mul(dualquat.Mul(q, p), dualquat.Conj(q)).Dual)
    67  
    68  	// Output:
    69  	//
    70  	// (0+7i-6j-11k)
    71  }
    72  
    73  func Example_rotateAndDisplace() {
    74  	// Rotate a point [3, 4, 5] by 180° around the x axis and then
    75  	// displace by [4, 2, 6]
    76  
    77  	// Point to be transformed in the dual imaginary vector.
    78  	p := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 3, Jmag: 4, Kmag: 5}}
    79  
    80  	// Displacement vector, half [4, 2, 6], in the dual imaginary vector.
    81  	d := dualquat.Number{Real: quat.Number{Real: 1}, Dual: quat.Number{Imag: 2, Jmag: 1, Kmag: 3}}
    82  
    83  	// Rotation in the real quaternion.
    84  	r := dualquat.Number{Real: quat.Number{Real: 0, Imag: 1}}
    85  
    86  	// Combine the rotation and displacement so
    87  	// the rotations is performed first.
    88  	q := dualquat.Mul(d, r)
    89  
    90  	fmt.Println(dualquat.Mul(dualquat.Mul(q, p), dualquat.Conj(q)).Dual)
    91  
    92  	// Output:
    93  	//
    94  	// (0+7i-2j+1k)
    95  }