def anim7(svg):
    H, W = svg.get_size()
    cx, cy = W // 2, H // 2

    # define gradient color
    color_id = 'myGradient'
    defs = svg.draw(draw_any('defs'))
    grad = svg.draw_node(defs, draw_any('radialGradient ', id=f'{color_id}'))

    stop_dict = {}
    stop_dict['offset'] = '2%'
    stop_dict['stop-color'] = 'gold'
    svg.draw_node(grad, draw_any('stop', None, **stop_dict))
    stop_dict['offset'] = '90%'
    stop_dict['stop-color'] = 'red'
    svg.draw_node(grad, draw_any('stop', None, **stop_dict))

    g = svg.draw(draw_tag('g'))
    svg.set_node(g, 'opacity', '1.0')

    r = 8
    pt = [cx, cy]
    # color = 'red'
    color = f"url('#{color_id}')"
    draw_ball_movin(svg,
                    g,
                    r,
                    W,
                    H,
                    start_pt=pt,
                    step_x=-2,
                    step_y=3,
                    N=500,
                    color=color,
                    draw_path_line=True)
def anim10(svg):
    """moving ball bounce with a line"""
    H, W = svg.get_size()
    cx, cy = W // 2, H // 2

    g = svg.draw(draw_tag('g'))
    svg.set_node(g, 'opacity', '1.0')

    wall_line = [2, -1.8, 1]  # line parameters
    pts = draw_line_param_abc(wall_line, 0, W, 0, H)
    drawlinePoints(svg, pts, g, color='black')

    for i in range(50):
        pt = random_point(4, W - 5)
        # print(pt, type(pt))
        vx = random.randint(1, 5) * [-1, 1][random.randrange(2)]
        vy = random.randint(1, 5) * [-1, 1][random.randrange(2)]

        res = get_math_bounce_parameter(wall_line, pt, vx, vy)
        perpend_pt, reflect_pt, inter_pt, path_line, reflect_line = res

        coords = [pt, inter_pt]
        if reflect_pt is not None:
            min_x, max_x = 0, W
            # min_y, max_y = 0, H

            far_pt = [0, 0]
            if reflect_pt[0] < inter_pt[0]:
                min_x = inter_pt[0]

                far_pt[0] = max_x
                far_pt[1] = get_line_ABC_y(reflect_line, far_pt[0])
            else:
                max_x = inter_pt[0]
                far_pt[0] = min_x
                far_pt[1] = get_line_ABC_y(reflect_line, far_pt[0])

            coords.append(far_pt)
            coords = np.asarray(coords)

        path = get_points_path(coords, False)
        draw_circle_path_anim(svg,
                              g,
                              path,
                              radius=3,
                              duration=len(coords) * 1.0,
                              color='red')
def anim_Windmill(svg):
    H, W = svg.get_size()
    cx, cy = W // 2, H // 2

    g = svg.draw(draw_tag('g'))
    svg.set_node(g, 'opacity', '1.0')
    drawNodeShape(svg, g)

    animateTransDict = {}
    animateTransDict['attributeName'] = 'transform'
    animateTransDict['attributeType'] = 'xml'
    animateTransDict['type'] = 'rotate'
    animateTransDict['from'] = f'0 {cx} {cy}'
    animateTransDict['to'] = f'360 {cx} {cy}'
    animateTransDict['dur'] = '8s'
    animateTransDict["repeatCount"] = "indefinite"  # "5"

    addNodeAnitmation(svg, g, animateTransDict, elementName='animateTransform')
def anim8(svg):
    H, W = svg.get_size()
    cx, cy = W // 2, H // 2

    g = svg.draw(draw_tag('g'))
    svg.set_node(g, 'opacity', '1.0')
    pt = (cx, cy)
    for i in range(100):
        r = random.randint(2, 8)
        # pt = (random.randint(2+r, W-2-r), random.randint(2+r, H-2-r))
        sx = random.randint(1, 8) * [-1, 1][random.randrange(2)]
        sy = random.randint(1, 8) * [-1, 1][random.randrange(2)]
        # print('r, sx, sy=', r, sx, sy)
        draw_ball_movin(svg,
                        g,
                        r,
                        W,
                        H,
                        start_pt=pt,
                        step_x=sx,
                        step_y=sy,
                        N=800,
                        color=random_color_hsv())
