def __init__(self, density=1, pos=[0, 0], offsets=[], **kwargs): sides = [] for o in offsets: sides.append(Vector2(o)) polygon_mass_of_center_of_mass = Vector2(0) total_polygon_mass = 0 total_polygon_momi = 0 for i in range(len(sides)): triangle_area = (Vector2.cross(sides[i], sides[i - 1])) / 2 triangle_mass = density * triangle_area total_polygon_mass += triangle_mass triangle_momi = triangle_mass / 6 * ( sides[i - 1].magnitude()**2 + sides[i].magnitude()**2 + Vector2.dot(sides[i - 1], sides[i])) total_polygon_momi += triangle_momi triangle_mass_of_center_of_mass = triangle_mass * (1 / 3) * ( sides[i - 1] + sides[i]) polygon_mass_of_center_of_mass += triangle_mass_of_center_of_mass polygon_center_of_mass = polygon_mass_of_center_of_mass / total_polygon_mass # move origin to center of mass new_offsets = [] for o in offsets: new_offsets.append(o - polygon_center_of_mass) new_pos = pos + polygon_center_of_mass momi_center_of_mass = total_polygon_momi - ( total_polygon_mass * polygon_center_of_mass.magnitude()**2) # call superclass constructor super().__init__(mass=total_polygon_mass, momi=momi_center_of_mass, pos=new_pos, offsets=new_offsets, **kwargs)
def project_shape(axis: Vector2, points: list[Vector2]) -> tuple[float, float]: dot_products = [axis.dot(point) for point in points] return min(dot_products), max(dot_products)