示例#1
0
    def test_lorentz_transform(self):
        v = 3 / 5
        group_transformed = geom.lorentz_transformed(
            geom.PointGroup([(0, 1), (2, 3)]), v)
        line_transformed = geom.lorentz_transformed(geom.Line((0, 1), (2, 3)),
                                                    v)
        ribbon_transformed = geom.lorentz_transformed(
            geom.Ribbon(geom.Line((0, 1), (2, 3)), geom.Line((0, 1), (0, 0))),
            v)
        self.collection.lorentz_transform(v)

        self.assertAlmostEqual(self.collection[0][0], group_transformed[0])
        self.assertAlmostEqual(self.collection[0][1], group_transformed[1])
        self.assertAlmostEqual(self.collection[1].direction(),
                               line_transformed.direction())
        self.assertAlmostEqual(self.collection[1].point(),
                               line_transformed.point())
        self.assertAlmostEqual(self.collection[2][0].direction(),
                               ribbon_transformed[0].direction())
        self.assertAlmostEqual(self.collection[2][0].point(),
                               ribbon_transformed[0].point())
        self.assertAlmostEqual(self.collection[2][1].direction(),
                               ribbon_transformed[1].direction())
        self.assertAlmostEqual(self.collection[2][1].point(),
                               ribbon_transformed[1].point())
示例#2
0
def _get_transformable_and_vrel_in_all_frames(lorentz_transformable, vrels,
                                              origin):
    """Return lists of a LorentzTransformable and vrels in different frames,
    where the input vrels can be a scalar or a list of values."""
    transformables = [lorentz_transformable]
    try:
        transformables += [
            geom.lorentz_transformed(lorentz_transformable, vrel, origin)
            for vrel in vrels
        ]
        return transformables, vrels
    except TypeError:
        # Single vrel
        transformables += [
            geom.lorentz_transformed(lorentz_transformable, vrels, origin)
        ]
        return transformables, [vrels]
 def setUp(self):
     super().setUp()
     # Over 3 frames of transformation
     self.transition_duration = 2
     mid_meterstick = geom.lorentz_transformed(self.meterstick, 2/5)
     mid_vel = mid_meterstick.velocity()
     mid_length = mid_meterstick.length()
     # Round
     self.vertices_mid = _arrays_to_lists([
         [0, 0],
         [mid_length, 0],
         [mid_vel*self.tlim[1] + mid_length, self.tlim[1]],
         [mid_vel*self.tlim[1], self.tlim[1]],
         [0, 0]
     ])
     # Round
     self.xdata_mid = [0, round(mid_length, 7)]
        'markersize': 10,
        'label': 'Arrive home',
    }
)

# Collect scene
scene = geom.Collection([
    earth, planet,
    rocket_forward, rocket_backward,
    turnaround_event, return_event,
])

# Plot the scene
tlim = (0, geom.STVector.gamma_factor(v)*t_return)
pad = planetdist/5
xlim = (geom.lorentz_transformed(return_event, v).x - pad,
        geom.lorentz_transformed(return_event, -v).x + pad)

# From Earth's point of view
current_time_color = 'limegreen'
instant_pause_time = 0.5
fps = 100
legend = True
earth_fname = '9-twinparadox_earth.mp4'
anim_earth = vis.stanimate_with_worldline(scene,
    tlim_anim=(0, return_event.t), tlim_worldline=tlim, xlim=xlim,
    legend=legend, legend_loc='upper left', fps=fps,
    title="Twin paradox (Earth's POV)",
    current_time_color=current_time_color,
    instant_pause_time=instant_pause_time)
anim_earth.save(earth_fname)
    title='The ladder paradox')
p[0].save('8-ladderparadox.png')
p[0].show()

# Animate the lab frame
fps = 50
current_time_color = 'cyan'
lab_fname = '8-ladderparadox_stationary.mp4'
anim_lab = vis.stanimate_with_worldline(scene, tlim=tlim, xlim=xlim,
    fps=fps, legend=True, legend_loc='upper left',
    title='The ladder paradox (stationary POV)',
    current_time_color=current_time_color)
anim_lab.save(lab_fname)
# Animate the ladder frame
ladder_fname = '8-ladderparadox_ladder.mp4'
anim_ladder = vis.stanimate_with_worldline(geom.lorentz_transformed(scene, v),
    tlim=tlim, xlim=xlim, fps=fps, legend=True, legend_loc='upper right',
    title='The ladder paradox (ladder POV)',
    current_time_color=current_time_color)
anim_ladder.save(ladder_fname)
# Animate the transformation
lt_fname = '8-ladderparadox_transform.mp4'
anim_lt = vis.animate_lt_worldline_and_realspace(scene, v,
    tlim=tlim, xlim=xlim, fps=fps, legend=True, title='Transforming frames...',
    current_time_color=current_time_color)
anim_lt.save(lt_fname)
# Animate the rewind from the lab frame
rew_fname = '8-ladderparadox_rewind.mp4'
anim_rew = canim.Rewinder(anim_lab, rewind_rate=5)
anim_rew.save(rew_fname)
示例#6
0
 def setUp(self):
     self.original = geom.STVector(2, 3)
     self.transformed = geom.lorentz_transformed(self.original, 3 / 5)
示例#7
0
grid_with_light.append(origin)
anim = vis.animate_lt(grid_with_light,
                      v,
                      origin=origin,
                      tlim=tlim,
                      xlim=xlim,
                      lim_padding=0,
                      title='The Lorentz transformation (about t = 2, x = 1)')
anim.save('3-lorentztransform_origin.mp4')
anim.show()

# Transform specific object by copying
tlim = (0, 2)
xlim = (-2, 2)
meterstick = phy.MovingObject(-1 / 2, length=1, velocity=1 / 2)
meterstick_copy = geom.lorentz_transformed(meterstick, 1 / 2)
p = vis.stplot(meterstick_copy,
               tlim=tlim,
               xlim=xlim,
               title='Stationary meterstick')
p.save('3-lorentztransform_stationary_meterstick.png')
p.show()

# Transform specific object in place
meterstick.lorentz_transform(4 / 5)
p = vis.stplot(meterstick,
               tlim=tlim,
               xlim=xlim,
               title='Left-moving meterstick')
p.save('3-lorentztransform_reversed_meterstick.png')
p.show()