/ src / intersection.py
intersection.py
  1  from math import sqrt, tan, pi
  2  
  3  
  4  def my_round(nb: float) -> str:
  5      nb_str = str(round(float(nb), 3))
  6      if nb_str[-2] == ".":
  7          nb_str += "0"
  8      if nb_str[-3] == ".":
  9          nb_str += "0"
 10      return nb_str
 11  
 12  
 13  def intersection_sphere(av: list[str]) -> int:
 14      r: float = int(av[8]) ** 2
 15      a: float = int(av[5]) ** 2 + int(av[6]) ** 2 + int(av[7]) ** 2
 16      if a == 0:
 17          print("There is an infinite number of intersection points.")
 18          return 0
 19      b: float = (
 20          (2 * int(av[5]) * int(av[2]))
 21          + (2 * int(av[6]) * int(av[3]))
 22          + (2 * int(av[7]) * int(av[4]))
 23      )
 24      c: float = int(av[2]) ** 2 + int(av[3]) ** 2 + int(av[4]) ** 2 - r
 25      delta: float = b ** 2 - 4 * a * c
 26      if delta < 0:
 27          print("No intersection point.")
 28      elif delta == 0:
 29          print("1 intersection point:")
 30          x0: float = -(b / (2 * a))
 31          print(
 32              f"({my_round((int(av[5]) * x0) + int(av[2]))}, {my_round((int(av[6]) * x0) + int(av[3]))}, {my_round((int(av[7]) * x0) + int(av[4]))})"
 33          )
 34      else:
 35          print("2 intersection points:")
 36          x1: float = -(b - sqrt(delta)) / (2 * a)
 37          x2: float = -(b + sqrt(delta)) / (2 * a)
 38          print(
 39              f"({my_round((int(av[5]) * x1) + int(av[2]))}, {my_round((int(av[6]) * x1) + int(av[3]))}, {my_round((int(av[7]) * x1) + int(av[4]))})"
 40          )
 41          print(
 42              f"({my_round((int(av[5]) * x2) + int(av[2]))}, {my_round((int(av[6]) * x2) + int(av[3]))}, {my_round((int(av[7]) * x2) + int(av[4]))})"
 43          )
 44      return 0
 45  
 46  
 47  def intersection_cylinder(av: list[str]) -> int:
 48      r: float = int(av[8]) ** 2
 49      a: float = int(av[5]) ** 2 + int(av[6]) ** 2
 50      if a == 0:
 51          print("There is an infinite number of intersection points.")
 52          return 0
 53      b: float = (2 * int(av[5]) * int(av[2])) + (2 * int(av[6]) * int(av[3]))
 54      c: float = int(av[2]) ** 2 + int(av[3]) ** 2 - r
 55      delta: float = b ** 2 - 4 * a * c
 56      if delta < 0:
 57          print("No intersection point.")
 58      elif delta == 0:
 59          print("1 intersection point:")
 60          x0: float = -(b / (2 * a))
 61          print(
 62              f"({my_round((int(av[5]) * x0) + int(av[2]))}, {my_round((int(av[6]) * x0) + int(av[3]))}, {my_round((int(av[7]) * x0) + int(av[4]))})"
 63          )
 64      else:
 65          print("2 intersection points:")
 66          x1: float = -(b - sqrt(delta)) / (2 * a)
 67          x2: float = -(b + sqrt(delta)) / (2 * a)
 68          print(
 69              f"({my_round((int(av[5]) * x1) + int(av[2]))}, {my_round((int(av[6]) * x1) + int(av[3]))}, {my_round((int(av[7]) * x1) + int(av[4]))})"
 70          )
 71          print(
 72              f"({my_round((int(av[5]) * x2) + int(av[2]))}, {my_round((int(av[6]) * x2) + int(av[3]))}, {my_round((int(av[7]) * x2) + int(av[4]))})"
 73          )
 74      return 0
 75  
 76  
 77  def intersection_cone(av: list[str]) -> int:
 78      angle: float = tan((pi / 2) - (int(av[8]) * pi / 180)) ** 2
 79      a: float = angle * (int(av[5]) ** 2 + int(av[6]) ** 2) - int(av[7]) ** 2
 80      if a == 0:
 81          print("There is an infinite number of intersection points.")
 82          return 0
 83      b: float = angle * (2 * int(av[2]) * int(av[5]) + 2 * int(av[3]) * int(av[6])) - (
 84          2 * int(av[4]) * int(av[7])
 85      )
 86      c: float = angle * (int(av[2]) ** 2 + int(av[3]) ** 2) - int(av[4]) ** 2
 87      delta: float = b ** 2 - 4 * a * c
 88      if delta < 0:
 89          print("No intersection point.")
 90      elif delta == 0:
 91          print("1 intersection point:")
 92          x0: float = -(b / (2 * a))
 93          print(
 94              f"({my_round((int(av[5]) * x0) + int(av[2]))}, {my_round((int(av[6]) * x0) + int(av[3]))}, {my_round((int(av[7]) * x0) + int(av[4]))})"
 95          )
 96      else:
 97          print("2 intersection points:")
 98          x1: float = -(b - sqrt(delta)) / (2 * a)
 99          x2: float = -(b + sqrt(delta)) / (2 * a)
100          print(
101              f"({my_round((int(av[5]) * x1) + int(av[2]))}, {my_round((int(av[6]) * x1) + int(av[3]))}, {my_round((int(av[7]) * x1) + int(av[4]))})"
102          )
103          print(
104              f"({my_round((int(av[5]) * x2) + int(av[2]))}, {my_round((int(av[6]) * x2) + int(av[3]))}, {my_round((int(av[7]) * x2) + int(av[4]))})"
105          )
106      return 0