NetFabric.Angle

A strongly-typed representation of an angle.


Keywords
math, numerics, trigonometry, angle, csharp, csharp-library, degrees, dotnet, nuget, nuget-package, radians, reference-angle, visual-basic
License
MIT
Install
Install-Package NetFabric.Angle -Version 3.3.0

Documentation

GitHub last commit (develop) Build Unit Tests Coverage NuGet Version NuGet Downloads

NetFabric.Angle

Implements a structure representing an angle.

The explicit declaration of the units in creation and reading methods reduces the usual units confusion when dealing with angles.

Includes lerp, reduction, reference angle, comparison, classification and trigonometry operations.

Usage:

Adding to your project

NetFabric.Angle is available as a NuGet package and as a Unity package.

Creation of the angle:

Use the methods for the units you are working with:

var right0 = Angle.FromRadian(Math.PI / 2.0);
var right1 = Angle.FromDegrees(90.0);
var right3 = Angle.FromGradian(100.0);

Arcminutes and arcseconds have to be values in the interval [0.0, 60.0[

var right3 = Angle.FromDegrees(90, 0.0); // degrees and arcminutes
var right4 = Angle.FromDegrees(-90, 0, 0.0); // degrees, arcminutes and arcseconds

You can use the predefined angles:

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

Reading the angle:

var radians = angleRadians.Radians;
var degrees = angleDegrees.Degrees;
var gradians = angleGradians.Gradians;

An angle in degrees can be deconstructed into DMS notation. This can be done using either out arguments:

int degrees0;
double minute0;
angleDegrees.Deconstruct(out degrees0, out minutes0);

int degrees1;
int minute1;
double seconds1;
angleDegrees.Deconstruct(out degrees1, out minutes1, out seconds1);

out arguments with C# 7 syntax:

angleDegrees.Deconstruct(out var degrees0, out var minutes0);
angleDegrees.Deconstruct(out var degrees1, out var minutes1, out var seconds1);

or using value tuples:

(var degrees0, var minutes0) = angleDegrees;
(var degrees1, var minutes1, var seconds1) = angleDegrees;

Reduction and reference

The angle can be reduced to a coterminal angle in the range [0.0, 360.0[ degrees: ​

var angle = Angle.Reduce(AngleDegrees.Right + AngleDegrees.Full); // result is AngleDegrees.Right

Getting the reference angle (the smallest angle with the x-axis):

var angle = Angle.GetReference(AngleDegrees.Right + AngleDegrees.FromDegrees(45.0)); // result is an angle with 45 degrees

Math operations

Math operators are defined allowing calculations with angles. (For performance reasons the results are not reduced) ​

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;

Equivalent methods are also defined so they can be used for languages that do not support operators.

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);

Comparison

Comparison operatores can be used to compare two angles: ​

if(angle0 > angle1 || angle0 == angle2) {
    ...
}

For languages that do not support operators use the static Compare() method: ​

if(Angle.Compare(angle0, angle1) <= 0) { // less or equal to
    ...
}

For performance reasons, the values compared are not reduced. You'll have to explicitly reduce both angles before comparing: ​

if(Angle.Reduce(angle0) > Angle.Reduce(angle1)) {
    ...
}

or use the static CompareReduced() method:

if(Angle.CompareReduced(angle0, angle1) > 0) {
    ...
}

Trigonometry

The usual trigonometry operations (sin, cos, tan, asin, acos, atan, sinh and cosh) are available as static methods but only for angles in radians:

double value0 = Angle.Sin(angleRadians);
AngleRadians angle0 = Angle.Asin(value0);

Angles not in radians have to be converted:

double value1 = Angle.Sin(Angle.ToRadians(angleDegrees));
AngleDegrees angle1 = Angle.ToDegrees(Angle.Asin(value1));

Classification

You can get the quadrante of the angle

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

and can check if an angle is acute, right, obtuse, straight or reflex:

var isAcute = Angle.IsAcute(AngleDegrees.Right); // false
var isAcute = Angle.IsAcute(Angle.FromDegrees(45.0)); // true
var isRight = Angle.IsRight(AngleDegrees.Right); // true

Classification considers the reduced positive equivalent of the angle so:

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