polar.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from uuid import UUID
  2. from state.base import State
  3. from services.bottom.V0 import Bottom
  4. from services.primitives.float_type import Float
  5. import math
  6. class PointPolar:
  7. def __init__(self, model: UUID, state: State):
  8. type_model_id = state.read_dict(state.read_root(), "PointPolar")
  9. self.type_model = UUID(state.read_value(type_model_id))
  10. self.model = model
  11. self.state = state
  12. self.point = None
  13. def create_point(self, r: float, theta: float):
  14. if self.point is None:
  15. self.point = (r, theta)
  16. else:
  17. raise RuntimeError("A PointPolar model can contain at most 1 point.")
  18. def read_point(self):
  19. if self.point is None:
  20. raise RuntimeError("No point found in model.")
  21. else:
  22. return f"(r = {self.point[0]}, \u03B8 = {self.point[1]})"
  23. def delete_point(self):
  24. self.point = None
  25. def apply_movement(self, delta_r: float, delta_theta: float):
  26. if self.point is not None:
  27. self.point = (self.point[0] + delta_r, self.point[1] + delta_theta)
  28. else:
  29. raise RuntimeError("No point found in model.")
  30. def to_bottom(self):
  31. x = self.point[0]*math.cos(self.point[1]) # x = r * cos(theta)
  32. y = self.point[0]*math.sin(self.point[1]) # y = r * sin(theta)
  33. bottom = Bottom(self.state)
  34. # clear residual model
  35. for element in bottom.read_outgoing_elements(self.model):
  36. bottom.delete_element(element)
  37. # create primitive models
  38. c1_model = bottom.create_node()
  39. c2_model = bottom.create_node()
  40. Float(c1_model, self.state).create(x)
  41. Float(c2_model, self.state).create(y)
  42. # instantiate Point class
  43. point_node = bottom.create_node() # create point node
  44. bottom.create_edge(self.model, point_node, "point") # attach to model
  45. morph_node, = bottom.read_outgoing_elements(self.type_model, "PointPolar") # retrieve type
  46. bottom.create_edge(point_node, morph_node, "Morphism") # create morphism link
  47. # instantiate c1 attribute
  48. c1_node = bottom.create_node(str(c1_model))
  49. bottom.create_edge(self.model, c1_node, "point.c1")
  50. c1_link = bottom.create_edge(point_node, c1_node)
  51. bottom.create_edge(self.model, c1_link, "point.c1_link")
  52. ltm_point_node, = bottom.read_outgoing_elements(self.type_model, "Float")
  53. ltm_point_link, = bottom.read_outgoing_elements(self.type_model, "PointPolar_c1")
  54. bottom.create_edge(c1_node, ltm_point_node, "Morphism")
  55. bottom.create_edge(c1_link, ltm_point_link, "Morphism")
  56. # instantiate c2 attribute
  57. c2_node = bottom.create_node(str(c2_model))
  58. bottom.create_edge(self.model, c2_node, "point.c2")
  59. c2_link = bottom.create_edge(point_node, c2_node)
  60. bottom.create_edge(self.model, c2_link, "point.c2_link")
  61. ltm_point_node, = bottom.read_outgoing_elements(self.type_model, "Float")
  62. ltm_point_link, = bottom.read_outgoing_elements(self.type_model, "PointPolar_c2")
  63. bottom.create_edge(c2_node, ltm_point_node, "Morphism")
  64. bottom.create_edge(c2_link, ltm_point_link, "Morphism")
  65. def from_bottom(self):
  66. bottom = Bottom(self.state)
  67. keys = bottom.read_keys(self.model)
  68. x_key, = filter(lambda k: k.endswith(".c1"), keys)
  69. y_key, = filter(lambda k: k.endswith(".c2"), keys)
  70. x_ref_node, = bottom.read_outgoing_elements(self.model, x_key)
  71. y_ref_node, = bottom.read_outgoing_elements(self.model, y_key)
  72. x_model = UUID(bottom.read_value(x_ref_node))
  73. y_model = UUID(bottom.read_value(y_ref_node))
  74. x_val_node, = bottom.read_outgoing_elements(x_model)
  75. y_val_node, = bottom.read_outgoing_elements(y_model)
  76. x = bottom.read_value(x_val_node)
  77. y = bottom.read_value(y_val_node)
  78. r = math.sqrt(math.pow(x, 2) + math.pow(y, 2))
  79. theta = math.atan2(y, x)
  80. self.point = (r, theta)