예제 #1
0
def test_strafe_speedxf():
    with raises(ValueError):
        motion.strafe_speedxf(4, 450, -10)
    assert motion.strafe_speedxf(4, 450, 0) == 450
    assert motion.strafe_speedxf(0, 0, 0) == 0
    K = motion.strafe_K(30, 0.001, 320, 10)
    assert motion.strafe_speedxf(4, 450, K) == approx(964.12654771)
    assert motion.strafe_speedxf(0, 987, K) == 987
    K = motion.strafe_K(30, 0.001, 320, 100)
    assert motion.strafe_speedxf(4.2, 0, K) == approx(1944.222209522)
    K = motion.strafe_K(320, 0.01, 320, 10)
    assert motion.strafe_speedxf(2, 100, K) == approx(1975.145564256)
예제 #2
0
def test_strafe_distance():
    K = motion.strafe_K(30, 0.001, 320, 10)
    with raises(ValueError):
        motion.strafe_distance(1, 100, -K)
    assert motion.strafe_distance(0, 456, K) == 0
    assert motion.strafe_distance(0, 1e5, 1e8) == 0
    assert motion.strafe_distance(1, 100, K) == approx(304.32984903732694)
    K = motion.strafe_K(30, 0.01, 320, 10)
    assert motion.strafe_distance(2.5, 1, K) == approx(790.5746781033104)
    assert motion.strafe_distance(1, -100, K) == approx(226.83538223469472)
    assert motion.strafe_distance(1, 953.93920141694559,
                                  K) == approx(977.15056822651479)
예제 #3
0
def test_solve_boost_min_dmg_neg_z():
    K = motion.strafe_K(30, 0.001, 320, 10)
    dv = motion.solve_boost_min_dmg([400, 268], K, 1500, -200, 800)
    assert dv[0] == approx(298.46589871993854, 1e-4)
    assert dv[1] == approx(366.81197893286605, 1e-4)
    K = motion.strafe_K(30, 0.001, 320, 100)
    dv = motion.solve_boost_min_dmg([400, 268], K, 1500, -200, 800)
    assert dv[0] == approx(77.238561539572189, 1e-4)
    assert dv[1] == approx(241.47957829048562, 1e-4)
    dv = motion.solve_boost_min_dmg([0, 0], K, 0, -200, 800)
    assert dv[0] == approx(0)
    assert dv[1] == approx(0)
예제 #4
0
def test_strafe_K():
    with raises(ZeroDivisionError):
        motion.strafe_K(0, 0, 0, 0)
    assert motion.strafe_K(30, 0.001, 320, 0) == 0.0
    assert motion.strafe_K(30, 0.01, 320, 10) == approx(90000)
    assert motion.strafe_K(30, 0.001, 320, 10) == approx(181760)
    assert motion.strafe_K(320, 0.001, 320, 10) == approx(2037760)
    assert motion.strafe_K(320, 0.001, 320, 2000) == approx(102400000)
    assert motion.strafe_K(30, 0.001, 10, 10) == approx(1990)
    assert motion.strafe_K(30, 0.001, 0, 10) == 0
예제 #5
0
def test_strafe_solve_speedxi_zero_x():
    K = motion.strafe_K(30, 0.001, 320, 10)
    with raises(ValueError):
        motion.strafe_solve_speedxi(0, K, 0, 1, 800)
    with raises(ValueError):
        motion.strafe_solve_speedxi(40, K, 0, 2, 800)
    assert motion.strafe_solve_speedxi(40, K, 0, 1, 800) == approx(0)
예제 #6
0
def test_strafe_solve_speedxi_pos_z():
    K = motion.strafe_K(30, 0.001, 320, 10)
    assert motion.strafe_solve_speedxi(1000, K, 100, 400, 800) == approx(0)
    with raises(ValueError):
        motion.strafe_solve_speedxi(1000, K, 100, 700, 800)
    with raises(ValueError):
        motion.strafe_solve_speedxi(0, K, 100, 700, 800)
예제 #7
0
def test_solve_boost_min_dmg_neg_viz():
    K = motion.strafe_K(30, 0.001, 320, 100)
    dv = motion.solve_boost_min_dmg([0, -600], K, 300, -200, 800)
    assert dv[0] == approx(51.986602324707007)
    assert dv[1] == approx(511.7601499627252)
    tx = motion.strafe_time(300, dv[0], K)
    tz = motion.gravity_time_speediz_z(-600 + dv[1], -200, 800)
    assert tx == approx(tz[1])

    K = motion.strafe_K(30, 0.001, 320, 10)
    dv = motion.solve_boost_min_dmg([0, -600], K, 1000, 500, 800)
    assert dv[0] == approx(520.92144757654194)
    assert dv[1] == approx(1545.1246586237653)
    tx = motion.strafe_time(1000, dv[0], K)
    tz = motion.gravity_time_speediz_z(-600 + dv[1], 500, 800)
    assert tx == approx(tz[1])
