test.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import numpy as np
  2. from time import perf_counter
  3. class Eclipse:
  4. def __init__(self, a: "float", b: "float"):
  5. c = np.sqrt(a * a - b * b)
  6. self.a2l, self.b2l = 2 * np.abs(a), 2 * np.abs(b)
  7. self.f1, self.f2 = (-c, 0), (c, 0)
  8. @staticmethod
  9. def __dis(p1: "tuple", p2: "tuple") -> "np.double":
  10. return np.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
  11. def inner_rect_binary(self, *, al: "float" = None, bl: "float" = None) -> "np.double":
  12. if al is None and bl is None:
  13. return np.double(0)
  14. if al is not None:
  15. al = np.abs(al)
  16. if al < 1E-5:
  17. return self.b2l
  18. if al >= self.a2l - 1E-5:
  19. return np.double(0)
  20. start, end, x, y = 0, self.b2l / 2, al / 2, self.b2l / 4
  21. while True:
  22. p = (x, y)
  23. dis = self.__dis(p, self.f1) + self.__dis(p, self.f2)
  24. if np.abs(dis - self.a2l) < 1E-5:
  25. return np.double(2 * y)
  26. if dis < self.a2l:
  27. start = y
  28. else:
  29. end = y
  30. y = (start + end) / 2
  31. else:
  32. bl = np.abs(bl)
  33. if bl < 1E-5:
  34. return self.a2l
  35. if bl >= self.b2l - 1E-5:
  36. return np.double(0)
  37. start, end, x, y = 0, self.a2l / 2, self.b2l / 4, bl / 2
  38. while True:
  39. p = (x, y)
  40. dis = self.__dis(p, self.f1) + self.__dis(p, self.f2)
  41. if np.abs(dis - self.a2l) < 1E-5:
  42. return np.double(2 * x)
  43. if dis < self.a2l:
  44. start = x
  45. else:
  46. end = x
  47. x = (start + end) / 2
  48. # 50 times faster than <inner_rect_binary>
  49. def inner_rect_scale(self, *, al: "float" = None, bl: "float" = None) -> "np.double":
  50. if al is None and bl is None:
  51. return np.double(0)
  52. if al is not None:
  53. if al <= 0:
  54. return self.b2l
  55. if al >= self.a2l:
  56. return np.double(0)
  57. short = self.b2l / self.a2l * al
  58. return np.sqrt(self.b2l ** 2 - short ** 2)
  59. if bl is not None:
  60. if bl <= 0:
  61. return self.a2l
  62. if bl >= self.b2l:
  63. return np.double(0)
  64. short = np.sqrt(self.b2l ** 2 - bl ** 2)
  65. return self.a2l / self.b2l * short
  66. def main():
  67. egg = Eclipse(125, 87.5)
  68. ls = np.linspace(0, 250, 100000)
  69. start = perf_counter()
  70. for ll in ls:
  71. egg.inner_rect_scale(al=ll)
  72. egg.inner_rect_scale(bl=ll)
  73. end = perf_counter()
  74. print(end - start)
  75. if __name__ == "__main__":
  76. main()
  77. """
  78. status = [Status()] * detector_count # 初始化count个探测器的状态
  79. Total, Current = 0, 0
  80. def count(distances, number):
  81. new, end = 0, 0
  82. for i in range(number):
  83. neighbors = get_neighbors_of(i) # 获取当前探测器的邻居
  84. if detected(distances[i]): # 当前探测器探测到鸡蛋数据
  85. if status[i].not_detected() and neighbors.not_detected():
  86. # 当前探测器上次没有数据,并且邻居也没探测到数据
  87. new += 1
  88. else: # 当前探测器没有鸡蛋数据
  89. if status[i].detected() and neighbors.is_end():
  90. # 当前探测器上次有鸡蛋数据,并且邻居已经检测结束
  91. end += 1
  92. update_status(distances) # 将当前数据作为下一次的上一次状态
  93. Total += new
  94. current += new - end
  95. return Total, Current
  96. """