Skip to content

Commit 98f3df3

Browse files
committed
element multiply
1 parent 78e3b4b commit 98f3df3

File tree

7 files changed

+86
-34
lines changed

7 files changed

+86
-34
lines changed

examples/quaternion/quaternion.ino

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -83,61 +83,70 @@ void setup() {
8383
q5 /= 2;
8484
printOperation( "9. Scalar self divide: ", q5 );
8585

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+
8695
// 2. Quaternion multiplication and division:
8796
/* Quats can be multiplied together to generate a new quaternion. This can encode multiple rotations */
8897

8998
// Multiply
9099
q5 = q5*q1;
91-
printOperation( "10. Quaternion multiply: ", q5 );
100+
printOperation( "11. Quaternion multiply: ", q5 );
92101

93102
// Divide
94103
q5 = q5/q2;
95-
printOperation( "11. Quaternion division: ", q5 );
104+
printOperation( "12. Quaternion division: ", q5 );
96105

97106
// Self multiply
98107
q5 *= q3;
99-
printOperation( "12. Quaternion self multiply: ", q5 );
108+
printOperation( "13. Quaternion self multiply: ", q5 );
100109

101110
// Self divide
102111
q5 /= q4;
103-
printOperation( "13. Quaternion self divide: ", q5 );
112+
printOperation( "14. Quaternion self divide: ", q5 );
104113

105114
// 3. Important operations:
106115

107116
// Conjugate
108-
printOperation( "14. Conjugate: ", q5.conj() );
117+
printOperation( "15. Conjugate: ", q5.conj() );
109118

110119
// Normalize
111-
printOperation( "15. Normalize: ", q5.norm() );
120+
printOperation( "16. Normalize: ", q5.norm() );
112121

113122
// Inner product
114-
Serial.print( "16. Inner product: " );
123+
Serial.print( "17. Inner product: " );
115124
Serial.println( q5.inner() );
116125

117126
// Magnitude
118-
Serial.print( "17. Magnitude: " );
127+
Serial.print( "18. Magnitude: " );
119128
Serial.print( q5.mag() );
120129
Serial.print("\n\n");
121130

122131
// 4. Compatibility with arrays:
123132
/* In operations between a quaternion and an array, the array will be interpreted as a quaternion */
124133
float arr[] = {1, 2, 3, 4};
125134

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 );
129138

130139
// 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 );
133142

134143
//-- Compatibility with vectors
135144
/* Vectors will be interpreted as quaternions without a scalar value (w = 0) */
136145
vec3_t vec = {1, 2, 3};
137146

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 );
141150

142151
// 5. Vector rotation: a quaternion can rotate and stretch a 3D vector
143152

@@ -154,18 +163,18 @@ void setup() {
154163
// Rotate into angle
155164
vec_rot = qrot.rotate(vec, GLOBAL_FRAME);
156165

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 );
158167

159168
// Rotate away from angle
160169
vec_rot = qrot.rotate(vec, LOCAL_FRAME);
161170

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 );
163172

164173
// B) Rotate by unit vector of magnitude sin(angle)
165174
qrot.setRotation( axis, LARGE_ANGLE );
166175
vec_rot = qrot.rotate(vec, GLOBAL_FRAME);
167176

168-
printOperation<vec3_t>( "28. Rotate by unit vector: ", vec_rot );
177+
printOperation<vec3_t>( "29. Rotate by unit vector: ", vec_rot );
169178

