/* Copyright 2002-2017 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.frames;
import java.util.Random;
import org.hipparchus.geometry.euclidean.threed.Rotation;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.errors.FrameAncestorException;
import org.orekit.errors.OrekitException;
import org.orekit.time.AbsoluteDate;
public class UpdatableFrameTest {
@Test
public void testUpdateTransform() throws OrekitException {
Random random = new Random(0x2f6769c23e53e96el);
UpdatableFrame f0 = new UpdatableFrame(FramesFactory.getGCRF(), Transform.IDENTITY, "dummy");
AbsoluteDate date = new AbsoluteDate();
UpdatableFrame f1 = new UpdatableFrame(f0, randomTransform(random), "f1");
UpdatableFrame f2 = new UpdatableFrame(f1, randomTransform(random), "f2");
UpdatableFrame f3 = new UpdatableFrame(f2, randomTransform(random), "f3");
UpdatableFrame f4 = new UpdatableFrame(f2, randomTransform(random), "f4");
UpdatableFrame f5 = new UpdatableFrame(f4, randomTransform(random), "f5");
UpdatableFrame f6 = new UpdatableFrame(f0, randomTransform(random), "f6");
UpdatableFrame f7 = new UpdatableFrame(f6, randomTransform(random), "f7");
UpdatableFrame f8 = new UpdatableFrame(f6, randomTransform(random), "f8");
UpdatableFrame f9 = new UpdatableFrame(f7, randomTransform(random), "f9");
checkFrameAncestorException(f6, f8, f9, randomTransform(random), date);
checkFrameAncestorException(f6, f9, f8, randomTransform(random), date);
checkFrameAncestorException(f6, f3, f5, randomTransform(random), date);
checkFrameAncestorException(f6, f5, f3, randomTransform(random), date);
checkFrameAncestorException(f0, f5, f9, randomTransform(random), date);
checkFrameAncestorException(f0, f9, f5, randomTransform(random), date);
checkFrameAncestorException(f3, f0, f6, randomTransform(random), date);
checkFrameAncestorException(f3, f6, f0, randomTransform(random), date);
checkUpdateTransform(f1, f5, f9, date, random);
checkUpdateTransform(f7, f6, f9, date, random);
checkUpdateTransform(f6, f0, f7, date, random);
checkUpdateTransform(f6, f6.getParent(), f6, date, random);
}
private void checkFrameAncestorException(UpdatableFrame f0, Frame f1, Frame f2,
Transform transform, AbsoluteDate date) {
try {
f0.updateTransform(f1, f2, transform, date);
Assert.fail("Should raise a FrameAncestorException");
} catch(FrameAncestorException expected){
// expected behavior
} catch (Exception e) {
Assert.fail("wrong exception caught");
}
}
private void checkUpdateTransform(UpdatableFrame f0, Frame f1, Frame f2,
AbsoluteDate date, Random random)
throws OrekitException {
Transform f1ToF2 = randomTransform(random);
f0.updateTransform(f1, f2, f1ToF2, date);
Transform obtained12 = f1.getTransformTo(f2, date);
checkNoTransform(new Transform(date, f1ToF2, obtained12.getInverse()), random);
f0.updateTransform(f2, f1, f1ToF2.getInverse(), date);
Transform obtained21 = f2.getTransformTo(f1, date);
checkNoTransform(new Transform(date, f1ToF2.getInverse(), obtained21.getInverse()), random);
checkNoTransform(new Transform(date, obtained12, obtained21), random);
}
private Transform randomTransform(Random random) {
Transform transform = Transform.IDENTITY;
for (int i = random.nextInt(10); i > 0; --i) {
if (random.nextBoolean()) {
Vector3D u = new Vector3D(random.nextDouble() * 1000.0,
random.nextDouble() * 1000.0,
random.nextDouble() * 1000.0);
transform = new Transform(transform.getDate(), transform, new Transform(transform.getDate(), u));
} else {
double q0 = random.nextDouble() * 2 - 1;
double q1 = random.nextDouble() * 2 - 1;
double q2 = random.nextDouble() * 2 - 1;
double q3 = random.nextDouble() * 2 - 1;
double q = FastMath.sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
Rotation r = new Rotation(q0 / q, q1 / q, q2 / q, q3 / q, false);
transform = new Transform(transform.getDate(), transform, new Transform(transform.getDate(), r));
}
}
return transform;
}
private void checkNoTransform(Transform transform, Random random) {
for (int i = 0; i < 100; ++i) {
Vector3D a = new Vector3D(random.nextDouble(),
random.nextDouble(),
random.nextDouble());
Vector3D b = transform.transformVector(a);
Assert.assertEquals(0, a.subtract(b).getNorm(), 1.0e-10);
Vector3D c = transform.transformPosition(a);
Assert.assertEquals(0, a.subtract(c).getNorm(), 1.0e-10);
}
}
@Before
public void setUp() {
Utils.setDataRoot("compressed-data");
}
}