VFactor.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using System;
  2. [Serializable]
  3. public struct VFactor
  4. {
  5. public long nom; //分子
  6. public long den; //分母
  7. [NonSerialized]
  8. public static VFactor zero = new VFactor(0L, 1L);
  9. [NonSerialized]
  10. public static VFactor one = new VFactor(1L, 1L);
  11. [NonSerialized]
  12. public static VFactor pi = new VFactor(31416L, 10000L);
  13. [NonSerialized]
  14. public static VFactor twoPi = new VFactor(62832L, 10000L);
  15. private static long mask_ = 9223372036854775807L;
  16. private static long upper_ = 16777215L;
  17. public int roundInt
  18. {
  19. get
  20. {
  21. return (int)IntMath.Divide(this.nom, this.den);
  22. }
  23. }
  24. public int integer
  25. {
  26. get
  27. {
  28. return (int)(this.nom / this.den);
  29. }
  30. }
  31. public float single
  32. {
  33. get
  34. {
  35. double num = (double)this.nom / (double)this.den;
  36. return (float)num;
  37. }
  38. }
  39. public bool IsPositive
  40. {
  41. get
  42. {
  43. /* DebugHelper.Assert(this.den != 0L, "VFactor: denominator is zero !");*/
  44. if (this.nom == 0L)
  45. {
  46. return false;
  47. }
  48. bool flag = this.nom > 0L;
  49. bool flag2 = this.den > 0L;
  50. return !(flag ^ flag2);
  51. }
  52. }
  53. public bool IsNegative
  54. {
  55. get
  56. {
  57. /* DebugHelper.Assert(this.den != 0L, "VFactor: denominator is zero !");*/
  58. if (this.nom == 0L)
  59. {
  60. return false;
  61. }
  62. bool flag = this.nom > 0L;
  63. bool flag2 = this.den > 0L;
  64. return flag ^ flag2;
  65. }
  66. }
  67. public bool IsZero
  68. {
  69. get
  70. {
  71. return this.nom == 0L;
  72. }
  73. }
  74. public VFactor Inverse
  75. {
  76. get
  77. {
  78. return new VFactor(this.den, this.nom);
  79. }
  80. }
  81. public VFactor(long n, long d)
  82. {
  83. this.nom = n;
  84. this.den = d;
  85. }
  86. public override bool Equals(object obj)
  87. {
  88. return obj != null && base.GetType() == obj.GetType() && this == (VFactor)obj;
  89. }
  90. public override int GetHashCode()
  91. {
  92. return base.GetHashCode();
  93. }
  94. public override string ToString()
  95. {
  96. return this.single.ToString();
  97. }
  98. public void strip()
  99. {
  100. while ((this.nom & VFactor.mask_) > VFactor.upper_ && (this.den & VFactor.mask_) > VFactor.upper_)
  101. {
  102. this.nom >>= 1;
  103. this.den >>= 1;
  104. }
  105. }
  106. public static bool operator <(VFactor a, VFactor b)
  107. {
  108. long num = a.nom * b.den;
  109. long num2 = b.nom * a.den;
  110. bool flag = b.den > 0L ^ a.den > 0L;
  111. return (!flag) ? (num < num2) : (num > num2);
  112. }
  113. public static bool operator >(VFactor a, VFactor b)
  114. {
  115. long num = a.nom * b.den;
  116. long num2 = b.nom * a.den;
  117. bool flag = b.den > 0L ^ a.den > 0L;
  118. return (!flag) ? (num > num2) : (num < num2);
  119. }
  120. public static bool operator <=(VFactor a, VFactor b)
  121. {
  122. long num = a.nom * b.den;
  123. long num2 = b.nom * a.den;
  124. bool flag = b.den > 0L ^ a.den > 0L;
  125. return (!flag) ? (num <= num2) : (num >= num2);
  126. }
  127. public static bool operator >=(VFactor a, VFactor b)
  128. {
  129. long num = a.nom * b.den;
  130. long num2 = b.nom * a.den;
  131. bool flag = b.den > 0L ^ a.den > 0L;
  132. return (!flag) ? (num >= num2) : (num <= num2);
  133. }
  134. public static bool operator ==(VFactor a, VFactor b)
  135. {
  136. return a.nom * b.den == b.nom * a.den;
  137. }
  138. public static bool operator !=(VFactor a, VFactor b)
  139. {
  140. return a.nom * b.den != b.nom * a.den;
  141. }
  142. public static bool operator <(VFactor a, long b)
  143. {
  144. long num = a.nom;
  145. long num2 = b * a.den;
  146. return (a.den <= 0L) ? (num > num2) : (num < num2);
  147. }
  148. public static bool operator >(VFactor a, long b)
  149. {
  150. long num = a.nom;
  151. long num2 = b * a.den;
  152. return (a.den <= 0L) ? (num < num2) : (num > num2);
  153. }
  154. public static bool operator <=(VFactor a, long b)
  155. {
  156. long num = a.nom;
  157. long num2 = b * a.den;
  158. return (a.den <= 0L) ? (num >= num2) : (num <= num2);
  159. }
  160. public static bool operator >=(VFactor a, long b)
  161. {
  162. long num = a.nom;
  163. long num2 = b * a.den;
  164. return (a.den <= 0L) ? (num <= num2) : (num >= num2);
  165. }
  166. public static bool operator ==(VFactor a, long b)
  167. {
  168. return a.nom == b * a.den;
  169. }
  170. public static bool operator !=(VFactor a, long b)
  171. {
  172. return a.nom != b * a.den;
  173. }
  174. public static VFactor operator +(VFactor a, VFactor b)
  175. {
  176. return new VFactor
  177. {
  178. nom = a.nom * b.den + b.nom * a.den,
  179. den = a.den * b.den
  180. };
  181. }
  182. public static VFactor operator +(VFactor a, long b)
  183. {
  184. a.nom += b * a.den;
  185. return a;
  186. }
  187. public static VFactor operator -(VFactor a, VFactor b)
  188. {
  189. return new VFactor
  190. {
  191. nom = a.nom * b.den - b.nom * a.den,
  192. den = a.den * b.den
  193. };
  194. }
  195. public static VFactor operator -(VFactor a, long b)
  196. {
  197. a.nom -= b * a.den;
  198. return a;
  199. }
  200. public static VFactor operator *(VFactor a, long b)
  201. {
  202. a.nom *= b;
  203. return a;
  204. }
  205. public static VFactor operator /(VFactor a, long b)
  206. {
  207. a.den *= b;
  208. return a;
  209. }
  210. public static VInt3 operator *(VInt3 v, VFactor f)
  211. {
  212. return IntMath.Divide(v, f.nom, f.den);
  213. }
  214. public static VInt2 operator *(VInt2 v, VFactor f)
  215. {
  216. return IntMath.Divide(v, f.nom, f.den);
  217. }
  218. public static VInt3 operator /(VInt3 v, VFactor f)
  219. {
  220. return IntMath.Divide(v, f.den, f.nom);
  221. }
  222. public static VInt2 operator /(VInt2 v, VFactor f)
  223. {
  224. return IntMath.Divide(v, f.den, f.nom);
  225. }
  226. public static int operator *(int i, VFactor f)
  227. {
  228. return (int)IntMath.Divide((long)i * f.nom, f.den);
  229. }
  230. public static VFactor operator -(VFactor a)
  231. {
  232. a.nom = -a.nom;
  233. return a;
  234. }
  235. }