blob: 6db62434e41596693458a677b703658c006cd4a8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.apache.commons.geometry.euclidean.threed.rotation;
import org.apache.commons.geometry.euclidean.threed.Vector3D;
/** Enum containing rotation axis sequences for use in defining 3 dimensional rotations.
*/
public enum AxisSequence {
/** Set of Tait-Bryan angles around the <strong>X</strong>, <strong>Y</strong>, and
* <strong>Z</strong> axes in that order.
*/
XYZ(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z),
/** Set of Tait-Bryan angles around the <strong>X</strong>, <strong>Z</strong>, and
* <strong>Y</strong> axes in that order.
*/
XZY(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y),
/** Set of Tait-Bryan angles around the <strong>Y</strong>, <strong>X</strong>, and
* <strong>Z</strong> axes in that order.
*/
YXZ(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z),
/** Set of Tait-Bryan angles around the <strong>Y</strong>, <strong>Z</strong>, and
* <strong>X</strong> axes in that order.
*/
YZX(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X),
/** Set of Cardan angles.
* this ordered set of rotations is around Z, then around X, then
* around Y
*/
ZXY(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y),
/** Set of Tait-Bryan angles around the <strong>Z</strong>, <strong>Y</strong>, and
* <strong>X</strong> axes in that order.
*/
ZYX(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X),
/** Set of Euler angles around the <strong>X</strong>, <strong>Y</strong>, and
* <strong>X</strong> axes in that order.
*/
XYX(AxisSequenceType.EULER, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X),
/** Set of Euler angles around the <strong>X</strong>, <strong>Z</strong>, and
* <strong>X</strong> axes in that order.
*/
XZX(AxisSequenceType.EULER, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X),
/** Set of Euler angles around the <strong>Y</strong>, <strong>X</strong>, and
* <strong>Y</strong> axes in that order.
*/
YXY(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y),
/** Set of Euler angles around the <strong>Y</strong>, <strong>Z</strong>, and
* <strong>Y</strong> axes in that order.
*/
YZY(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y),
/** Set of Euler angles around the <strong>Z</strong>, <strong>X</strong>, and
* <strong>Z</strong> axes in that order.
*/
ZXZ(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z),
/** Set of Euler angles around the <strong>Z</strong>, <strong>Y</strong>, and
* <strong>Z</strong> axes in that order.
*/
ZYZ(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z);
/** The type of axis sequence. */
private final AxisSequenceType type;
/** Axis of the first rotation. */
private final Vector3D axis1;
/** Axis of the second rotation. */
private final Vector3D axis2;
/** Axis of the third rotation. */
private final Vector3D axis3;
/** Simple constructor.
* @param type the axis sequence type
* @param axis1 first rotation axis
* @param axis2 second rotation axis
* @param axis3 third rotation axis
*/
AxisSequence(final AxisSequenceType type, final Vector3D axis1, final Vector3D axis2, final Vector3D axis3) {
this.type = type;
this.axis1 = axis1;
this.axis2 = axis2;
this.axis3 = axis3;
}
/** Get the axis sequence type.
* @return the axis sequence type
*/
public AxisSequenceType getType() {
return type;
}
/** Get the first rotation axis.
* @return the first rotation axis
*/
public Vector3D getAxis1() {
return axis1;
}
/** Get the second rotation axis.
* @return the second rotation axis
*/
public Vector3D getAxis2() {
return axis2;
}
/** Get the third rotation axis.
* @return the third rotation axis
*/
public Vector3D getAxis3() {
return axis3;
}
/** Get an array containing the 3 rotation axes in order.
* @return a 3-element array containing the rotation axes in order
*/
public Vector3D[] toArray() {
return new Vector3D[]{axis1, axis2, axis3};
}
}