import math from typing import List, Tuple from PySide6.QtCore import Qt from PySide6.QtGui import QBrush, QPainter from PySide6.QtWidgets import QGraphicsItemGroup from PySide6.QtWidgets import ( QStyleOptionGraphicsItem, QWidget, ) from grid.ui.items import SphereGraphicsItem, ArcGraphicsItem, LineGraphicsItem class Pattern(QGraphicsItemGroup): """Common pattern on the sphere grid""" PATTERN_WIDTH = 600 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-1): self.addToGroup( ArcGraphicsItem( x_pos=center_x, y_pos=center_y, width=self.SPACE_BETWEEN_SPHERE * 2, angle_start=(i * 360 / sphere_on_circle) % 360, angle_end=((i + 1) * 360 / sphere_on_circle) % 360, parent=self, ) ) line_start_x = center_x line_start_y = center_y line_end_x = center_x line_end_y = int(center_y + self.SPACE_BETWEEN_SPHERE) 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-2): self.addToGroup( ArcGraphicsItem( x_pos=center_x, y_pos=center_y, width=self.SPACE_BETWEEN_SPHERE * 4, angle_start=int(i * 360 / sphere_on_circle / 4) % 360, angle_end=int((i + 1) * 360 / sphere_on_circle) % 360, parent=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 paint( self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: QWidget | None = ..., ): super().paint(painter, option, widget) brush = QBrush(Qt.GlobalColor.gray) painter.setBrush(brush) painter.drawRect(0, 0, self.PATTERN_WIDTH, self.PATTERN_WIDTH) 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