299 2.18 KB 63
Adobe gradient stop interpolation
By SynthbotCreated: 2022-10-24 00:40:46
Updated: 2022-10-24 00:40:54
Expiry: Never
def calculate_stop_paths(init, fin):
    # Goal: map each start point to its nearest end point and each end point to its
    # nearest start point, then return the mappings as the target path.
    available_starts = kd_tree.KDTree([(x[0],) for x in init], 1)
    available_ends = kd_tree.KDTree([(x[0],) for x in fin], 1)
    init_map = dict((x[0], x) for x in init)
    fin_map = dict((x[0], x) for x in fin)
    forward_map = defaultdict(list)
    cover_count = defaultdict(lambda: 0)
    # Map each start point to its nearest ending point
    for stop in init:
        ratio = stop[0]
        match = available_ends.get_nearest((ratio,), False)[0]
        # add a path ratio -> match
        forward_map[ratio].append(match)
        cover_count[match] += 1
    # Map each unused end point to its nearest starting point
    for stop in fin:
        ratio = stop[0]
        if cover_count[ratio] > 0:
            continue
        match = available_starts.get_nearest((ratio,), False)[0]
        # If this point is covering another redundantly, prefer to remap it
        # rather than double-mapping it
        if forward_map[match]:
            potential_redundancy = forward_map[match][0]
            if cover_count[potential_redundancy] > 1:
                forward_map[match].remove(potential_redundancy)
                cover_count[potential_redundancy] -= 1
        forward_map[match].append(ratio)
    for start in forward_map:
        for end in forward_map[start]:
            yield init_map[start], fin_map[end]
def interpolated_stop(start, end, t):
    ratio = t * end[0] + (1-t) * start[0]
    color, alpha = interpolated_color(start[1], start[2], end[1], end[2], t)
    return (ratio, color, alpha)
def interpolated_color(colx, ax, coly, ay, t):
    rx, gx, bx = split_colors(colx)
    ry, gy, by = split_colors(coly)
    ai = interpolate_value(ax, ay, t)
    if ai == 0:
        return '#FFFFFF', 0
    ri = round(interpolate_value(rx*ax, ry*ay, t)/ai)
    gi = round(interpolate_value(gx*ax, gy*ay, t)/ai)
    bi = round(interpolate_value(bx*ax, by*ay, t)/ai)
    return "#%02X%02X%02X" % (ri, gi, bi), ai
                         by Synthbot
                         by Synthbot
                         by Synthbot
                         by Synthbot
                         by Synthbot