from numpy import array as a import pygame import math class EquilateralTriangle: def __init__(self, position, side_length, rotation, color, scene, width=0): self.position = position self.side_length = side_length self.rotation = rotation self.color = color self.scene = scene self.width = width self.rotation_point = complex(math.cos(rotation), math.sin(rotation)) self.pd_ = self.scene.pd_ self.points = a([ complex(0, self.side_length), complex(self.side_length, self.side_length), complex(self.side_length * 0.5, self.side_length - math.sqrt(self.side_length ** 2 - (self.side_length * 0.5) ** 2)) ]) self.points -= complex(self.side_length * 0.5, self.side_length * 0.5) self.points *= self.rotation_point * self.pd_ self.points += complex(self.side_length * 0.5, self.side_length * 0.5) rescaled_position = self.scene.matrix @ self.position self.points += complex(rescaled_position[0], rescaled_position[1]) self.points = [[point.real, point.imag] for point in self.points] def blit(self): if self.pd_ != self.scene.pd_: self.pd_ = self.scene.pd_ self.points = a([ complex(0, self.side_length), complex(self.side_length, self.side_length), complex(self.side_length * 0.5, self.side_length - math.sqrt(self.side_length ** 2 - (self.side_length * 0.5) ** 2)) ]) self.points -= complex(self.side_length * 0.5, self.side_length * 0.5) self.points *= self.rotation_point * self.pd_ self.points += complex(self.side_length * 0.5, self.side_length * 0.5) rescaled_position = self.scene.matrix @ self.position self.points += complex(rescaled_position[0], rescaled_position[1]) self.points = [[point.real, point.imag] for point in self.points] pygame.draw.polygon(self.scene.s, self.color, self.points, self.width)