OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <html> |
| 3 <head> |
| 4 <title>Geometry Interfaces: DOMMatrix rotate</title> |
| 5 <script src="../../resources/testharness.js"></script> |
| 6 <script src="../../resources/testharnessreport.js"></script> |
| 7 </head> |
| 8 <body> |
| 9 <script> |
| 10 |
| 11 function getRotationMatrix(x, y, z, alpha_in_degrees) |
| 12 { |
| 13 // Vector normalizing |
| 14 var length = Math.sqrt(x * x + y * y + z * z); |
| 15 var nx = x / length; |
| 16 var ny = y / length; |
| 17 var nz = z / length; |
| 18 |
| 19 // The 3D rotation matrix is described in CSS Transforms with alpha. |
| 20 // Please see: https://drafts.csswg.org/css-transforms-1/#Rotate3dDefined |
| 21 var alpha_in_radian = deg2rad(alpha_in_degrees / 2); |
| 22 var sc = Math.sin(alpha_in_radian) * Math.cos(alpha_in_radian); |
| 23 var sq = Math.sin(alpha_in_radian) * Math.sin(alpha_in_radian); |
| 24 |
| 25 var m11 = 1 - 2 * (ny * ny + nz * nz) * sq; |
| 26 var m12 = 2 * (nx * ny * sq + nz * sc); |
| 27 var m13 = 2 * (nx * nz * sq - ny * sc); |
| 28 var m14 = 0; |
| 29 var m21 = 2 * (nx * ny * sq - nz * sc); |
| 30 var m22 = 1 - 2 * (nx * nx + nz * nz) * sq; |
| 31 var m23 = 2 * (ny * nz * sq + nx * sc); |
| 32 var m24 = 0; |
| 33 var m31 = 2 * (nx * nz * sq + ny * sc); |
| 34 var m32 = 2 * (ny * nz * sq - nx * sc); |
| 35 var m33 = 1 - 2 * (nx * nx + ny * ny) * sq; |
| 36 var m34 = 0; |
| 37 var m41 = 0; |
| 38 var m42 = 0; |
| 39 var m43 = 0; |
| 40 var m44 = 1; |
| 41 |
| 42 return [ m11, m12, m13, m14, |
| 43 m21, m22, m23, m24, |
| 44 m31, m32, m33, m34, |
| 45 m41, m42, m43, m44 ]; |
| 46 } |
| 47 |
| 48 function assert_array_almost_equals(actual, expected) { |
| 49 for (var i = 0; i < actual.length; i++) { |
| 50 assert_equals(actual[i].toFixed(10), expected[i].toFixed(10)); |
| 51 } |
| 52 } |
| 53 |
| 54 function deg2rad(degrees) |
| 55 { |
| 56 return degrees * Math.PI / 180; |
| 57 } |
| 58 |
| 59 function rad2deg(radians) |
| 60 { |
| 61 return radians * 180 / Math.PI |
| 62 } |
| 63 |
| 64 test(function() { |
| 65 var actual = new DOMMatrixReadOnly([1, 2, 3, 4, 5, 6, 7, 8, 9, 10.1, 11, 12, 1
3, 14, 15, 16.6]); |
| 66 var expected = new DOMMatrixReadOnly([1, 2, 3, 4, 5, 6, 7, 8, 9, 10.1, 11, 12,
13, 14, 15, 16.6]); |
| 67 assert_array_almost_equals( |
| 68 actual.rotateAxisAngle(1, 2, 3, 30).toFloat64Array(), |
| 69 expected.multiply(new DOMMatrixReadOnly(getRotationMatrix(1, 2, 3, 30)))); |
| 70 /* |
| 71 assert_array_equals(toArray(matrix.rotateAxisAngleSelf(1, 2, 3, 30)), getExpec
tedRotationMatrix(1, 2, 3, 30)); |
| 72 assert_array_equals(toArray(matrix.rotateAxisAngleSelf(1, 2, 3, 30)), getExpec
tedRotationMatrix(1, 2, 3, 30)); |
| 73 assert_array_equals(toArray(matrix.rotateAxisAngleSelf(1, 2, 3, 30)), getExpec
tedRotationMatrix(1, 2, 3, 30)); |
| 74 assert_array_equals(toArray(matrix.rotateAxisAngleSelf(1, 2, 3, 30)), getExpec
tedRotationMatrix(1, 2, 3, 30)); |
| 75 assert_array_equals(toArray(matrix.rotateAxisAngleSelf(1, 2, 3, 30)), getExpec
tedRotationMatrix(1, 2, 3, 30));*/ |
| 76 }, "DOMMatrix.rotateAxisAnagleSelf"); |
| 77 /* |
| 78 test(function() { |
| 79 var matrix = new DOMMatrix(); |
| 80 assert_true(matrix.is2D); |
| 81 assert_true(matrix.isIdentity); |
| 82 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 83 var result = matrix.rotate(60); |
| 84 assert_true(result.is2D); |
| 85 assert_false(result.isIdentity); |
| 86 var m11 = COS_60_DEG; |
| 87 var m12 = SIN_60_DEG; |
| 88 var m21 = -SIN_60_DEG; |
| 89 var m22 = COS_60_DEG; |
| 90 assert_array_equals(toArray(result), [ m11, m21, 0, 0, m12, m22, 0, 0, 0, 0, 1
, 0, 0, 0, 0, 1 ]); |
| 91 assert_true(matrix.is2D); |
| 92 assert_true(matrix.isIdentity); |
| 93 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 94 matrix.rotateSelf(60); |
| 95 assert_true(matrix.is2D); |
| 96 assert_false(matrix.isIdentity); |
| 97 assert_array_equals(toArray(matrix), toArray(result)); |
| 98 }, "DOMMatrix.rotate(angle) and rotateSelf(angle)"); |
| 99 |
| 100 test(function() { |
| 101 var matrix = new DOMMatrix(); |
| 102 matrix.m11 = 1; |
| 103 matrix.m12 = 2; |
| 104 matrix.m21 = 3; |
| 105 matrix.m22 = 4; |
| 106 assert_true(matrix.is2D); |
| 107 assert_false(matrix.isIdentity); |
| 108 assert_array_equals(toArray(matrix), [ 1, 3, 0, 0, 2, 4, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 109 var result = matrix.rotate(30); |
| 110 assert_true(result.is2D); |
| 111 assert_false(result.isIdentity); |
| 112 var m11 = COS_30_DEG + SIN_30_DEG * 3; |
| 113 var m12 = COS_30_DEG * 2 + SIN_30_DEG * 4; |
| 114 var m21 = -SIN_30_DEG + COS_30_DEG * 3; |
| 115 var m22 = -SIN_30_DEG * 2 + COS_30_DEG * 4; |
| 116 assert_array_equals(toArray(result), [ m11, m21, 0, 0, m12, m22, 0, 0, 0, 0, 1
, 0, 0, 0, 0, 1 ]); |
| 117 assert_true(matrix.is2D); |
| 118 assert_false(matrix.isIdentity); |
| 119 assert_array_equals(toArray(matrix), [ 1, 3, 0, 0, 2, 4, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 120 matrix.rotateSelf(30); |
| 121 assert_true(matrix.is2D); |
| 122 assert_false(matrix.isIdentity); |
| 123 assert_array_equals(toArray(matrix), toArray(result)); |
| 124 }, "DOMMatrix.rotate(angle) and DOMMatrix.rotateSelf(angle) with non-identity"); |
| 125 |
| 126 test(function() { |
| 127 var matrix = new DOMMatrix(); |
| 128 matrix.m11 = 1; |
| 129 matrix.m12 = 2; |
| 130 matrix.m21 = 3; |
| 131 matrix.m22 = 4; |
| 132 matrix.m13 = 5; |
| 133 matrix.m23 = 6; |
| 134 matrix.m33 = 7; |
| 135 assert_false(matrix.is2D); |
| 136 assert_false(matrix.isIdentity); |
| 137 assert_array_equals(toArray(matrix), [ 1, 3, 0, 0, 2, 4, 0, 0, 5, 6, 7, 0, 0,
0, 0, 1 ]); |
| 138 var result = matrix.rotate(30); |
| 139 assert_false(result.is2D); |
| 140 assert_false(result.isIdentity); |
| 141 var m11 = COS_30_DEG + SIN_30_DEG * 3; |
| 142 var m12 = COS_30_DEG * 2 + SIN_30_DEG * 4; |
| 143 var m13 = COS_30_DEG * 5 + SIN_30_DEG * 6; |
| 144 var m21 = -SIN_30_DEG + COS_30_DEG * 3; |
| 145 var m22 = -SIN_30_DEG * 2 + COS_30_DEG * 4; |
| 146 var m23 = -SIN_30_DEG * 5 + COS_30_DEG * 6; |
| 147 assert_array_equals(toArray(result), [ m11, m21, 0, 0, m12, m22, 0, 0, m13, m2
3, 7, 0, 0, 0, 0, 1 ]); |
| 148 assert_false(matrix.is2D); |
| 149 assert_false(matrix.isIdentity); |
| 150 assert_array_equals(toArray(matrix), [ 1, 3, 0, 0, 2, 4, 0, 0, 5, 6, 7, 0, 0,
0, 0, 1 ]); |
| 151 matrix.rotateSelf(30); |
| 152 assert_false(matrix.is2D); |
| 153 assert_false(matrix.isIdentity); |
| 154 assert_array_equals(toArray(matrix), toArray(result)); |
| 155 }, "DOMMatrix.rotate(angle) and DOMMatrix.rotateSelf(angle) when is2D property i
s false"); |
| 156 |
| 157 test(function() { |
| 158 var matrix = new DOMMatrix(); |
| 159 assert_true(matrix.is2D); |
| 160 assert_true(matrix.isIdentity); |
| 161 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 162 var result = matrix.rotate(45, 10, 10); |
| 163 var expected = new DOMMatrix(); |
| 164 expected.translateSelf(10, 10); |
| 165 expected.rotateSelf(45); |
| 166 expected.translateSelf(-10, -10); |
| 167 assert_true(result.is2D); |
| 168 assert_false(result.isIdentity); |
| 169 assert_array_equals(toArray(result), toArray(expected)); |
| 170 assert_true(matrix.is2D); |
| 171 assert_true(matrix.isIdentity); |
| 172 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 173 matrix.rotateSelf(45, 10, 10); |
| 174 assert_true(matrix.is2D); |
| 175 assert_false(matrix.isIdentity); |
| 176 assert_array_equals(toArray(matrix), toArray(result)); |
| 177 }, "DOMMatrix.rotate(angle, ox, oy)"); |
| 178 |
| 179 test(function() { |
| 180 var matrix = new DOMMatrix(); |
| 181 assert_true(matrix.is2D); |
| 182 assert_true(matrix.isIdentity); |
| 183 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 184 var result = matrix.rotateFromVector(4, 7); |
| 185 var expected = new DOMMatrix(); |
| 186 expected.rotateSelf(rad2deg(Math.atan2(7, 4))); |
| 187 assert_true(result.is2D); |
| 188 assert_false(result.isIdentity); |
| 189 assert_array_equals(toArray(result), toArray(expected)); |
| 190 assert_true(matrix.is2D); |
| 191 assert_true(matrix.isIdentity); |
| 192 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 193 matrix.rotateFromVectorSelf(4, 7); |
| 194 assert_true(matrix.is2D); |
| 195 assert_false(matrix.isIdentity); |
| 196 assert_array_equals(toArray(matrix), toArray(result)); |
| 197 }, "DOMMatrix.rotateFromVector(x, y) and DOMMatrix.rotateFromVectorSelf(x, y)"); |
| 198 |
| 199 test(function() { |
| 200 var matrix = new DOMMatrix(); |
| 201 assert_true(matrix.is2D); |
| 202 assert_true(matrix.isIdentity); |
| 203 assert_array_equals(toArray(matrix), [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
0, 0, 1 ]); |
| 204 var x_result = matrix.rotateAxisAngle(1, 0, 0, 30); |
| 205 assert_false(x_result.is2D); |
| 206 assert_false(x_result.isIdentity); |
| 207 assert_array_equals(toArray(x_result), [ 1, 0, 0, 0, 0, COS_30_DEG, -SIN_30_DE
G, 0, 0, SIN_30_DEG, COS_30_DEG, 0, 0, 0, 0, 1 ]); |
| 208 var y_result = matrix.rotateAxisAngle(0, 1, 0, 45); |
| 209 assert_false(y_result.is2D); |
| 210 assert_false(y_result.isIdentity); |
| 211 assert_array_equals(toArray(y_result), [ COS_45_DEG, 0, SIN_45_DEG, 0, 0, 1, 0
, 0, -SIN_45_DEG, 0, COS_45_DEG, 0, 0, 0, 0, 1 ]); |
| 212 var z_result = matrix.rotateAxisAngle(0, 0, 1, 60); |
| 213 assert_true(z_result.is2D); |
| 214 assert_false(z_result.isIdentity); |
| 215 assert_array_equals(toArray(z_result), [ COS_60_DEG, -SIN_60_DEG, 0, 0, SIN_60
_DEG, COS_60_DEG, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]); |
| 216 var expected = new DOMMatrix(); |
| 217 expected.rotateSelf(60); |
| 218 assert_array_equals(toArray(z_result), toArray(expected)); |
| 219 matrix.rotateAxisAngleSelf(1, 0, 0, 30); |
| 220 assert_false(matrix.is2D); |
| 221 assert_false(matrix.isIdentity); |
| 222 assert_array_equals(toArray(matrix), toArray(x_result)); |
| 223 }, "DOMMatrix.rotateAxisAngle(x, y, z, angle) and DOMMatrix.rotateAxisAngleSelf(
x, y, z, angle)"); |
| 224 */ |
| 225 </script> |
| 226 </body> |
| 227 </html> |
OLD | NEW |