DirectionMolecule.py 3.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from intelligine.cst import PHEROMON_DIRECTION, PHEROMON_POSITIONS
  2. from intelligine.core.exceptions import NoMolecule
  3. from random import shuffle
  4. from synergine_xyz.geometry import get_degree_from_north
  5. from intelligine.synergy.event.move.direction import get_direction_for_degrees
  6. class DirectionMolecule():
  7. @staticmethod
  8. def appose(context, point, molecule):
  9. context.molecules().increment_with_molecule(point, molecule)
  10. context.metas.list.add(PHEROMON_POSITIONS, PHEROMON_POSITIONS, point, assert_not_in=False)
  11. @classmethod
  12. def get_direction_for_point(cls, context, point, molecule_type):
  13. flavour = context.molecules().get_flavour(point)
  14. molecule = flavour.get_molecule(category=PHEROMON_DIRECTION, type=molecule_type)
  15. distance = molecule.get_distance()
  16. around_molecule_filter = lambda around_molecule: around_molecule.get_distance() < distance
  17. around_molecules_points = cls._get_around_molecules(context, point, molecule_type,
  18. molecule_filter=around_molecule_filter)
  19. if not around_molecules_points:
  20. raise NoMolecule()
  21. shuffle(around_molecules_points)
  22. around_molecules_sorted = sorted(around_molecules_points, key=lambda x: x[1].get_intensity(), reverse=True)
  23. max_intensity = around_molecules_sorted[0][1].get_intensity()
  24. around_molecules_max = []
  25. for around_molecule_sorted in around_molecules_sorted:
  26. if around_molecule_sorted[1].get_intensity() == max_intensity:
  27. around_molecules_max.append(around_molecule_sorted)
  28. around_molecules_sorted_by_distance = sorted(around_molecules_max,
  29. key=lambda x: x[1].get_distance(),
  30. reverse=False)
  31. go_to_point = around_molecules_sorted_by_distance[0][0]
  32. direction_degrees = get_degree_from_north(point, go_to_point)
  33. direction = get_direction_for_degrees(direction_degrees)
  34. return direction
  35. @staticmethod
  36. def _get_around_molecules(context, reference_point, molecule_type,
  37. molecule_filter=lambda around_molecule: True):
  38. around_points = context.get_around_points_of_point(reference_point)
  39. around_molecules_points = []
  40. for around_point in around_points:
  41. flavour = context.molecules().get_flavour(around_point)
  42. try:
  43. around_molecule = flavour.get_molecule(category=PHEROMON_DIRECTION, type=molecule_type)
  44. if molecule_filter(around_molecule):
  45. around_molecules_points.append((around_point, around_molecule))
  46. except NoMolecule:
  47. pass # No molecule, ok continue to sniff around
  48. return around_molecules_points
  49. @staticmethod
  50. def get_best_molecule_direction_in(context, reference_point, points, molecule_type):
  51. around_molecules_points = []
  52. for around_point in points:
  53. flavour = context.molecules().get_flavour(around_point)
  54. try:
  55. around_molecule = flavour.get_molecule(category=PHEROMON_DIRECTION, type=molecule_type)
  56. around_molecules_points.append((around_point, around_molecule))
  57. except NoMolecule:
  58. pass # Ok, no molecule, continue to sniff around
  59. if not around_molecules_points:
  60. raise NoMolecule()
  61. shuffle(around_molecules_points)
  62. around_molecules_sorted = sorted(around_molecules_points, key=lambda x: x[1].get_intensity(), reverse=True)
  63. go_to_point = around_molecules_sorted[0][0]
  64. direction_degrees = get_degree_from_north(reference_point, go_to_point)
  65. direction = get_direction_for_degrees(direction_degrees)
  66. return direction