예제 #8
0
def test_strafe_time():
    assert motion.strafe_time(400, 400, 1e-5) == approx(0.9999901521950959)
    assert motion.strafe_time(400, 400, 0) == approx(1)
    assert motion.strafe_time(0, 400, 0) == approx(0)
    assert motion.strafe_time(1, 0, 0) == math.inf
    K = motion.strafe_K(30, 0.001, 320, 10)
    with raises(ValueError):
        motion.strafe_time(100, 320, -K)
    assert motion.strafe_time(100000, 320, K) == approx(49.314635892504114)
    assert motion.strafe_time(100, 320, K) == approx(0.28012970263654435)
    assert motion.strafe_time(0, 320, K) == approx(0)
    assert motion.strafe_time(-100, 320, K) == approx(0.28012970263654435)
    assert motion.strafe_time(-100, -320, K) == approx(0.28012970263654435)
    K = motion.strafe_K(30, 0.001, 320, 100)
    assert motion.strafe_time(1000, 320, K) == approx(1.2653051142112355)
    assert motion.strafe_time(0, 320, K) == approx(0)
예제 #9
0
def test_strafe_K_neg_params():
    with raises(ValueError):
        motion.strafe_K(-10, 10, 10, 10)
    with raises(ValueError):
        motion.strafe_K(10, -10, 10, 10)
    with raises(ValueError):
        motion.strafe_K(10, 10, -10, 10)
    with raises(ValueError):
        motion.strafe_K(10, -10, 10, -10)
예제 #10
0
def test_solve_boost_min_dmg_no_dv():
    K = motion.strafe_K(30, 0.001, 320, 10)
    dv = motion.solve_boost_min_dmg([0, 0], K, 100, -100000, 800)
    assert dv[0] == approx(0, abs=1e-5)
    dv = motion.solve_boost_min_dmg([10000, 0], K, 1000, -10, 800)
    assert dv[0] == approx(0, abs=1e-5)
    assert dv[1] == approx(0, abs=1e-5)
    dv = motion.solve_boost_min_dmg([0, 1500], K, 500, 1000, 800)
    assert dv[0] == approx(0, abs=1e-5)
    assert dv[1] == approx(0, abs=1e-5)
예제 #11
0
def test_strafe_solve_speedxi_curve_shape():
    K = motion.strafe_K(30, 0.001, 320, 10)
    xs = range(1, 10000, 500)
    zs = range(1, 601, 100)
    for x, z in itertools.product(xs, zs):
        vix = motion.strafe_solve_speedxi(1000, K, x, z, 800)
        tx = motion.strafe_time(x, vix, K)
        tz = motion.gravity_time_speediz_z(1000, z, 800)
        if not math.isclose(tx, tz[0], abs_tol=1e-6):
            assert tx <= tz[0]
예제 #12
0
def test_solve_boost_min_dmg():
    K = motion.strafe_K(30, 0.001, 320, 10)
    with raises(ValueError):
        motion.solve_boost_min_dmg([0, 0], -K, 400, 400, 800)

    dv = motion.solve_boost_min_dmg([0, 0], K, 400, 400, 800)
    assert dv[0] == approx(79.399032802535118, 1e-4)
    assert dv[1] == approx(816.5301806366407, 1e-4)
    t = motion.gravity_time_speediz_z(dv[1], 400, 800)
    assert t[1] == approx(motion.strafe_time(400, dv[0], K))
    assert dv[1] - 800 * t[1] <= 0
예제 #13
0
def test_solve_boost_min_dmg_zero_pos():
    np.warnings.filterwarnings('ignore')
    K = motion.strafe_K(30, 0.001, 320, 10)
    dv = motion.solve_boost_min_dmg([400, 0], K, 0, -1, 800)
    assert dv[0] == approx(0, abs=1e-5)
    assert dv[1] == approx(0, abs=1e-5)
    dv = motion.solve_boost_min_dmg([0, 0], K, 0, 1, 800)
    assert dv[1] >= 1e4
    dv = motion.solve_boost_min_dmg([200, 200], K, 0, 0, 800)
    assert dv[0] == approx(0, abs=1e-5)
    assert dv[1] == approx(0, abs=1e-5)
    np.warnings.filterwarnings('default')
