/
AngularVelocity.cs
431 lines (376 loc) · 16.4 KB
/
AngularVelocity.cs
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
using Meadow.Units.Conversions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.Runtime.InteropServices;
namespace Meadow.Units;
/// <summary>
/// Represents AngularVelocity
/// </summary>
[Serializable]
[ImmutableObject(true)]
[StructLayout(LayoutKind.Sequential)]
public struct AngularVelocity :
IComparable, IFormattable, IConvertible,
IEquatable<double>, IComparable<double>
{
private static AngularVelocity _zero;
static AngularVelocity()
{
_zero = new AngularVelocity(0, UnitType.RevolutionsPerSecond);
}
/// <summary>
/// Gets an angle of 0 degrees
/// </summary>
public static AngularVelocity Zero => _zero;
/// <summary>
/// Creates a new `AngularVelocity` object.
/// </summary>
/// <param name="value">The AngularVelocity value.</param>
/// <param name="type">kilometers meters per second by default.</param>
public AngularVelocity(double value, UnitType type = UnitType.RevolutionsPerSecond)
{
_value = AngularVelocityConversions.Convert(value, type, UnitType.RevolutionsPerSecond);
}
/// <summary>
/// Creates a new AngularVelocity object.
/// </summary>
/// <param name="angularVelocity"></param>
public AngularVelocity(AngularVelocity angularVelocity)
{
_value = angularVelocity._value;
}
/// <summary>
/// Internal canonical value.
/// </summary>
private readonly double _value;
/// <summary>
/// The type of units available to describe the AngularVelocity.
/// </summary>
public enum UnitType
{
/// <summary>
/// Revolutions per second
/// </summary>
RevolutionsPerSecond,
/// <summary>
/// Revolutions per minute
/// </summary>
RevolutionsPerMinute,
/// <summary>
/// Radians per second
/// </summary>
RadiansPerSecond,
/// <summary>
/// Radians per minute
/// </summary>
RadiansPerMinute,
/// <summary>
/// Degrees per second
/// </summary>
DegreesPerSecond,
/// <summary>
/// Degrees per minute
/// </summary>
DegreesPerMinute
}
/// <summary>
/// Get angular velocity in revolutions per second
/// </summary>
public double RevolutionsPerSecond => From(UnitType.RevolutionsPerSecond);
/// <summary>
/// Get angular velocity in revolutions per minute
/// </summary>
public double RevolutionsPerMinute => From(UnitType.RevolutionsPerMinute);
/// <summary>
/// Get angular velocity in radians per second
/// </summary>
public double RadiansPerSecond => From(UnitType.RadiansPerSecond);
/// <summary>
/// Get angular velocity in radians per minute
/// </summary>
public double RadiansPerMinute => From(UnitType.RadiansPerMinute);
/// <summary>
/// Get angular velocity in degrees per second
/// </summary>
public double DegreesPerSecond => From(UnitType.DegreesPerSecond);
/// <summary>
/// Get angular velocity in degrees per minute
/// </summary>
public double DegreesPerMinute => From(UnitType.DegreesPerMinute);
/// <summary>
/// Get angular velocity for specific unit
/// </summary>
/// <param name="convertTo">the unit to covert to</param>
/// <returns>the angular velocity</returns>
[Pure]
public double From(UnitType convertTo)
{
return AngularVelocityConversions.Convert(_value, UnitType.RevolutionsPerSecond, convertTo);
}
/// <summary>
/// Compare to another AngularVelocity object
/// </summary>
/// <param name="obj">The object to compare</param>
/// <returns>true if equal</returns>
[Pure]
public override bool Equals(object obj)
{
if (obj is null) { return false; }
if (Equals(this, obj)) { return true; }
return obj.GetType() == GetType() && Equals((AngularVelocity)obj);
}
/// <summary>
/// Get hash of object
/// </summary>
/// <returns>int32 hash value</returns>
[Pure] public override int GetHashCode() => _value.GetHashCode();
// implicit conversions
//[Pure] public static implicit operator AngularVelocity(ushort value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(short value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(uint value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(long value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(int value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(float value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(double value) => new AngularVelocity(value);
//[Pure] public static implicit operator AngularVelocity(decimal value) => new AngularVelocity((double)value);
// Comparison
/// <summary>
/// Compare to another AngularVelocity object
/// </summary>
/// <param name="other">The object to compare</param>
/// <returns>true if equal</returns>
[Pure] public bool Equals(AngularVelocity other) => _value == other._value;
/// <summary>
/// Equals operator to compare two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>true if equal</returns>
[Pure] public static bool operator ==(AngularVelocity left, AngularVelocity right) => Equals(left._value, right._value);
/// <summary>
/// Not equals operator to compare two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>true if not equal</returns>
[Pure] public static bool operator !=(AngularVelocity left, AngularVelocity right) => !Equals(left._value, right._value);
/// <summary>
/// Compare to another AngularVelocity object
/// </summary>
/// <param name="other"></param>
/// <returns>0 if equal</returns>
[Pure] public int CompareTo(AngularVelocity other) => Equals(_value, other._value) ? 0 : _value.CompareTo(other._value);
/// <summary>
/// Less than operator to compare two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>true if left is less than right</returns>
[Pure] public static bool operator <(AngularVelocity left, AngularVelocity right) => Comparer<double>.Default.Compare(left._value, right._value) < 0;
/// <summary>
/// Greater than operator to compare two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>true if left is greater than right</returns>
[Pure] public static bool operator >(AngularVelocity left, AngularVelocity right) => Comparer<double>.Default.Compare(left._value, right._value) > 0;
/// <summary>
/// Less than or equal operator to compare two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>true if left is less than or equal to right</returns>
[Pure] public static bool operator <=(AngularVelocity left, AngularVelocity right) => Comparer<double>.Default.Compare(left._value, right._value) <= 0;
/// <summary>
/// Greater than or equal operator to compare two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>true if left is greater than or equal to right</returns>
[Pure] public static bool operator >=(AngularVelocity left, AngularVelocity right) => Comparer<double>.Default.Compare(left._value, right._value) >= 0;
// Math
/// <summary>
/// Addition operator to add two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>A new AngularVelocity object with a value of left + right</returns>
[Pure] public static AngularVelocity operator +(AngularVelocity left, AngularVelocity right) => new(left._value + right._value);
/// <summary>
/// Subtraction operator to subtract two AngularVelocity objects
/// </summary>
/// <param name="left">left value</param>
/// <param name="right">right value</param>
/// <returns>A new AngularVelocity object with a value of left - right</returns>
[Pure] public static AngularVelocity operator -(AngularVelocity left, AngularVelocity right) => new(left._value - right._value);
/// <summary>
/// Multiplication operator to multiply by a double
/// </summary>
/// <param name="value">object to multiply</param>
/// <param name="operand">operand to multiply object</param>
/// <returns>A new AngularVelocity object with a value of value multiplied by the operand</returns>
[Pure] public static AngularVelocity operator *(AngularVelocity value, double operand) => new(value._value * operand);
/// <summary>
/// Division operator to divide by a double
/// </summary>
/// <param name="value">object to be divided</param>
/// <param name="operand">operand to divide object</param>
/// <returns>A new AngularVelocity object with a value of value divided by the operand</returns>
[Pure] public static AngularVelocity operator /(AngularVelocity value, double operand) => new(value._value / operand);
/// <summary>
/// Returns the absolute value of the <see cref="AngularVelocity"/>
/// </summary>
/// <returns></returns>
[Pure] public AngularVelocity Abs() { return new AngularVelocity(Math.Abs(this._value)); }
/// <summary>
/// Get a string representation of the object
/// </summary>
/// <returns>A string representing the object</returns>
[Pure] public override string ToString() => _value.ToString();
/// <summary>
/// Get a string representation of the object
/// </summary>
/// <param name="format">format</param>
/// <param name="formatProvider">format provider</param>
/// <returns>A string representing the object</returns>
[Pure] public string ToString(string format, IFormatProvider formatProvider) => _value.ToString(format, formatProvider);
// IComparable
/// <summary>
/// Compare to another AngularVelocity object
/// </summary>
/// <param name="obj">The other AngularVelocity cast to object</param>
/// <returns>0 if equal</returns>
[Pure] public int CompareTo(object obj) => _value.CompareTo(obj);
/// <summary>
/// Get type code of object
/// </summary>
/// <returns>The TypeCode</returns>
[Pure] public TypeCode GetTypeCode() => _value.GetTypeCode();
/// <summary>
/// Convert to boolean
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>bool representation of the object</returns>
[Pure] public bool ToBoolean(IFormatProvider provider) => ((IConvertible)_value).ToBoolean(provider);
/// <summary>
/// Convert to byte
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>byte representation of the object</returns>
[Pure] public byte ToByte(IFormatProvider provider) => ((IConvertible)_value).ToByte(provider);
/// <summary>
/// Convert to char
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>char representation of the object</returns>
[Pure] public char ToChar(IFormatProvider provider) => ((IConvertible)_value).ToChar(provider);
/// <summary>
/// Convert to DateTime
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>DateTime representation of the object</returns>
[Pure] public DateTime ToDateTime(IFormatProvider provider) => ((IConvertible)_value).ToDateTime(provider);
/// <summary>
/// Convert to Decimal
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>Decimal representation of the object</returns>
[Pure] public decimal ToDecimal(IFormatProvider provider) => ((IConvertible)_value).ToDecimal(provider);
/// <summary>
/// Convert to double
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>double representation of the object</returns>
[Pure] public double ToDouble(IFormatProvider provider) => _value;
/// <summary>
/// Convert to in16
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>int16 representation of the object</returns>
[Pure] public short ToInt16(IFormatProvider provider) => ((IConvertible)_value).ToInt16(provider);
/// <summary>
/// Convert to int32
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>int32 representation of the object</returns>
[Pure] public int ToInt32(IFormatProvider provider) => ((IConvertible)_value).ToInt32(provider);
/// <summary>
/// Convert to int64
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>int64 representation of the object</returns>
[Pure] public long ToInt64(IFormatProvider provider) => ((IConvertible)_value).ToInt64(provider);
/// <summary>
/// Convert to sbyte
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>sbyte representation of the object</returns>
[Pure] public sbyte ToSByte(IFormatProvider provider) => ((IConvertible)_value).ToSByte(provider);
/// <summary>
/// Convert to float
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>float representation of the object</returns>
[Pure] public float ToSingle(IFormatProvider provider) => ((IConvertible)_value).ToSingle(provider);
/// <summary>
/// Convert to string
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>string representation of the object</returns>
[Pure] public string ToString(IFormatProvider provider) => _value.ToString(provider);
/// <summary>
/// Convert to type
/// </summary>
/// <param name="conversionType">conversion type to convert to</param>
/// <param name="provider">format provider</param>
/// <returns>type representation of the object</returns>
[Pure] public object ToType(Type conversionType, IFormatProvider provider) => ((IConvertible)_value).ToType(conversionType, provider);
/// <summary>
/// Convert to uint16
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>uint16 representation of the object</returns>
[Pure] public ushort ToUInt16(IFormatProvider provider) => ((IConvertible)_value).ToUInt16(provider);
/// <summary>
/// Convert to uint32
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>uint32 representation of the object</returns>
[Pure] public uint ToUInt32(IFormatProvider provider) => ((IConvertible)_value).ToUInt32(provider);
/// <summary>
/// Convert to uint64
/// </summary>
/// <param name="provider">format provider</param>
/// <returns>uint64 representation of the object</returns>
[Pure] public ulong ToUInt64(IFormatProvider provider) => ((IConvertible)_value).ToUInt64(provider);
/// <summary>
/// Compare the default value to a double
/// </summary>
/// <param name="other">value to compare</param>
/// <returns>0 if equal</returns>
[Pure]
public int CompareTo(double? other)
{
return (other is null) ? -1 : (_value).CompareTo(other.Value);
}
/// <summary>
/// Compare the default value to a double
/// </summary>
/// <param name="other">value to compare</param>
/// <returns>0 if equal</returns>
[Pure] public bool Equals(double? other) => _value.Equals(other);
/// <summary>
/// Compare the default value to a double
/// </summary>
/// <param name="other">value to compare</param>
/// <returns>0 if equal</returns>
[Pure] public bool Equals(double other) => _value.Equals(other);
/// <summary>
/// Compare the default value to a double
/// </summary>
/// <param name="other">value to compare</param>
/// <returns>0 if equal</returns>
[Pure] public int CompareTo(double other) => _value.CompareTo(other);
}