def anim6(svg):
    def draw_moving_circle(svg,
                           g,
                           radius,
                           y,
                           offset_x,
                           color='red',
                           duration=None):
        path = f'M{radius + offset_x} {y} H{W - (radius + offset_x)} H{radius + offset_x}'
        # svg.draw_node(g, draw_path(path, stroke_width=0.5, color='green'))
        draw_circle_path_anim(svg, g, path, radius, color, duration)

    H, W = svg.get_size()
    print('H, W=', H, W)
    cx, cy = W // 2, H // 2

    g = svg.draw(draw_tag('g'))
    svg.set_node(g, 'opacity', '1.0')

    ver = cy
    r = 8
    offset_x = 0
    offset_y = 0

    draw_moving_circle(svg, g, radius=r, y=ver, offset_x=offset_x)

    N = 20
    for i in range(N):
        rand_r = random.randint(2, r)
        rand_ver = random.randint(offset_y + rand_r, H - 2 * rand_r - offset_y)
        draw_moving_circle(svg,
                           g,
                           radius=rand_r,
                           y=rand_ver,
                           offset_x=offset_x,
                           duration=random.randint(3, 10),
                           color=random_color_hsv())
def anim9(svg):
    """moving ball bounce with a line"""
    H, W = svg.get_size()
    cx, cy = W // 2, H // 2

    g = svg.draw(draw_tag('g'))
    svg.set_node(g, 'opacity', '1.0')

    wall_line = [2, -1.8, 1]  # line parameters
    pt = random_point(4, W - 5)
    print(pt, type(pt))
    vx = -2
    vy = 1

    res = get_math_bounce_parameter(wall_line, pt, vx, vy)
    perpend_pt, reflect_pt, inter_pt, path_line, reflect_line = res

    # draw_line_param(svg, g, a, b, 0, W)
    pts = draw_line_param_abc(wall_line, 0, W, 0, H)
    drawlinePoints(svg, pts, g, color='black')

    svg.draw_node(g, draw_circle(pt[0], pt[1], 1, color='black'))
    svg.draw_node(g, draw_circle(perpend_pt[0], perpend_pt[1], 1, color='red'))
    svg.draw_node(g, draw_circle(reflect_pt[0], reflect_pt[1], 1, color='red'))
    svg.draw_node(g, draw_circle(inter_pt[0], inter_pt[1], 1, color='black'))

    svg.draw_node(
        g,
        draw_line(pt[0],
                  pt[1],
                  reflect_pt[0],
                  reflect_pt[1],
                  stroke_dasharray="2"))
    svg.draw_node(
        g,
        draw_line(inter_pt[0],
                  inter_pt[1],
                  reflect_pt[0],
                  reflect_pt[1],
                  stroke_dasharray="2"))

    if inter_pt is not None:
        min_x = min(pt[0], inter_pt[0])
        max_x = max(pt[0], inter_pt[0])
        min_y = min(pt[1], inter_pt[1])
        max_y = min(pt[1], inter_pt[1])
        pts = draw_line_param_abc(path_line, min_x, max_x, min_y, max_y)
        drawlinePoints(svg, pts, g, color='black')

    coords = [pt, inter_pt]
    if reflect_pt is not None:
        min_x, max_x = 0, W
        min_y, max_y = 0, H

        far_pt = [0, 0]
        if reflect_pt[0] < inter_pt[0]:
            min_x = inter_pt[0]

            far_pt[0] = max_x
            far_pt[1] = get_line_ABC_y(reflect_line, far_pt[0])
        else:
            max_x = inter_pt[0]
            far_pt[0] = min_x
            far_pt[1] = get_line_ABC_y(reflect_line, far_pt[0])

        pts = draw_line_param_abc(reflect_line, min_x, max_x, min_y, max_y)
        drawlinePoints(svg, pts, g, color='black')

        coords.append(far_pt)
        coords = np.asarray(coords)
        print('coords=', coords, coords.shape)
    path = get_points_path(coords, False)
    draw_circle_path_anim(svg,
                          g,
                          path,
                          radius=6,
                          duration=len(coords) * 1.0,
                          color='red')
def addNodeAnitmation(svg, objectNode, animateDict, elementName='animate'):
    animate = svg.draw_node(objectNode, draw_tag(elementName))
    svg.set_node_dict(animate, animateDict)
示例#8
0
 def set_title(self, title=None):
     if title is not None:
         self.draw(draw_tag('title', title))