170179
// 6. Axes projections: can choose between GLOBAL_FRAME and LOCAL_FRAME
171180
/* GLOBAL_FRAME projects local axis-vectors to global coordinates
@@ -176,9 +185,9 @@ void setup() {
176185
vec3_t y = qrot.axisY(GLOBAL_FRAME);
177186
vec3_t z = qrot.axisZ(GLOBAL_FRAME);
178187

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 );
182191
}
183192

184193
void loop() {}

examples/vector/vector.ino

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,30 @@ void setup() {
7676
v4 /= 20;
7777
printOperation( "9. Self divide: ", v4 );
7878

79+
// Element-wise multiplication
80+
vec3_t v5 = v3 ^ v4;
81+
printOperation( "10A. Element-wise multiply", v5 );
82+
83+
// self element-wise multiply
84+
v5 ^= v4;
85+
printOperation( "10B. Self Element-wise multiply", v5 );
86+
7987
// 2. Important operations:
8088
// These are useful operations that are commonly encountered. They are explicitly named for clarity.
8189

8290
// Normalize
83-
printOperation( "10. Normalize vector: ", v4.norm() );
91+
printOperation( "11. Normalize vector: ", v4.norm() );
8492

8593
// Cross product
8694
v4 = v4.cross(v1);
87-
printOperation( "11. Cross product: ", v4 );
95+
printOperation( "12. Cross product: ", v4 );
8896

8997
// Dot product
90-
Serial.print( "11. Dot product: " );
98+
Serial.print( "13. Dot product: " );
9199
Serial.println( v4.dot(v2) );
92100

93101
// Magnitude
94-
Serial.print( "12. Magnitude: " );
102+
Serial.print( "14. Magnitude: " );
95103
Serial.print( v4.mag() );
96104
Serial.println("\n");
97105

@@ -100,17 +108,17 @@ void setup() {
100108

101109
float arr[] = {1, 2, 3};
102110

103-
printOperation( "13. Vector and array addition: " , v4 + arr );
104-
printOperation( "14. Vector and array subtraction: " , v4 - arr );
105-
printOperation( "15. Vector and array cross product: ", v4.cross(arr) );
111+
printOperation( "15. Vector and array addition: " , v4 + arr );
112+
printOperation( "16. Vector and array subtraction: " , v4 - arr );
113+
printOperation( "17. Vector and array cross product: ", v4.cross(arr) );
106114

107-
Serial.print( "16. Dot product (array): " );
115+
Serial.print( "18. Dot product (array): " );
108116
Serial.print( v4.dot(arr) );
109117
Serial.println("\n");
110118

111119
// Operations with arrays are not converted to a vector type. These need to be explicitly converted.
112-
printOperation( "17. Array conversion (multiply): ", vec3_t(arr)*3 );
113-
printOperation( "18. Array conversion (divide): ", vec3_t(arr)/10 );
120+
printOperation( "19. Array conversion (multiply): ", vec3_t(arr)*3 );
121+
printOperation( "20. Array conversion (divide): ", vec3_t(arr)/10 );
114122
}
115123

116124
void loop() {}

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Vector datatype
2-
version=1.1.1
2+
version=1.2.1
33
author=RCmags <memoryofatrufestival@gmail.com>
44
maintainer=RCmags <memoryofatrufestival@gmail.com>
55
sentence=Library for 3d vectors and quaternions

src/quaternion_type.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ void quat_t::operator -= ( const quat_t &r ) {
6565
v -= r.v;
6666
}
6767

68+
//-- Element-wise multiplication:
69+
quat_t quat_t::operator ^ ( const quat_t &r ) {
70+
quat_t q = { w * r.w ,
71+
v ^ r.v };
72+
return q;
73+
}
74+
75+
void quat_t::operator ^= ( const quat_t &r ) {
76+
w *= r.w;
77+
v ^= r.v;
78+
}
79+
6880
//-- Scalar product and division:
6981

7082
// Scalar product

src/quaternion_type.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ struct quat_t {
3131
quat_t operator - ( const quat_t & );
3232
quat_t operator - ( void );
3333
void operator += ( const quat_t & );
34-
void operator -= ( const quat_t & );
34+
void operator -= ( const quat_t & );
35+
36+
// Element-wise multiplication
37+
quat_t operator ^ ( const quat_t & );
38+
void operator ^= ( const quat_t & );
3539

3640
// Scalar product and division:
3741
quat_t operator * ( const float );

src/vector_type.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,21 @@ void vec3_t::operator -= ( const vec3_t &r ) {
6767
z -= r.z;
6868
}
6969

70+
71+
//----------- Element-wise multiplication ------------
72+
vec3_t vec3_t::operator ^ ( const vec3_t &r ) {
73+
vec3_t v = { x * r.x ,
74+
y * r.y ,
75+
z * r.z };
76+
return v;
77+
}
78+
79+
void vec3_t::operator ^= ( const vec3_t &r ) {
80+
x *= r.x;
81+
y *= r.y;
82+
z *= r.z;
83+
}
84+
7085
//-------- Scalar multiplication and division --------
7186

7287
// Scalar product

src/vector_type.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ struct vec3_t {
2525
void operator += ( const vec3_t & );
2626
void operator -= ( const vec3_t & );
2727

28+
// Element-wise multiplication
29+
vec3_t operator ^ ( const vec3_t & );
30+
void operator ^= ( const vec3_t & );
31+
2832
// Scalar multiplication and division:
2933
vec3_t operator * ( const float );
3034
vec3_t operator / ( const float );

0 commit comments

Comments
 (0)