/
HeadingPitchRoll.js
189 lines (178 loc) · 8.54 KB
/
HeadingPitchRoll.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
define([
'./defaultValue',
'./defined',
'./DeveloperError',
'./Math'
], function(
defaultValue,
defined,
DeveloperError,
CesiumMath) {
'use strict';
/**
* A rotation expressed as a heading, pitch, and roll. Heading is the rotation about the
* negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about
* the positive x axis.
* @alias HeadingPitchRoll
* @constructor
*
* @param {Number} [heading=0.0] The heading component in radians.
* @param {Number} [pitch=0.0] The pitch component in radians.
* @param {Number} [roll=0.0] The roll component in radians.
*/
function HeadingPitchRoll(heading, pitch, roll) {
this.heading = defaultValue(heading, 0.0);
this.pitch = defaultValue(pitch, 0.0);
this.roll = defaultValue(roll, 0.0);
}
/**
* Computes the heading, pitch and roll from a quaternion (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles )
*
* @param {Quaternion} quaternion The quaternion from which to retrieve heading, pitch, and roll, all expressed in radians.
* @param {HeadingPitchRoll} [result] The object in which to store the result. If not provided, a new instance is created and returned.
* @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if one was not provided.
*/
HeadingPitchRoll.fromQuaternion = function(quaternion, result) {
//>>includeStart('debug', pragmas.debug);
if (!defined(quaternion)) {
throw new DeveloperError('quaternion is required');
}
//>>includeEnd('debug');
if (!defined(result)) {
result = new HeadingPitchRoll();
}
var test = 2 * (quaternion.w * quaternion.y - quaternion.z * quaternion.x);
var denominatorRoll = 1 - 2 * (quaternion.x * quaternion.x + quaternion.y * quaternion.y);
var numeratorRoll = 2 * (quaternion.w * quaternion.x + quaternion.y * quaternion.z);
var denominatorHeading = 1 - 2 * (quaternion.y * quaternion.y + quaternion.z * quaternion.z);
var numeratorHeading = 2 * (quaternion.w * quaternion.z + quaternion.x * quaternion.y);
result.heading = -Math.atan2(numeratorHeading, denominatorHeading);
result.roll = Math.atan2(numeratorRoll, denominatorRoll);
result.pitch = -Math.asin(test);
return result;
};
/**
* Returns a new HeadingPitchRoll instance from angles given in degrees.
*
* @param {Number} heading the heading in degrees
* @param {Number} pitch the pitch in degrees
* @param {Number} roll the heading in degrees
* @param {HeadingPitchRoll} [result] The object in which to store the result. If not provided, a new instance is created and returned.
* @returns {HeadingPitchRoll} A new HeadingPitchRoll instance
*/
HeadingPitchRoll.fromDegrees = function(heading, pitch, roll, result) {
//>>includeStart('debug', pragmas.debug);
if (!defined(heading)) {
throw new DeveloperError('heading is required');
}
if (!defined(pitch)) {
throw new DeveloperError('pitch is required');
}
if (!defined(roll)) {
throw new DeveloperError('roll is required');
}
//>>includeEnd('debug');
if (!defined(result)) {
result = new HeadingPitchRoll();
}
result.heading = heading * CesiumMath.RADIANS_PER_DEGREE;
result.pitch = pitch * CesiumMath.RADIANS_PER_DEGREE;
result.roll = roll * CesiumMath.RADIANS_PER_DEGREE;
return result;
};
/**
* Duplicates a HeadingPitchRoll instance.
*
* @param {HeadingPitchRoll} headingPitchRoll The HeadingPitchRoll to duplicate.
* @param {HeadingPitchRoll} [result] The object onto which to store the result.
* @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if one was not provided. (Returns undefined if headingPitchRoll is undefined)
*/
HeadingPitchRoll.clone = function(headingPitchRoll, result) {
if (!defined(headingPitchRoll)) {
return undefined;
}
if (!defined(result)) {
return new HeadingPitchRoll(headingPitchRoll.heading, headingPitchRoll.pitch, headingPitchRoll.roll);
}
result.heading = headingPitchRoll.heading;
result.pitch = headingPitchRoll.pitch;
result.roll = headingPitchRoll.roll;
return result;
};
/**
* Compares the provided HeadingPitchRolls componentwise and returns
* <code>true</code> if they are equal, <code>false</code> otherwise.
*
* @param {HeadingPitchRoll} [left] The first HeadingPitchRoll.
* @param {HeadingPitchRoll} [right] The second HeadingPitchRoll.
* @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
*/
HeadingPitchRoll.equals = function(left, right) {
return (left === right) ||
((defined(left)) &&
(defined(right)) &&
(left.heading === right.heading) &&
(left.pitch === right.pitch) &&
(left.roll === right.roll));
};
/**
* Compares the provided HeadingPitchRolls componentwise and returns
* <code>true</code> if they pass an absolute or relative tolerance test,
* <code>false</code> otherwise.
*
* @param {HeadingPitchRoll} [left] The first HeadingPitchRoll.
* @param {HeadingPitchRoll} [right] The second HeadingPitchRoll.
* @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
* @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
* @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
*/
HeadingPitchRoll.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) {
return (left === right) ||
(defined(left) &&
defined(right) &&
CesiumMath.equalsEpsilon(left.heading, right.heading, relativeEpsilon, absoluteEpsilon) &&
CesiumMath.equalsEpsilon(left.pitch, right.pitch, relativeEpsilon, absoluteEpsilon) &&
CesiumMath.equalsEpsilon(left.roll, right.roll, relativeEpsilon, absoluteEpsilon));
};
/**
* Duplicates this HeadingPitchRoll instance.
*
* @param {HeadingPitchRoll} [result] The object onto which to store the result.
* @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if one was not provided.
*/
HeadingPitchRoll.prototype.clone = function(result) {
return HeadingPitchRoll.clone(this, result);
};
/**
* Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns
* <code>true</code> if they are equal, <code>false</code> otherwise.
*
* @param {HeadingPitchRoll} [right] The right hand side HeadingPitchRoll.
* @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
*/
HeadingPitchRoll.prototype.equals = function(right) {
return HeadingPitchRoll.equals(this, right);
};
/**
* Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns
* <code>true</code> if they pass an absolute or relative tolerance test,
* <code>false</code> otherwise.
*
* @param {HeadingPitchRoll} [right] The right hand side HeadingPitchRoll.
* @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
* @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
* @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
*/
HeadingPitchRoll.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) {
return HeadingPitchRoll.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon);
};
/**
* Creates a string representing this HeadingPitchRoll in the format '(heading, pitch, roll)' in radians.
*
* @returns {String} A string representing the provided HeadingPitchRoll in the format '(heading, pitch, roll)'.
*/
HeadingPitchRoll.prototype.toString = function() {
return '(' + this.heading + ', ' + this.pitch + ', ' + this.roll + ')';
};
return HeadingPitchRoll;
});