From 3296d3a5828dae212b7d887440b888656c0b225b Mon Sep 17 00:00:00 2001 From: Matt Low Date: Sat, 14 Nov 2020 23:23:49 +0400 Subject: [PATCH] Add rotation support to Polygon --- geom/geom.py | 63 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/geom/geom.py b/geom/geom.py index 4ecea74..7a53dd9 100644 --- a/geom/geom.py +++ b/geom/geom.py @@ -1,5 +1,7 @@ from .math import * from .draw import * +import numpy as np + class Rect: @@ -52,46 +54,75 @@ class Rect: pixel(surface, colour, *self.get_center()) rect(surface, colour, self.x, self.y, self.width, self.height, width) + class Polygon: - def __init__(self, x, y, vertices, origin_x=0, origin_y=0): + def __init__(self, x, y, vertices, origin_x=0, origin_y=0, rotation=0): self.x = x self.y = y self.vertices = vertices + self.length = len(vertices) self.origin_x = origin_x self.origin_y = origin_y + self.rotation = rotation + self.update_transformation() self.update() def update(self): self.translated_vertices = [ - (self.x + self.origin_x + x, - self.y + self.origin_y + y) - for x, y in self.vertices + (self.x + x, self.y + y) + for x, y in self.transformed_vertices ] + self.segments = [ + (self.translated_vertices[i], + self.translated_vertices[i + 1 if i + 1 < self.length else 0]) + for i in range(self.length) + ] + self.normals = [ + normalize(*lnormal(*sub(*v2, *v1))) + for v1, v2 in self.segments + ] + + def update_transformation(self): + if self.rotation != 0: + rads = math.radians(self.rotation) + rot_matrix = np.array([[math.cos(rads), -math.sin(rads)], + [math.sin(rads), math.cos(rads)]]) + + self.transformed_vertices = [ + add(*rot_matrix.dot(sub(x, y, self.origin_x, self.origin_y)), + self.origin_x, self.origin_y) + for x, y in self.vertices + ] + else: + self.transformed_vertices = [ + (self.origin_x + x, self.origin_y + y) + for x, y in self.vertices + ] def set_position(self, x, y): self.x = x self.y = y self.update() + def set_rotation(self, rotation): + self.rotation = rotation + self.update_transformation() + + def rotate(self, degrees): + self.set_rotation(self.rotation + degrees) + def get_normals(self): - return [ - normalize(*lnormal(*sub(*v2, *v1))) - for v1, v2 in self.get_segments() - ] + return self.normals def get_translated_vertices(self): return self.translated_vertices + def get_vertices(self): + return self.transformed_vertices + def get_segments(self): - cnt = len(self.vertices) - return [ - ( - self.translated_vertices[i], - self.translated_vertices[i + 1 if i + 1 < cnt else 0], - ) - for i in range(cnt) - ] + return self.segments def draw(self, surface, colour, width): polygon(surface, colour, self.translated_vertices, width)