角度を表す構造体を実装します。
角度は、最初に定義された角度測定単位で倍精度でメモリに保存されるため、変換を細かく制御し、丸め誤差を減らすことができます。すべての操作は厳密に型指定されます。
lerp、リダクション、基準角度、比較、分類、三角法のような角度演算が含まれます。
NetFabric.Angle は、NuGet パッケージおよび Unity パッケージとして入手できます。
使用している測定単位のメソッドを使用します。
var right0 = Angle . FromRadian ( Math . PI / 2.0 ) ;
var right1 = Angle . FromDegrees ( 90.0 ) ;
var right3 = Angle . FromGradian ( 100.0 ) ;
DMS 形式を使用する場合、分弧と秒は [0.0, 60.0[] の範囲の値である必要があります。
var right3 = Angle . FromDegrees ( 90 , 59.9 ) ; // degrees and arcminutes
var right4 = Angle . FromDegrees ( - 90 , 59 , 59.9 ) ; // degrees, arcminutes and arcseconds
定義済みの角度は、任意の測定単位で使用できます。
var zero = AngleDegrees . Zero ; // 0 degrees
var right = AngleDegrees . Right ; // 90 degrees
var straight = AngleDegrees . Straight ; // 180 degrees
var full = AngleDegrees . Full ; // 360 degrees
var zero = AngleRadians . Zero ; // 0 radians
var right = AngleRadians . Right ; // PI/2 radians
var straight = AngleRadians . Straight ; // PI radians
var full = AngleRadians . Full ; // 2 * PI radians
static
メソッドを使用して角度を変換します。
var radians = Angle . ToRadians ( angle ) ;
角度は厳密に型指定されているため、どの測定単位から変換されているかがわかります。
注:必要に応じて、結果を明示的に削減する必要があります。
(明示的に) 測定単位にちなんで名付けられたプロパティを使用します。
var radians = angleRadians . Radians ;
var degrees = angleDegrees . Degrees ;
var gradians = angleGradians . Gradians ;
度単位の角度は DMS 表記に分解できます。これは、次のいずれかのout引数を使用して実行できます。
int degrees0 ;
double minute0 ;
angleDegrees . Deconstruct ( out degrees0 , out minutes0 ) ;
int degrees1 ;
int minute1 ;
double seconds1 ;
angleDegrees . Deconstruct ( out degrees1 , out minutes1 , out seconds1 ) ;
C# 7 構文でのout引数:
angleDegrees . Deconstruct ( out var degrees0 , out var minutes0 ) ;
angleDegrees . Deconstruct ( out var degrees1 , out var minutes1 , out var seconds1 ) ;
または C# 7 デコンストラクターを使用します。
var ( degrees0 , minutes0 ) = angleDegrees ;
var ( degrees1 , minutes1 , seconds1 ) = angleDegrees ;
角度は、範囲 [0.0, 360.0[ 度:
var angle = Angle . Reduce ( AngleDegrees . Right + AngleDegrees . Full ) ; // result is AngleDegrees.Right
基準角度 (X 軸との最小角度) を取得します。
var angle = Angle . GetReference ( AngleDegrees . Right + AngleDegrees . FromDegrees ( 45.0 ) ) ; // result is an angle with 45 degrees
算術演算子が定義されており、角度を使った計算が可能です。
var angle0 = - AngleDegrees . Right ;
var angle1 = AngleDegrees . Straight + Angle . FromDegrees ( 45.0 ) ;
var angle2 = 2.0 * Angle . FromDegrees ( 30.0 ) ;
var angle3 = Angle . FromDegrees ( 30.0 ) / 2.0 ;
注:必要に応じて、結果を明示的に削減する必要があります。
同等のメソッドも定義されているため、演算子をサポートしていない言語でも使用できます。
var angle0 = Angle . Negate ( AngleDegrees . Right ) ;
var angle1 = Angle . Add ( AngleDegrees . Straight , Angle . FromDegrees ( 45.0 ) ) ;
var angle2 = Angle . Multiply ( 2.0 , Angle . FromDegrees ( 30.0 ) ) ;
var angle3 = Angle . Divide ( Angle . FromDegrees ( 30.0 ) , 2.0 ) ;
比較演算子を使用して 2 つの角度を比較できます。
if ( angle0 > angle1 || angle0 == angle2 ) {
.. .
}
演算子をサポートしない言語の場合は、静的な Compare() メソッドを使用します。
if ( Angle . Compare ( angle0 , angle1 ) <= 0 ) { // less or equal to
.. .
}
パフォーマンス上の理由から、比較される値は減りません。必要な場合は、明示的に削減する必要があります。
if ( Angle . Reduce ( angle0 ) > Angle . Reduce ( angle1 ) ) {
.. .
}
または、静的な CompareReduced() メソッドを使用します。
if ( Angle . CompareReduced ( angle0 , angle1 ) > 0 ) {
.. .
}
通常の三角関数演算 (sin、cos、tan、asin、acos、atan、sinh、cosh) は静的メソッドとして使用できますが、角度はラジアン単位でのみ使用できます。
double value0 = Angle . Sin ( angleRadians ) ;
AngleRadians angle0 = Angle . Asin ( value0 ) ;
ラジアン以外の角度は変換する必要があります。
double value1 = Angle . Sin ( Angle . ToRadians ( angleDegrees ) ) ;
AngleDegrees angle1 = Angle . ToDegrees ( Angle . Asin ( value1 ) ) ;
角度の四分円を取得できます
var quad0 = Angle . GetQuadrant ( Angle . FromDegrees ( 45.0 ) ) ; // Angle.Quadrant.First
var quad1 = Angle . GetQuadrant ( Angle . FromDegrees ( 220.0 ) ) ; // Angle.Quadrant.Third
var quad2 = Angle . GetQuadrant ( Angle . FromDegrees ( - 45.0 ) ) ; // Angle.Quadrant.Fourth
角度が鋭角、直角、鈍角、直線、または反射であるかどうかを確認できます。
var isAcute = Angle . IsAcute ( AngleDegrees . Right ) ; // false
var isAcute = Angle . IsAcute ( Angle . FromDegrees ( 45.0 ) ) ; // true
var isRight = Angle . IsRight ( AngleDegrees . Right ) ; // true
分類では、次のように、角度の正の換算値が考慮されます。
var isAcute = Angle . IsAcute ( Angle . FromDegrees ( 45.0 ) ) ; // true
var isAcute = Angle . IsAcute ( Angle . FromDegrees ( - 45.0 ) ) ; // true
var isAcute = Angle . IsAcute ( Angle . FromDegrees ( 315.0 ) ) ; // false