@@ -83,61 +83,70 @@ void setup() {
83
83
q5 /= 2 ;
84
84
printOperation ( " 9. Scalar self divide: " , q5 );
85
85
86
+ // Element-wise multiplication
87
+ quat_t q6 = q5 ^ q4;
88
+ printOperation ( " 10A. Element-wise multiply" , q6 );
89
+
90
+ // self element-wise multiply
91
+ q6 ^= q5;
92
+ printOperation ( " 10B. Self Element-wise multiply" , q6 );
93
+
94
+
86
95
// 2. Quaternion multiplication and division:
87
96
/* Quats can be multiplied together to generate a new quaternion. This can encode multiple rotations */
88
97
89
98
// Multiply
90
99
q5 = q5*q1;
91
- printOperation ( " 10 . Quaternion multiply: " , q5 );
100
+ printOperation ( " 11 . Quaternion multiply: " , q5 );
92
101
93
102
// Divide
94
103
q5 = q5/q2;
95
- printOperation ( " 11 . Quaternion division: " , q5 );
104
+ printOperation ( " 12 . Quaternion division: " , q5 );
96
105
97
106
// Self multiply
98
107
q5 *= q3;
99
- printOperation ( " 12 . Quaternion self multiply: " , q5 );
108
+ printOperation ( " 13 . Quaternion self multiply: " , q5 );
100
109
101
110
// Self divide
102
111
q5 /= q4;
103
- printOperation ( " 13 . Quaternion self divide: " , q5 );
112
+ printOperation ( " 14 . Quaternion self divide: " , q5 );
104
113
105
114
// 3. Important operations:
106
115
107
116
// Conjugate
108
- printOperation ( " 14 . Conjugate: " , q5.conj () );
117
+ printOperation ( " 15 . Conjugate: " , q5.conj () );
109
118
110
119
// Normalize
111
- printOperation ( " 15 . Normalize: " , q5.norm () );
120
+ printOperation ( " 16 . Normalize: " , q5.norm () );
112
121
113
122
// Inner product
114
- Serial.print ( " 16 . Inner product: " );
123
+ Serial.print ( " 17 . Inner product: " );
115
124
Serial.println ( q5.inner () );
116
125
117
126
// Magnitude
118
- Serial.print ( " 17 . Magnitude: " );
127
+ Serial.print ( " 18 . Magnitude: " );
119
128
Serial.print ( q5.mag () );
120
129
Serial.print (" \n\n " );
121
130
122
131
// 4. Compatibility with arrays:
123
132
/* In operations between a quaternion and an array, the array will be interpreted as a quaternion */
124
133
float arr[] = {1 , 2 , 3 , 4 };
125
134
126
- printOperation ( " 18 . Quaternion and array addition: " , q5 + arr );
127
- printOperation ( " 19 . Quaternion and array subtraction: " , q5 - arr );
128
- printOperation ( " 20 . Quaternion and array multiply: " , q5 * arr );
135
+ printOperation ( " 19 . Quaternion and array addition: " , q5 + arr );
136
+ printOperation ( " 20 . Quaternion and array subtraction: " , q5 - arr );
137
+ printOperation ( " 21 . Quaternion and array multiply: " , q5 * arr );
129
138
130
139
// Operations with arrays are not converted to a quaternion type. These need to be explicitly converted.
131
- printOperation ( " 21 . Array conversion (multiply): " , quat_t (arr)*3 );
132
- printOperation ( " 22 . Array conversion (divide): " , quat_t (arr)/10 );
140
+ printOperation ( " 22 . Array conversion (multiply): " , quat_t (arr)*3 );
141
+ printOperation ( " 23 . Array conversion (divide): " , quat_t (arr)/10 );
133
142
134
143
// -- Compatibility with vectors
135
144
/* Vectors will be interpreted as quaternions without a scalar value (w = 0) */
136
145
vec3_t vec = {1 , 2 , 3 };
137
146
138
- printOperation ( " 23 . Quaternion and vector addition: " , q5 + vec );
139
- printOperation ( " 24 . Quaternion and vector subtraction: " , q5 - vec );
140
- printOperation ( " 25 . Quaternion and vector multiply; " , q5 * vec );
147
+ printOperation ( " 24 . Quaternion and vector addition: " , q5 + vec );
148
+ printOperation ( " 25 . Quaternion and vector subtraction: " , q5 - vec );
149
+ printOperation ( " 26 . Quaternion and vector multiply; " , q5 * vec );
141
150
142
151
// 5. Vector rotation: a quaternion can rotate and stretch a 3D vector
143
152
@@ -154,18 +163,18 @@ void setup() {
154
163
// Rotate into angle
155
164
vec_rot = qrot.rotate (vec, GLOBAL_FRAME);
156
165
157
- printOperation<vec3_t >( " 26 . Rotate by axis and angle (Global): " , vec_rot );
166
+ printOperation<vec3_t >( " 27 . Rotate by axis and angle (Global): " , vec_rot );
158
167
159
168
// Rotate away from angle
160
169
vec_rot = qrot.rotate (vec, LOCAL_FRAME);
161
170
162
- printOperation<vec3_t >( " 27 . Rotate by axis and angle (local): " , vec_rot );
171
+ printOperation<vec3_t >( " 28 . Rotate by axis and angle (local): " , vec_rot );
163
172
164
173
// B) Rotate by unit vector of magnitude sin(angle)
165
174
qrot.setRotation ( axis, LARGE_ANGLE );
166
175
vec_rot = qrot.rotate (vec, GLOBAL_FRAME);
167
176
168
- printOperation<vec3_t >( " 28 . Rotate by unit vector: " , vec_rot );
177
+ printOperation<vec3_t >( " 29 . Rotate by unit vector: " , vec_rot );
169
178
170
179
// 6. Axes projections: can choose between GLOBAL_FRAME and LOCAL_FRAME
171
180
/* GLOBAL_FRAME projects local axis-vectors to global coordinates
@@ -176,9 +185,9 @@ void setup() {
176
185
vec3_t y = qrot.axisY (GLOBAL_FRAME);
177
186
vec3_t z = qrot.axisZ (GLOBAL_FRAME);
178
187
179
- printOperation<vec3_t >( " 29 . X-axis vector: " , x );
180
- printOperation<vec3_t >( " 30 . Y-axis vector: " , y );
181
- printOperation<vec3_t >( " 31 . Z-axis vector: " , z );
188
+ printOperation<vec3_t >( " 30 . X-axis vector: " , x );
189
+ printOperation<vec3_t >( " 31 . Y-axis vector: " , y );
190
+ printOperation<vec3_t >( " 32 . Z-axis vector: " , z );
182
191
}
183
192
184
193
void loop () {}
0 commit comments