Added applyTo and applyInverseTo methods in the Rotation class that
handle directly arrays instead of Vector3D instances. Patch provided by Jan Kotek. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1200545 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bb201d926e
commit
0fd55c7ac3
|
@ -847,6 +847,25 @@ public class Rotation implements Serializable {
|
|||
|
||||
}
|
||||
|
||||
/** Apply the rotation to a vector stored in an array.
|
||||
* @param in an array with three items which stores vector to rotate
|
||||
* @param out an array with three items to put result to (it can be the same
|
||||
* array as in)
|
||||
*/
|
||||
public void applyTo(final double[] in, final double[] out) {
|
||||
|
||||
final double x = in[0];
|
||||
final double y = in[1];
|
||||
final double z = in[2];
|
||||
|
||||
final double s = q1 * x + q2 * y + q3 * z;
|
||||
|
||||
out[0] = 2 * (q0 * (x * q0 - (q2 * z - q3 * y)) + s * q1) - x;
|
||||
out[1] = 2 * (q0 * (y * q0 - (q3 * x - q1 * z)) + s * q2) - y;
|
||||
out[2] = 2 * (q0 * (z * q0 - (q1 * y - q2 * x)) + s * q3) - z;
|
||||
|
||||
}
|
||||
|
||||
/** Apply the inverse of the rotation to a vector.
|
||||
* @param u vector to apply the inverse of the rotation to
|
||||
* @return a new vector which such that u is its image by the rotation
|
||||
|
@ -866,6 +885,26 @@ public class Rotation implements Serializable {
|
|||
|
||||
}
|
||||
|
||||
/** Apply the inverse of the rotation to a vector stored in an array.
|
||||
* @param in an array with three items which stores vector to rotate
|
||||
* @param out an array with three items to put result to (it can be the same
|
||||
* array as in)
|
||||
*/
|
||||
public void applyInverseTo(final double[] in, final double[] out) {
|
||||
|
||||
final double x = in[0];
|
||||
final double y = in[1];
|
||||
final double z = in[2];
|
||||
|
||||
final double s = q1 * x + q2 * y + q3 * z;
|
||||
final double m0 = -q0;
|
||||
|
||||
out[0] = 2 * (m0 * (x * m0 - (q2 * z - q3 * y)) + s * q1) - x;
|
||||
out[1] = 2 * (m0 * (y * m0 - (q3 * x - q1 * z)) + s * q2) - y;
|
||||
out[2] = 2 * (m0 * (z * m0 - (q1 * y - q2 * x)) + s * q3) - z;
|
||||
|
||||
}
|
||||
|
||||
/** Apply the instance to another rotation.
|
||||
* Applying the instance to a rotation is computing the composition
|
||||
* in an order compliant with the following rule : let u be any
|
||||
|
|
|
@ -52,6 +52,10 @@ The <action> type attribute can be add,update,fix,remove.
|
|||
If the output is not quite correct, check for invisible trailing spaces!
|
||||
-->
|
||||
<release version="3.0" date="TBD" description="TBD">
|
||||
<action dev="luc" type="add" due-to="Jan Kotek" >
|
||||
Added applyTo and applyInverseTo methods in the Rotation class that
|
||||
handle directly arrays instead of Vector3D instances.
|
||||
</action>
|
||||
<action dev="luc" type="fix" issue="MATH-196" >
|
||||
Added adapters for simple bound constraints optimization that can be
|
||||
used for all direct optimization methods, including the ones that do not
|
||||
|
|
|
@ -438,6 +438,31 @@ public class RotationTest {
|
|||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testArray() {
|
||||
|
||||
Rotation r = new Rotation(new Vector3D(2, -3, 5), 1.7);
|
||||
|
||||
for (double x = -0.9; x < 0.9; x += 0.2) {
|
||||
for (double y = -0.9; y < 0.9; y += 0.2) {
|
||||
for (double z = -0.9; z < 0.9; z += 0.2) {
|
||||
Vector3D u = new Vector3D(x, y, z);
|
||||
Vector3D v = r.applyTo(u);
|
||||
double[] inOut = new double[] { x, y, z };
|
||||
r.applyTo(inOut, inOut);
|
||||
Assert.assertEquals(v.getX(), inOut[0], 1.0e-10);
|
||||
Assert.assertEquals(v.getY(), inOut[1], 1.0e-10);
|
||||
Assert.assertEquals(v.getZ(), inOut[2], 1.0e-10);
|
||||
r.applyInverseTo(inOut, inOut);
|
||||
Assert.assertEquals(u.getX(), inOut[0], 1.0e-10);
|
||||
Assert.assertEquals(u.getY(), inOut[1], 1.0e-10);
|
||||
Assert.assertEquals(u.getZ(), inOut[2], 1.0e-10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testApplyInverseTo() {
|
||||
|
||||
|
|
Loading…
Reference in New Issue