Angle
Represents an angle value.
using AngleSharp.Extensions;
using System;
namespace AngleSharp.Css.Values
{
public struct Angle : IEquatable<Angle>, IComparable<Angle>, IFormattable
{
public enum Unit : byte
{
None,
Deg,
Rad,
Grad,
Turn
}
public static readonly Angle Zero = new Angle(0, Unit.Rad);
public static readonly Angle HalfQuarter = new Angle(45, Unit.Deg);
public static readonly Angle Quarter = new Angle(90, Unit.Deg);
public static readonly Angle TripleHalfQuarter = new Angle(135, Unit.Deg);
public static readonly Angle Half = new Angle(180, Unit.Deg);
private readonly float _value;
private readonly Unit _unit;
public float Value => _value;
public Unit Type => _unit;
public string UnitString {
get {
switch (_unit) {
case Unit.Deg:
return UnitNames.Deg;
case Unit.Grad:
return UnitNames.Grad;
case Unit.Turn:
return UnitNames.Turn;
case Unit.Rad:
return UnitNames.Rad;
default:
return string.Empty;
}
}
}
public Angle(float value, Unit unit)
{
_value = value;
_unit = unit;
}
public static bool operator >=(Angle a, Angle b)
{
int num = a.CompareTo(b);
if (num != 0)
return num == 1;
return true;
}
public static bool operator >(Angle a, Angle b)
{
return a.CompareTo(b) == 1;
}
public static bool operator <=(Angle a, Angle b)
{
int num = a.CompareTo(b);
if (num != 0)
return num == -1;
return true;
}
public static bool operator <(Angle a, Angle b)
{
return a.CompareTo(b) == -1;
}
public int CompareTo(Angle other)
{
return ToRadian().CompareTo(other.ToRadian());
}
public static bool TryParse(string s, out Angle result)
{
float result2 = 0;
Unit unit = GetUnit(s.CssUnit(out result2));
if (unit != 0) {
result = new Angle(result2, unit);
return true;
}
result = default(Angle);
return false;
}
public static Unit GetUnit(string s)
{
if (s == "deg")
return Unit.Deg;
if (s == "grad")
return Unit.Grad;
if (s == "turn")
return Unit.Turn;
if (s == "rad")
return Unit.Rad;
return Unit.None;
}
public float ToRadian()
{
switch (_unit) {
case Unit.Deg:
return (float)(0.017453292519943295 * (double)_value);
case Unit.Grad:
return (float)(0.015707963267948967 * (double)_value);
case Unit.Turn:
return (float)(6.283185307179586 * (double)_value);
default:
return _value;
}
}
public float ToTurns()
{
switch (_unit) {
case Unit.Deg:
return (float)((double)_value / 360);
case Unit.Grad:
return (float)((double)_value / 400);
case Unit.Rad:
return (float)((double)_value / 6.283185307179586);
default:
return _value;
}
}
public bool Equals(Angle other)
{
return ToRadian() == other.ToRadian();
}
public static bool operator ==(Angle a, Angle b)
{
return a.Equals(b);
}
public static bool operator !=(Angle a, Angle b)
{
return !a.Equals(b);
}
public override bool Equals(object obj)
{
Angle? nullable = obj as Angle?;
if (nullable.HasValue)
return Equals(nullable.Value);
return false;
}
public override int GetHashCode()
{
return (int)_value;
}
public override string ToString()
{
return _value.ToString() + UnitString;
}
public string ToString(string format, IFormatProvider formatProvider)
{
return _value.ToString(format, formatProvider) + UnitString;
}
}
}