Пример #1
0
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
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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
Пример #6
0
    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")
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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
Пример #11
0
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,
    )
Пример #12
0
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),
Пример #13
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)


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,
Пример #14
0
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,
Пример #15
0
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)
Пример #16
0
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,
Пример #17
0
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)