| /* |
| * 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}; |
| } |
| } |