度分秒的相关运算
包括度分秒和数字的加法运算,
度分秒和数字的除法,
度分秒和度分秒的加减乘除法
度分秒和度分秒的大小对比
参数构造函数,无参构造函数
public class SpeDegrre
{
private int deg;
public int Deg
{
set
{
if (value >= 0 && value <= 360)
{
deg = value;
}
}
get
{
return deg;
}
}
private int min;
public int Min
{
set
{
if (value >= 0 && value < 60)
{
min = value;
}
}
get
{
return min;
}
}
private int sec;
public int Sec
{
set
{
if (value >= 0 && value < 60)
{
sec = value;
}
}
get
{
return sec;
}
}
/// <summary>
/// symbol,1,为正
/// -1,为负
/// </summary>
///
public int symbol = 1;
public SpeDegrre()
{
deg = 0;
min = 0;
sec = 0;
symbol = 1;
//Debug.Log(":" + deg + "," + min + "," + sec);
}
public SpeDegrre(int vaDeg, int vaMin, int vaSec,int vaSym=1)
{
//Debug.Log(":" + vaDeg + "," + vaMin + "," + vaSec+","+vaSym);
if(vaSym>0 && (vaDeg < 0 || vaMin < 0 || vaSec < 0))
{
symbol = -1;
}
else
{
symbol = vaSym;
}
vaDeg = Mathf.Abs(vaDeg);
vaMin = Math.Abs(vaMin);
vaSec = Math.Abs(vaSec);
if (vaSec >= 60)
{
int temp = vaSec % 60;
int temp02 = vaSec / 60;
sec = temp;
vaMin += temp02;
}
else
{
sec = vaSec;
}
if (vaMin >= 60)
{
int temp = vaMin % 60;
int temp02 = vaMin / 60;
min = temp;
vaDeg += temp02;
}
else
{
min = vaMin;
}
if (vaDeg > 360)
{
int temp = vaDeg % 360;
deg = temp;
}
else
{
deg = vaDeg;
}
}
public SpeDegrre(SpeDegrre b)
{
deg = b.deg;
min = b.min;
sec = b.sec;
symbol = b.symbol;
}
public static SpeDegrre operator +(SpeDegrre b, SpeDegrre c)
{
SpeDegrre box = new SpeDegrre();
if (b.symbol * c.symbol == 1)
{
box = Add(b, c);
box.symbol = b.symbol;
}
else if (b.symbol > 0 && c.symbol < 0)
{
var tempc = new SpeDegrre(c);
tempc.symbol = 1;
if (b > tempc || b == tempc)
{
box = Reduce(b, c);
}
else if (b < tempc)
{
box = Reduce(c, b);
box.symbol = -1;
}
}
else if (b.symbol < 0 && c.symbol > 0)
{
var tempb = new SpeDegrre(b);
tempb.symbol = 1;
if (c > tempb || c == tempb)
{
box = Reduce(c, b);
}
else
{
box = Reduce(b, c);
box.symbol = -1;
}
}
return box;
}
public static SpeDegrre operator +(SpeDegrre a, int b)
{
SpeDegrre box = new SpeDegrre();
if (a.symbol > 0)
{
box.deg = a.deg + b;
if (box.deg >= 360)
{
box.deg -= 360;
}
}
else if (a.symbol < 0 && b > 0)
{
var temp = new SpeDegrre(b, 0, 0);
box = temp + a;
}
return box;
}
public static SpeDegrre operator -(SpeDegrre b, SpeDegrre c)
{
SpeDegrre box = new SpeDegrre();
var tempb = new SpeDegrre(b.deg, b.min, b.sec);
var tempc = new SpeDegrre(c.deg, c.min, c.sec);
SpeDegrre box2 = Add(tempb, tempc);
if (b.symbol > 0 && c.symbol > 0)
{
if (tempb > tempc || tempb == tempc)
{
box = Reduce(tempb, tempc);
}
else
{
box = Reduce(tempc, tempb);
box.symbol = -1;
//Debug.Log(box.ToString()+","+box.symbol);
}
}
else if (b.symbol < 0 && c.symbol < 0)
{
if (tempb < tempc || tempb == tempc)
{
box = Reduce(tempc, tempb);
box.symbol = 1;
}
else
{
box = Reduce(tempb, tempc);
box.symbol = -1;
}
}
else if (b.symbol < 0 && c.symbol > 0)
{
box = new SpeDegrre(box2);
box.symbol = -1;
}
else if (b.symbol > 0 && c.symbol < 0)
{
box = new SpeDegrre(box2);
box.symbol = 1;
}
return box;
}
private static SpeDegrre Add(SpeDegrre b, SpeDegrre c)
{
SpeDegrre sum = new SpeDegrre();
sum.deg = b.deg + c.deg;
sum.min = b.min + c.min;
sum.sec = b.sec + c.sec;
if (sum.sec > 60)
{
sum.min++;
sum.sec -= 60;
}
if (sum.min > 60)
{
sum.min -= 60;
sum.deg++;
}
if (sum.deg >= 360)
{
sum.deg -= 360;
}
return sum;
}
private static SpeDegrre Reduce(SpeDegrre b, SpeDegrre c)
{
SpeDegrre box = new SpeDegrre();
int vadeg = b.deg - c.deg;
int vamin = b.min - c.min;
int vasec = b.sec - c.sec;
if (vasec < 0)
{
vamin--;
vasec += 60;
}
if (vamin < 0)
{
vadeg--;
vamin += 60;
}
if (vadeg < 0)
{
box.symbol = -1;
}
box.deg = vadeg;
box.min = vamin;
box.sec = vasec;
return box;
}
public static SpeDegrre operator /(SpeDegrre b, float c)
{
if (c == 0) return b;
SpeDegrre box = new SpeDegrre();
var degTemp = b.deg / c;
var minTemp = b.min / c;
var secTemp = b.sec / c;
var degree = Mathf.FloorToInt(degTemp);
box.deg = degree;
var minF = (degTemp - degree) * 60 + minTemp;
if (minF >= 60)
{
box.deg++;
minF -= 60;
}
var min = Mathf.FloorToInt(minF);
box.min = min;
var sec = Mathf.FloorToInt((minF - min) * 60) + secTemp;
if (sec >= 60)
{
box.min++;
sec -= 60;
}
box.sec = (int)sec;
if ((b.symbol > 0 && c > 0)
|| (b.symbol < 0 && c < 0))
{
box.symbol = 1;
}
else
{
box.symbol = -1;
}
return box;
}
public static SpeDegrre operator /(SpeDegrre b, SpeDegrre c)
{
SpeDegrre box = new SpeDegrre();
double mylonga = (b.Deg * 3600 + b.Min * 60 + b.Sec);
double mylongb = (c.Deg * 3600 + c.Min * 60 + c.Sec);
double m = (mylonga) / (mylongb);
m = m * 3600;
int degree = (int)(m / 3600);
int min =(int)( (m - degree * 3600) / 60);
int sec =(int) (m - degree * 3600 - min * 60);
box.deg = degree;
box.min = min;
box.sec = sec;
if (b.symbol * c.symbol == 1)
{
box.symbol = 1;
}
else
{
box.symbol = -1;
}
return box;
}
public static SpeDegrre operator *(SpeDegrre b, SpeDegrre c)
{
SpeDegrre box = new SpeDegrre();
double mylonga = (b.Deg*3600 + b.Min *60 + b.Sec);
double mylongb = (c.Deg*3600 + c.Min *60 + c.Sec);
decimal m =(decimal) ((mylonga/3600) * (mylongb/3600));
m = m * 3600;
int degree = (int)(m / 3600);
int min = (int)((m - degree * 3600) / 60);
int sec = (int)(m - degree * 3600 - min * 60);
box.deg = degree;
box.min = min;
box.sec = sec;
if (b.symbol * c.symbol == 1)
{
box.symbol = 1;
}
else
{
box.symbol = -1;
}
return box;
}
public static bool operator <(SpeDegrre b, SpeDegrre c)
{
if (b == c) return false;
return !(b > c);
}
public static bool operator >(SpeDegrre b, SpeDegrre c)
{
if (b == c) return false;
if (b.symbol > 0 && c.symbol < 0)
{
return true;
}
else if (b.symbol < 0 && c.symbol > 0)
{
return false;
}
else
{
bool resliut;
if (b.deg == c.deg)
{
if (b.min == c.min)
{
if (b.sec <= c.sec)
{
resliut = false;
}
else
{
resliut = true;
}
}
else if (b.min < c.min)
{
resliut = false;
}
else
{
resliut = true;
}
}
else if (b.deg < c.deg)
{
resliut = false;
}
else
{
resliut = true;
}
resliut = b.symbol > 0 ? resliut : !resliut;
return resliut;
}
}
public override bool Equals(object obj) => this.Equals(obj as SpeDegrre);
public bool Equals(SpeDegrre b)
{
if (b is null)
{
return false;
}
// Optimization for a common success case.
if (ReferenceEquals(this, b))
{
return true;
}
// If run-time types are not exactly the same, return false.
if (GetType() != b.GetType())
{
return false;
}
// Return true if the fields match.
// Note that the base class is not invoked because it is
// System.Object, which defines Equals as reference equality.
return (deg == b.deg) && (min == b.min) && (sec == b.sec) && (symbol == b.symbol);
//return (this == obj);
}
public override int GetHashCode() => (deg, min, sec).GetHashCode();
public static bool operator ==(SpeDegrre a, SpeDegrre b)
{
if (a is null)
{
if (b is null)
{
return true;
}
// Only the left side is null.
return false;
}
// Equals handles case of null on right side.
return a.Equals(b);
}
public static bool operator !=(SpeDegrre a, SpeDegrre b) => !(a == b);
public override string ToString()
{
if (symbol < 0)
{
return string.Format("-{0}°{1}′{2}″", deg,
min, sec);
}
else
{
return string.Format("{0}°{1}′{2}″", deg,
min, sec);
}
}
public float GetFloatDeg()
{
float angleDeg = ((float)Deg);
float angleMin = (((float)Min) / 60);
float angleSec = (((float)Sec) / 3600);
return angleDeg + angleMin + angleSec;
}
}
下面是度分秒输入
for (int n = 0; n < myinputs.Length; n++)
{
var temp = n;
myinputs[n].onEndEdit.AddListener((str) => FillData(temp));
}
private void FillData(int temp)
{
if (CheckAngeAingle(temp))
{
myinputs[temp].text = olddata[temp].ToString();
}
}