def test_imul(): for ms in np.random.uniform(-720, 720, (1000, 4)): m = Mat2(ms) if abs(m.det()) < 1e-6: continue assert m * m._1 == Mat2.eye() m *= m._1 assert m == Mat2.eye()
def test_idiv(): for ms in np.random.uniform(-720, 720, (1000, 8)): m1 = Mat2(ms[:4]) m2 = Mat2(ms[4:]) m12 = m1 / m2 m1 /= m2 assert m12 == m1 assert m1 == (ms[:4] / ms[4:]).reshape(2, 2)
def test_sub1(): for ms in np.random.uniform(-720, 720, (1000, 5)): m = Mat2(ms[:-1]) m1 = m - ms[-1] m1i = (ms[:-1] - ms[-1]).reshape(2, 2) assert m1 == m1i assert ms[-1] - m == -(ms[:-1] - ms[-1]).reshape(2, 2)
def test_constructor7(): m = Mat2.eye() assert m is not None assert m.m11 == approx(1) assert m.m12 == approx(0) assert m.m21 == approx(0) assert m.m22 == approx(1)
def test_constructor9(): m = Mat2.from_xaxis((1, 1)) assert m is not None assert m.m11 == approx(1 / 2**0.5) assert m.m12 == approx(1 / 2**0.5) assert m.m21 == approx(-1 / 2**0.5) assert m.m22 == approx(1 / 2**0.5)
def test_constructor1(): m = Mat2(1, 2, 3, 4) assert m is not None assert m.m11 == approx(1) assert m.m12 == approx(2) assert m.m21 == approx(3) assert m.m22 == approx(4)
def test_constructor6(): m = Mat2([Vec2(1, 2), Vec2(3, 4)]) assert m is not None assert m.m11 == approx(1) assert m.m12 == approx(2) assert m.m21 == approx(3) assert m.m22 == approx(4)
def test_polyline_get_Iz(): pl = PolyLine([(0, 3), (10, 3), (10, 0), (0, 0)], copy_data=True) for angle in np.random.uniform(-180, 180, 1000): pl1 = pl.add_vec(Vec2(10, 20)) plt = pl1.transform(Mat2.from_angle(angle, True)) cm = plt.get_center_mass() assert plt.get_Iz(cm) == approx((10**2 + 3**2) / 12)
def test_constructor4(): m = Mat2([1, 2], [3, 4]) assert m is not None assert m.m11 == approx(1) assert m.m12 == approx(2) assert m.m21 == approx(3) assert m.m22 == approx(4)
def test_add1(): for ms in np.random.uniform(-720, 720, (1000, 5)): m = Mat2(ms[:-1]) m1 = m + ms[-1] m1i = (ms[:-1] + ms[-1]).reshape(2, 2) assert m1 == m1i assert ms[-1] + m == (ms[:-1] + ms[-1]).reshape(2, 2)
def test_constructor8(): from math import sin, cos, pi for angle in np.random.uniform(-720, 720, 1000): angle *= pi / 180 m = Mat2.from_angle(angle) assert m is not None assert m.m11 == approx(cos(angle)) assert m.m12 == approx(sin(angle)) assert m.m21 == approx(-sin(angle)) assert m.m22 == approx(cos(angle))
def test_mul2(): for angle, x, y in np.random.uniform(-180, 180, (1000, 3)): m = Mat2.from_angle(angle, 1) v = Vec2(x, y).norm() v1 = m * v assert v.angle_to(v1, 1) == approx(-angle) v2 = m._1 * v1 assert v2 == v v3 = m._1 * v assert v.angle_to(v3, 1) == approx(angle)
def test_T(): m = Mat2(-1, 2, -3, 4) assert m.T == [[-1, -3], [2, 4]]
def set_alpha(self, alpha): self.alpha = alpha self.M_rot = Mat2.from_angle(alpha, degrees=True) self.M_rot_1 = self.M_rot._1
def test_xiyj_axis(): m = Mat2(1, 2, 3, 4) assert m.x_axis() == (1, 2) assert m.i_axis() == (1, 2) assert m.y_axis() == (3, 4) assert m.j_axis() == (3, 4)
def test_add2(): for ms in np.random.uniform(-720, 720, (1000, 8)): m1 = Mat2(ms[:4]) m2 = Mat2(ms[4:]) assert m1 + m2 == m2 + m1 assert m1 + m2 == (ms[:4] + ms[4:]).reshape(2, 2)
def test_inverse1(): for angle in np.random.uniform(-720, 720, 1000): m = Mat2.from_angle(angle) assert m._1 == m.T assert m.det() == approx(1)
def test_mul1(): for ms in np.random.uniform(-720, 720, (1000, 5)): m = Mat2(ms[:-1]) assert m * ms[-1] == (ms[:-1] * ms[-1]).reshape(2, 2) assert ms[-1] * m == (ms[:-1] * ms[-1]).reshape(2, 2)
def test_sub2(): for ms in np.random.uniform(-720, 720, (1000, 8)): m1 = Mat2(ms[:4]) m2 = Mat2(ms[4:]) assert m1 - m2 == -(m2 - m1) assert m1 - m2 == (ms[:4] - ms[4:]).reshape(2, 2)
def test_div1(): for ms in np.random.uniform(-720, 720, (1000, 5)): m = Mat2(ms[:-1]) m1 = m / ms[-1] m1i = (ms[:-1] / ms[-1]).reshape(2, 2) assert m1 == m1i
def test_cmp(): m = Mat2(-1, 2, -3, 4) assert m == [[-1, 2], [-3, 4]] assert m != [[-1, -2], [-3, 4]]
def test_div2(): for ms in np.random.uniform(-720, 720, (1000, 8)): m1 = Mat2(ms[:4]) m2 = Mat2(ms[4:]) assert m1 / m2 == (ms[:4] / ms[4:]).reshape(2, 2)
def test_polyline_area4(): pl = PolyLine([(1, 2), (11, 2), (10, 0), (0, 0)], copy_data=True) for angle in np.random.uniform(-180, 180, 1000): pl1 = pl.add_vec(Vec2(10, 20)) plt = pl1.transform(Mat2.from_angle(angle, True)) assert plt.get_area() == approx(20)
return res return {} def shoot(self): if not self.can_shoot: return None angle = np.random.normal(self.alpha, self.theta / 3) vel = Vec2(self.round_vel, 0).rotate(angle, degrees=True) self.time_last_shot = self.time v = 3 * vel.norm() + self.pos return Round(v, vel, self.dmg) class Round(object): id_counter = 0 def __init__(self, pos, vel, dmg): self.pos = _convert(pos).copy() self.vel = _convert(vel).copy() self.dmg = dmg self.id = Round.id_counter Round.id_counter += 1 def get_move_segment(self, dt: float): return (self.pos.copy(), self.pos + dt * self.vel) if __name__ == "__main__": m = Mat2.from_angle(90, True) print(m._1 * Vec2(1, 0))