예제 #14
0
def test_strafe_solve_speedxi_neg_z():
    K = motion.strafe_K(30, 0.001, 320, 10)
    assert motion.strafe_solve_speedxi(0, K, 100, -18,
                                       800) == approx(450.6474498822009)
    assert motion.strafe_solve_speedxi(0, K, 100, -100, 800) == approx(0)
    assert motion.strafe_solve_speedxi(163.23541222592047, K, 100, -18,
                                       800) == approx(0)
    assert motion.strafe_solve_speedxi(200, K, 100, -18, 800) == approx(0)
    assert motion.strafe_solve_speedxi(0, K, 100, -1e-3,
                                       800) == approx(63245.55095141193)
    assert motion.strafe_solve_speedxi(-10000, K, 100, -100,
                                       800) == approx(10003.952996977921)
    assert motion.strafe_solve_speedxi(-100, K, 200, -200,
                                       800) == approx(248.98914739139963)
예제 #15
0
def test_solve_boost_min_dmg_inc_v():
    K = motion.strafe_K(30, 0.001, 320, 10)
    prev = math.inf
    for vx in range(0, 10000, 100):
        dv = motion.solve_boost_min_dmg([vx, 0], K, 1500, -200, 800)
        mag = math.hypot(dv[0], dv[1])
        assert mag <= prev
        prev = mag

    prev = math.inf
    for vy in range(0, 10000, 100):
        dv = motion.solve_boost_min_dmg([0, vy], K, 1500, -200, 800)
        mag = math.hypot(dv[0], dv[1])
        assert mag <= prev
        prev = mag
예제 #16
0
def test_solve_boost_min_dmg_range():
    K = motion.strafe_K(30, 0.001, 320, 10)
    for d in itertools.chain(range(-10000, 10001, 100),
                             np.arange(-100, 100, 0.5)):
        dv = motion.solve_boost_min_dmg([0, 0], K, d, d, 800)
        assert dv[0] < 1e4 and dv[1] < 1e4
        assert dv[0] >= 0 and dv[1] >= 0
        t = motion.gravity_time_speediz_z(dv[1], d, 800)
        assert dv[1] - 800 * t[1] <= 0
        strafe_t = motion.strafe_time(d, dv[0], K)
        if not math.isclose(t[1], strafe_t):
            assert t[1] > strafe_t
        if not math.isclose(t[0], strafe_t):
            assert t[0] < strafe_t

        dv = motion.solve_boost_min_dmg(dv, K, d, d, 800)
        assert dv[0] == approx(0, abs=1e-5)
        assert dv[1] == approx(0, abs=1e-5)

        dv = motion.solve_boost_min_dmg([0, 0], K, 400, d, 800)
        assert dv[0] < 1e4 and dv[1] < 1e4
예제 #17
0
def test_strafe_distance_neg_time():
    K = motion.strafe_K(30, 0.01, 320, 10)
    with raises(ValueError):
        motion.strafe_distance(-1, 100, K)
    assert motion.strafe_distance(-1, 1000, K) == approx(977.15056822651479)
예제 #18
0
def test_strafe_solve_speedxi_zero_z():
    K = motion.strafe_K(30, 0.001, 320, 10)
    assert motion.strafe_solve_speedxi(1000, K, 1, 0, 800) == math.inf
    assert motion.strafe_solve_speedxi(0, K, 0, 0, 800) == approx(0)
    assert motion.strafe_solve_speedxi(0, K, 100, 0, 800) == math.inf
    assert motion.strafe_solve_speedxi(0, K, 1e-5, 0, 800) == math.inf
예제 #19
0
def test_strafe_speedxf_neg_time():
    K = motion.strafe_K(320, 0.01, 320, 10)
    with raises(ValueError):
        motion.strafe_speedxf(-1, 0, K)
    assert motion.strafe_speedxf(-1, 1451.068571777, K) == approx(400)
예제 #20
0
def test_solve_boost_min_dmg_neg_x():
    K = motion.strafe_K(30, 0.001, 320, 10)
    dv1 = motion.solve_boost_min_dmg([0, 0], K, -400, 500, 800)
    dv2 = motion.solve_boost_min_dmg([0, 0], K, 400, 500, 800)
    assert dv1 == dv2
예제 #21
0
def test_strafe_solve_speedxi_impossible():
    K = motion.strafe_K(30, 0.001, 320, 10)
    assert math.isnan(motion.strafe_solve_speedxi(-100, K, 0, 2, 800))
    assert math.isnan(motion.strafe_solve_speedxi(-100, K, 10, 2, 800))
    with raises(ValueError):
        motion.strafe_solve_speedxi(0, K, 10, 2, 800)
예제 #22
0
def test_strafe_time_extremes():
    K = motion.strafe_K(30, 0.001, 320, 10)
    xs = [0, 1e-15, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2]
    vs = [0, 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e15]
    for x, v in itertools.product(xs, vs):
        assert motion.strafe_time(x, v, K) >= 0
예제 #23
0
def test_strafe_solve_speedxi():
    K = motion.strafe_K(30, 0.001, 320, 10)
    with raises(ValueError):
        motion.strafe_solve_speedxi(10, -K, 400, -200, 800)