예제 #1
0
    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)
예제 #2
0
 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)