79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
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
|