1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.geometry.euclidean.threed.rotation; 18 19 import org.apache.commons.geometry.euclidean.threed.Vector3D; 20 21 /** Enum containing rotation axis sequences for use in defining 3 dimensional rotations. 22 */ 23 public enum AxisSequence { 24 25 /** Set of Tait-Bryan angles around the <strong>X</strong>, <strong>Y</strong>, and 26 * <strong>Z</strong> axes in that order. 27 */ 28 XYZ(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z), 29 30 /** Set of Tait-Bryan angles around the <strong>X</strong>, <strong>Z</strong>, and 31 * <strong>Y</strong> axes in that order. 32 */ 33 XZY(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y), 34 35 /** Set of Tait-Bryan angles around the <strong>Y</strong>, <strong>X</strong>, and 36 * <strong>Z</strong> axes in that order. 37 */ 38 YXZ(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z), 39 40 /** Set of Tait-Bryan angles around the <strong>Y</strong>, <strong>Z</strong>, and 41 * <strong>X</strong> axes in that order. 42 */ 43 YZX(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X), 44 45 /** Set of Cardan angles. 46 * this ordered set of rotations is around Z, then around X, then 47 * around Y 48 */ 49 ZXY(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y), 50 51 /** Set of Tait-Bryan angles around the <strong>Z</strong>, <strong>Y</strong>, and 52 * <strong>X</strong> axes in that order. 53 */ 54 ZYX(AxisSequenceType.TAIT_BRYAN, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X), 55 56 /** Set of Euler angles around the <strong>X</strong>, <strong>Y</strong>, and 57 * <strong>X</strong> axes in that order. 58 */ 59 XYX(AxisSequenceType.EULER, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X), 60 61 /** Set of Euler angles around the <strong>X</strong>, <strong>Z</strong>, and 62 * <strong>X</strong> axes in that order. 63 */ 64 XZX(AxisSequenceType.EULER, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X), 65 66 /** Set of Euler angles around the <strong>Y</strong>, <strong>X</strong>, and 67 * <strong>Y</strong> axes in that order. 68 */ 69 YXY(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y), 70 71 /** Set of Euler angles around the <strong>Y</strong>, <strong>Z</strong>, and 72 * <strong>Y</strong> axes in that order. 73 */ 74 YZY(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y), 75 76 /** Set of Euler angles around the <strong>Z</strong>, <strong>X</strong>, and 77 * <strong>Z</strong> axes in that order. 78 */ 79 ZXZ(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Z), 80 81 /** Set of Euler angles around the <strong>Z</strong>, <strong>Y</strong>, and 82 * <strong>Z</strong> axes in that order. 83 */ 84 ZYZ(AxisSequenceType.EULER, Vector3D.Unit.PLUS_Z, Vector3D.Unit.PLUS_Y, Vector3D.Unit.PLUS_Z); 85 86 /** The type of axis sequence. */ 87 private final AxisSequenceType type; 88 89 /** Axis of the first rotation. */ 90 private final Vector3D axis1; 91 92 /** Axis of the second rotation. */ 93 private final Vector3D axis2; 94 95 /** Axis of the third rotation. */ 96 private final Vector3D axis3; 97 98 /** Simple constructor. 99 * @param type the axis sequence type 100 * @param axis1 first rotation axis 101 * @param axis2 second rotation axis 102 * @param axis3 third rotation axis 103 */ 104 AxisSequence(final AxisSequenceType type, final Vector3D axis1, final Vector3D axis2, final Vector3D axis3) { 105 this.type = type; 106 107 this.axis1 = axis1; 108 this.axis2 = axis2; 109 this.axis3 = axis3; 110 } 111 112 /** Get the axis sequence type. 113 * @return the axis sequence type 114 */ 115 public AxisSequenceType getType() { 116 return type; 117 } 118 119 /** Get the first rotation axis. 120 * @return the first rotation axis 121 */ 122 public Vector3D getAxis1() { 123 return axis1; 124 } 125 126 /** Get the second rotation axis. 127 * @return the second rotation axis 128 */ 129 public Vector3D getAxis2() { 130 return axis2; 131 } 132 133 /** Get the third rotation axis. 134 * @return the third rotation axis 135 */ 136 public Vector3D getAxis3() { 137 return axis3; 138 } 139 140 /** Get an array containing the 3 rotation axes in order. 141 * @return a 3-element array containing the rotation axes in order 142 */ 143 public Vector3D[] toArray() { 144 return new Vector3D[]{axis1, axis2, axis3}; 145 } 146 }