def plot_clothoid(padding=0, plot_range=(0, 50), resolution=20, scale=1, center=(0, 0), phase=0): scene = hl.MonochromeScene() endpoints = clothoid(scene, plot_range=plot_range, resolution=resolution, scale=scale, center=center, phase=phase) x_values = [e[0] for e in endpoints] y_values = [e[1] for e in endpoints] max_x = int(math.ceil(max(x_values))) min_x = int(math.floor(min(x_values))) max_y = int(math.ceil(max(y_values))) min_y = int(math.floor(min(y_values))) clothoid_arr = scene.render_scene(x_range=(min_x - padding, max_x + padding), y_range=(min_y - padding, max_y + padding), resolution=10, densities=15, projection_type=hl.Projections.ORTHO) return clothoid_arr
def rotating_sphere(t): speed = 0.7 frame = hl.MonochromeScene() vector = hl.np.array([1, 0, 0]) frame.add_object(hl.sphere(center=(10, 0, 30), radius=10).rotate( theta=math.pi / 2, axis=(0, 1, 0), p=(10, 0, 30)).rotate(theta=t * speed, axis=vector, p=(10, 0, 30)).project(method='weak'), name="sphere") frame.add_object(hl.sphere(center=(10, 0, 30), radius=7).rotate( theta=math.pi / 2, axis=(0, 1, 0), p=(10, 0, 30)).rotate(theta=-t * speed, axis=vector, p=(10, 0, 30)).project(method='weak'), name="sphere2") return frame.render_scene(x_range=(-10, 50), y_range=(-30, 30), resolution=20, density=5, style='wireframe', region_params={ 'a_spacing': 2, 'b_spacing': 2 }, foreground=(51, 255, 255), background=(112, 50, 50), display=False)
def scene_at_t(t, background): frame = hl.MonochromeScene() # hl.render_from_array(background) frame.add_object(hl.square(20, p0=(-60, -60)), "nothing") frame.add_object( hl.square(20, p0=(-60, -10)).rotate(theta=math.pi * t, p=(-50, 0)), "rotate clockwise") frame.add_object( hl.square(20, p0=(-60, 40)).rotate(theta=math.pi * -t, p=(-50, 50)), "rotate counterclockwise") frame.add_object( hl.square(20, p0=(-10, -60)).translate(tx=math.sin(t * math.pi) * 10), "x translate") frame.add_object( hl.square(20, p0=(-10, -10)).translate(ty=math.cos(t * math.pi) * 10), "y translate") frame.add_object( hl.square(20, p0=(-10, 40)).translate(tx=math.sin(t * math.pi) * 10, ty=math.cos(t * math.pi) * 10), "x and y translate") '''frame.add_object(hl.square(20, p0=(40, -60)).scale(sx=math.sin(t * math.pi) * 2, p=(50, -50)), "x scale") frame.add_object(hl.square(20, p0=(40, -10)).scale(sy=math.cos(t * math.pi) * 2, p=(50, 0)), "y scale") frame.add_object(hl.square(20, p0=(40, 40)).scale(sx=math.sin(t * math.pi) * 2, sy=math.cos(t * math.pi) * 2, p=(50, 50)), "x and y scale")''' frame.add_object( hl.square(20, p0=(40, -60)).shear(sx=math.sin(t * math.pi), p=(50, -50)), "x shear") frame.add_object( hl.square(20, p0=(40, -10)).shear(sy=math.cos(t * math.pi), p=(50, 0)), "y shear") frame.add_object( hl.square(20, p0=(40, 40)).shear(sx=math.sin(t * math.pi), sy=math.cos(t * math.pi), p=(50, 50)), "x and y shear") return frame.render_scene(x_range=(-80, 80), y_range=(-80, 80), resolution=5, density=2, foreground=hl.WHITE, background=hl.BLACK, backdrop=background)
def rotating_wheel(t, frequency): canvas = hl.MonochromeScene() canvas.add_object(hl.wheel(radius=1, num_spokes=10).rotate(theta=math.pi * 2 * frequency * t), "wheel") return canvas.render_scene(x_range=(-2, 2), y_range=(-2, 2), resolution=200, density=30, foreground=hl.WHITE, background=hl.BLACK, display=False)
def slope_field(points, arrow_length=1, arrow_head_length=0.2): """ Draw an arrow with slope f'(x, y) at each point (x, y) in points :param points: (x, y, f'(x, y)) :return: """ field = hl.MonochromeScene() for point in points: field.add_object(hl.arrow(p0=point[0:2], direction=point[2], length=arrow_length, head_length=arrow_head_length), name='{0}{1}'.format(point[0], point[1])) return field
def render(self): scene = hl.MonochromeScene() for obj_id, obj in self.objects.items(): scene.add_object(obj.apply(), f"{obj.name}-{str(obj_id)[:3]}") params = asdict(self.scene_settings) params.pop("autorender") # FIXME lol image = scene.render_scene(**params) # Save the image or python will garbage collect, even if tk is displaying it... self.image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(image)) self.canvas.create_image(0, 0, image=self.image, anchor=tk.NW, tag="image")
def scene_at_t(t): frame = hallucinator.MonochromeScene() frame.add_object( hallucinator.plane_section(p0=(t * 20 - 50, 0, 0), v1=(0, 1, 0), v2=(1, 0, 1), a_range=(-100, 100), b_range=(0, 200)).project(method='weak'), "plane") return frame.render_scene(x_range=(-30, 30), y_range=(-30, 30), resolution=20, density=50, foreground=hallucinator.WHITE, background=hallucinator.BLACK, display=False)
def rotating_box(t, background): frame = hl.MonochromeScene() for i in range(3): frame.add_object(hl.box(30, 30, 30, (-50 + 50 * i, 25, 30)), "box{0}".format(i)) for i in range(3): frame.add_object(hl.box(30, 30, 30, (-50 + 50 * i, -40, 30)), "box{0}".format(i + 3)) frame.objects["box0"] = frame.objects["box0"].shear(xy=math.sin(t), p=(-50, 25, 30)) frame.objects["box1"] = frame.objects["box1"].shear(xz=math.sin(t), p=(0, 25, 30)) frame.objects["box2"] = frame.objects["box2"].shear(yx=math.sin(t), p=(50, 25, 30)) frame.objects["box3"] = frame.objects["box3"].shear(yz=math.sin(t), p=(-50, -40, 30)) frame.objects["box4"] = frame.objects["box4"].shear(zx=math.sin(t), p=(0, -40, 30)) frame.objects["box5"] = frame.objects["box5"].shear(zy=math.sin(t), p=(50, -40, 30)) for i in range(3): frame.objects["box{0}".format(i)] = frame.objects["box{0}".format( i)].rotate(math.pi / 8, (1, 0, 0), (-50 + -50 * i, 25, 30)) frame.objects["box{0}".format(i)] = frame.objects["box{0}".format( i)].project("ortho") for i in range(3, 6): frame.objects["box{0}".format(i)] = frame.objects["box{0}".format( i)].rotate(math.pi / 8, (1, 0, 0), (-50 + -50 * i, -40, 30)) frame.objects["box{0}".format(i)] = frame.objects["box{0}".format( i)].project("ortho") return frame.render_scene(x_range=(-100, 100), y_range=(-100, 100), resolution=5, density=3, foreground=hl.WHITE, background=hl.RED, backdrop=background, display=False)
def rotating_box(t, background): speed = 0.5 frame = hallucinator.MonochromeScene() vector = (math.sin(t), math.cos(t), math.sin(t)) mag = math.sqrt(vector[0]**2 + vector[1]**2 + vector[2]**2) normal_vec = (vector[0] / mag, vector[1] / mag, vector[2] / mag) frame.add_object(hallucinator.box(20, 20, 20, p0=(-10, -10, -10)).rotate( theta=math.cos(t) * speed * math.pi * t, axis=normal_vec).project(method='ortho'), name="box") return frame.render_scene(x_range=(-30, 30), y_range=(-30, 30), resolution=5, density=3, foreground=hallucinator.WHITE, background=hallucinator.RED, backdrop=background, display=False)
def wavy_scene(t, **kwargs): scene = hl.MonochromeScene() scene.add_object(wavy_surface(amplitude=1, frequency=t, direction=0, phase=0, rotate_x=-1, rotate_y=4, rotate_z=1, location=(0, 0, 40)), "surface") camscene = scene.render_scene(camera_position=(0, 0, -15), projection_type=hl.Projections.WEAK, styles=hl.Styles.UNIFORM, x_range=(-7, 7), y_range=(-7, 7), resolution=75, densities=(6, 30)) return camscene
def surface(amplitude: float = 1, frequency: float = 1, direction: Tuple[float, float] = (0, 1), phase: float = 0, rotate_x: float = 0, location: Tuple[int, int, int] = (0, 0, 20), camera_pos: Tuple[int, int, int] = (0, 0, 0)): resolution = 200 x_range = (-5, 5) y_range = (-5, 5) projection_type = 'weak' render_density = 10 surface_func = hl.plane_wave(amplitude, frequency, direction=direction, phase=phase) surface_obj = hl.ParaObject3( surface_func, region_type='2d', region_params={ 'a_range': (-3, 3), 'b_range': (-3, 3), 'a_length': 'auto', 'b_length': 'auto' }, species='surface').rotate(theta=rotate_x, axis=(1, 0, 0)).translate(location) scene = hl.MonochromeScene() scene.add_object(surface_obj, name='surface') return hl.camscene( scene, camera_pos, render_density=render_density, projection_type=projection_type, styles='line', x_range=x_range, y_range=y_range, resolution=resolution, )
import hallucinator as hl import math scene = hl.MonochromeScene() location = (5, -10, 40) location_2 = (0, 8, 60) spiral_location = (-7, -10, 10) rotate_x = math.pi / 4 scene.add_object(hl.ParaObject3(hl.gen_ripple(amplitude=0.5, frequency=3, phase=0), region_type='2d', region_params={'surface_range': ((-10, 10), (-10, 10))}, species='surface').rotate(theta=rotate_x, axis=(1, 0, 0)).translate(location), "ripple") scene.add_object(hl.ParaObject3(hl.gen_ripple(amplitude=0.5, frequency=3, phase=0), region_type='2d', region_params={'surface_range': ((-10, 10), (-10, 10))}, species='surface').rotate(theta=-rotate_x, axis=(1, 1, 0)).translate(location_2), "ripple2") scene.add_object(hl.path_3(path_func=hl.gen_spiral(coil_density=1, radius=2), p_range=(0, 10), path_length=10 * math.pi).translate(spiral_location), "spiral") camscene = scene.render_scene(camera_position=(0, -3, -50), projection_type=hl.Projections.WEAK, styles={'ripple': hl.Styles.WIREFRAME, 'ripple2': hl.Styles.UNIFORM, 'spiral': hl.Styles.UNIFORM}, x_range=(-10, 10),
"y shear") frame.add_object( hl.square(20, p0=(40, 40)).shear(sx=math.sin(t * math.pi), sy=math.cos(t * math.pi), p=(50, 50)), "x and y shear") return frame.render_scene(x_range=(-80, 80), y_range=(-80, 80), resolution=5, density=2, foreground=hl.WHITE, background=hl.BLACK, backdrop=background) canvas = hl.MonochromeScene() canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(-50, 0)), "axes1") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(-50, 50)), "axes2") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(-50, -50)), "axes3") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(0, 0)), "axes4") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(0, 50)), "axes5") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(0, -50)), "axes6") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(50, 0)), "axes7") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(50, 50)), "axes8") canvas.add_object(hl.axes((-20, 20), (-20, 20), origin=(50, -50)), "axes9") background = canvas.render_scene(x_range=(-80, 80), y_range=(-80, 80), resolution=5, density=2, foreground=hl.WHITE,
def at_t(t, scene, backdrop): return scene.render_scene(params={'wave': { 't': t }}, x_range=(-20, 20), y_range=(-20, 20), resolution=20, density=10, foreground=hallucinator.WHITE, background=hallucinator.RED, display=False, backdrop=backdrop) scene = hallucinator.MonochromeScene() spiral = lambda p: (math.cos(p * 2 * math.pi) * 10, p * 10, math.sin(p * 2 * math.pi) * 10) disturbance = lambda u: 3 / (2 * u**2 + 1) #disturbance = lambda u: math.sin(u*50) backdrop = hallucinator.MonochromeScene() backdrop.add_object(hallucinator.axes(x_range=(-20, 20), y_range=(-20, 20)), "axes") backdrop_arr = backdrop.render_scene(x_range=(-20, 20), y_range=(-20, 20), resolution=20,
def at_t(t, scene, backdrop): return scene.render_scene(params={'wave': { 't': t }}, x_range=(-10, 10), y_range=(-10, 10), resolution=40, density=20, foreground=hl.WHITE, background=hl.BLACK, display=False, backdrop=backdrop) scene = hl.MonochromeScene() path = hl.line_parametric(p0=(0, 0), dx=1, dy=0.5) f = lambda u: 3 / (2 * u**2 + 1) disturbance = hl.propagating_disturbance(f, v=2) backdrop = hl.MonochromeScene() backdrop.add_object(hl.axes(x_range=(-10, 10), y_range=(-10, 10)), "axes") backdrop_arr = backdrop.render_scene(x_range=(-10, 10), y_range=(-10, 10), resolution=40, density=10, foreground=hl.WHITE, background=hl.BLACK)
import sys sys.path.append('../hallucinator') import hallucinator canvas = hallucinator.MonochromeScene() canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(-70, -10)), "axes1") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(-70, 40)), "axes2") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(-70, -60)), "axes3") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(-20, -10)), "axes4") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(-20, 40)), "axes5") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(-20, -60)), "axes6") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(30, -10)), "axes7") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(30, 40)), "axes8") canvas.add_object(hallucinator.axes((0, 40), (0, 40), origin=(30, -60)), "axes9") background = canvas.render_scene(x_range=(-80, 80), y_range=(-80, 80), resolution=10, density=1, foreground=hallucinator.RED, background=hallucinator.BLACK,
sys.path.append('../hallucinator') import hallucinator def at_t(t, scene): return scene.render_scene(params={'wave': { 't': t }}, x_range=(-10, 10), y_range=(-10, 10), resolution=40, density=5, foreground=hallucinator.WHITE, background=hallucinator.BLACK, display=False) scene = hallucinator.MonochromeScene() scene.add_object(hallucinator.axes(x_range=(-10, 10), y_range=(-10, 10)), "axes") f = lambda u: 3 / (2 * u**2 + 1) #TODO this is broken by update on disturbance_on_path scene.add_object(hallucinator.disturbance_on_path(f=f, v=2, x_range=(-10, 10)), "wave") hallucinator._deprecated_video(frame_func=lambda t: at_t(t, scene), filename='t_param_test', t_range=(0, 10), FPS=20)