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())
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)
def setUp(self): self.original = geom.STVector(2, 3) self.transformed = geom.lorentz_transformed(self.original, 3 / 5)
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()