import math from typing import List, Tuple from PySide6.QtWidgets import QGraphicsItemGroup from random import randint from grid.ui.items import SphereGraphicsItem, ArcGraphicsItem, LineGraphicsItem class Pattern(QGraphicsItemGroup): """Common pattern on the sphere grid """ PATTERN_WIDTH = 250 SPACE_BETWEEN_SPHERE = 60 def __init__(self, top_left_corner_x: int, top_left_corner_y: int) -> None: super().__init__() # center coordinates of the pattern center_x = int((top_left_corner_x + self.PATTERN_WIDTH) / 2) center_y = int((top_left_corner_y + self.PATTERN_WIDTH) / 2) # center self.addToGroup(SphereGraphicsItem(center_x, center_y)) self.addToGroup(SphereGraphicsItem(0, 0)) # first cercle sphere_on_circle = 4 points = self.generate_circle_points(center_x, center_y, self.SPACE_BETWEEN_SPHERE, sphere_on_circle) for x,y in points: self.addToGroup(SphereGraphicsItem(x, y)) for i in range(sphere_on_circle): self.addToGroup(ArcGraphicsItem(center_x, center_y, self.SPACE_BETWEEN_SPHERE, (i*360/sphere_on_circle)%360, ((i+1)*360/sphere_on_circle)%360, self)) line_start_x = int(center_x + self.SPACE_BETWEEN_SPHERE/2) line_start_y = int(center_y + self.SPACE_BETWEEN_SPHERE/2) line_end_x = int(center_x + self.SPACE_BETWEEN_SPHERE/2) line_end_y = int(center_y + self.SPACE_BETWEEN_SPHERE*1.5) self.addToGroup(LineGraphicsItem(line_start_x, line_start_y, line_end_x, line_end_y, self)) # second cercle sphere_on_circle = 8 points = self.generate_circle_points(center_x, center_y, self.SPACE_BETWEEN_SPHERE*2, sphere_on_circle) for x,y in points: self.addToGroup(SphereGraphicsItem(x, y)) for i in range(sphere_on_circle): self.addToGroup(ArcGraphicsItem(center_x, center_y, self.SPACE_BETWEEN_SPHERE*2, int(i*360/sphere_on_circle/4)%360, int((i+1)*360/sphere_on_circle)%360, self)) self.addToGroup(ArcGraphicsItem(center_x, center_y, self.SPACE_BETWEEN_SPHERE*2, 0, 90, self)) # third cercle sphere_on_circle = 8 points = self.generate_circle_points(center_x, center_y, self.SPACE_BETWEEN_SPHERE*3, sphere_on_circle) for x,y in points: self.addToGroup(SphereGraphicsItem(x, y)) def generate_circle_points(self, center_x: int, center_y: int, radius: int, n_points: int) -> List[Tuple[int, int]]: """generate coordinates of points on a circle equally spaced Args: center_x (int): center x coordinate center_y (int): center y coordinate radius (int): circle radius n_points (int): number of points on the circle to generate Returns: List[Tuple[int, int]]: list of points coordinates, (x,y) """ points = [] angle_step = 2 * math.pi / n_points for i in range(n_points): theta = i * angle_step x = int(center_x + radius * math.cos(theta)) y = int(center_y + radius * math.sin(theta)) points.append((x, y)) return points