123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import numpy as np
- from time import perf_counter
- class Eclipse:
- def __init__(self, a: "float", b: "float"):
- c = np.sqrt(a * a - b * b)
- self.a2l, self.b2l = 2 * np.abs(a), 2 * np.abs(b)
- self.f1, self.f2 = (-c, 0), (c, 0)
- @staticmethod
- def __dis(p1: "tuple", p2: "tuple") -> "np.double":
- return np.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
- def inner_rect_binary(self, *, al: "float" = None, bl: "float" = None) -> "np.double":
- if al is None and bl is None:
- return np.double(0)
- if al is not None:
- al = np.abs(al)
- if al < 1E-5:
- return self.b2l
- if al >= self.a2l - 1E-5:
- return np.double(0)
- start, end, x, y = 0, self.b2l / 2, al / 2, self.b2l / 4
- while True:
- p = (x, y)
- dis = self.__dis(p, self.f1) + self.__dis(p, self.f2)
- if np.abs(dis - self.a2l) < 1E-5:
- return np.double(2 * y)
- if dis < self.a2l:
- start = y
- else:
- end = y
- y = (start + end) / 2
- else:
- bl = np.abs(bl)
- if bl < 1E-5:
- return self.a2l
- if bl >= self.b2l - 1E-5:
- return np.double(0)
- start, end, x, y = 0, self.a2l / 2, self.b2l / 4, bl / 2
- while True:
- p = (x, y)
- dis = self.__dis(p, self.f1) + self.__dis(p, self.f2)
- if np.abs(dis - self.a2l) < 1E-5:
- return np.double(2 * x)
- if dis < self.a2l:
- start = x
- else:
- end = x
- x = (start + end) / 2
- # 50 times faster than <inner_rect_binary>
- def inner_rect_scale(self, *, al: "float" = None, bl: "float" = None) -> "np.double":
- if al is None and bl is None:
- return np.double(0)
- if al is not None:
- if al <= 0:
- return self.b2l
- if al >= self.a2l:
- return np.double(0)
- short = self.b2l / self.a2l * al
- return np.sqrt(self.b2l ** 2 - short ** 2)
- if bl is not None:
- if bl <= 0:
- return self.a2l
- if bl >= self.b2l:
- return np.double(0)
- short = np.sqrt(self.b2l ** 2 - bl ** 2)
- return self.a2l / self.b2l * short
- def main():
- egg = Eclipse(125, 87.5)
- ls = np.linspace(0, 250, 100000)
- start = perf_counter()
- for ll in ls:
- egg.inner_rect_scale(al=ll)
- egg.inner_rect_scale(bl=ll)
- end = perf_counter()
- print(end - start)
- if __name__ == "__main__":
- main()
- """
- status = [Status()] * detector_count # 初始化count个探测器的状态
- Total, Current = 0, 0
- def count(distances, number):
- new, end = 0, 0
- for i in range(number):
- neighbors = get_neighbors_of(i) # 获取当前探测器的邻居
- if detected(distances[i]): # 当前探测器探测到鸡蛋数据
- if status[i].not_detected() and neighbors.not_detected():
- # 当前探测器上次没有数据,并且邻居也没探测到数据
- new += 1
- else: # 当前探测器没有鸡蛋数据
- if status[i].detected() and neighbors.is_end():
- # 当前探测器上次有鸡蛋数据,并且邻居已经检测结束
- end += 1
- update_status(distances) # 将当前数据作为下一次的上一次状态
- Total += new
- current += new - end
- return Total, Current
- """
|