Created
March 16, 2017 12:59
-
-
Save GrantTrebbin/e4bfcdb047e4883e785e3e192e95aa55 to your computer and use it in GitHub Desktop.
Rendering Animations for Hilbert Curves - Undocumented Scratch Code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import svgwrite | |
| import math | |
| # mogrify -format gif *.svg | |
| # gifsicle --scale 0.2 --delay=5 --loop --optimize=2 --colors=256 --multifile *.gif > OutGIF/out.gif | |
| order = 3 | |
| number_of_index_bits = order * 2 | |
| number_of_elements = pow(2, number_of_index_bits) | |
| x_offset = 130 | |
| y_offset = 130 | |
| class Diagram: | |
| def __init__(self, width, height): | |
| self.width = width | |
| self.height = height | |
| self.dwg = svgwrite.Drawing(profile='full', | |
| size=(str(width) + 'px', | |
| str(height) + 'px'), | |
| viewBox=('0 0 ' + str(width) + | |
| ' ' + str(height))) | |
| self.dwg.add(self.dwg.rect(insert=(0, 0), | |
| size=(width, height), | |
| fill='rgb(50,50,50)')) | |
| def coordinate_transform(width, height, size, cells, offset): | |
| return lambda v: [(v[0] + 0.5) * size / cells + offset[0], | |
| size - (v[1] + 0.5) * size / cells + offset[1]] | |
| def draw_grid(d, size, number_of_cells, position): | |
| ct = coordinate_transform(d.width, d.height, size, number_of_cells, position) | |
| d.dwg.add(d.dwg.rect(insert=(position[0], position[1]), | |
| size=(size, size), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=5, | |
| fill='none')) | |
| for i in range(1, number_of_cells): | |
| offset = size * i / number_of_cells | |
| d.dwg.add(d.dwg.line(start=(position[0], position[1] + offset), | |
| end=(position[0] + size, position[1] + offset), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=5)) | |
| d.dwg.add(d.dwg.line(start=(position[0] + offset, position[1]), | |
| end=(position[0] + offset, position[1] + size), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=5)) | |
| return ct | |
| binary_index = [] | |
| for i in range(0, number_of_elements): | |
| binary_list = [] | |
| temp = i | |
| for element in range(0, number_of_index_bits): | |
| binary_list.append(temp % 2) | |
| temp //= 2 | |
| binary_list.reverse() | |
| x_bin = binary_list[0::2] | |
| y_bin = binary_list[1::2] | |
| x = 0 | |
| for bit in x_bin: | |
| x *= 2 | |
| x += bit | |
| y = 0 | |
| for bit in y_bin: | |
| y *= 2 | |
| y += bit | |
| binary_strings = {'index': i, | |
| 'binary': binary_list, | |
| 'x': x, | |
| 'x_bin': x_bin, | |
| 'y': y, | |
| 'y_bin': y_bin} | |
| binary_index.append(binary_strings) | |
| diagram = Diagram(1920*2, 1080*2) | |
| grid_coord_transform = draw_grid(diagram, | |
| 1900, | |
| pow(2, order), | |
| (x_offset, y_offset)) | |
| title = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "Binary Indexing", | |
| insert=(x_offset + 2000, y_offset + 130), | |
| fill="rgb(200,200,200)", | |
| style="font-size:180px; font-family:Lucida Console; font-weight:bold")) | |
| attribution = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "@GPTreb", | |
| insert=(x_offset + 3100, y_offset + 1900), | |
| fill="rgb(200,200,200)", | |
| style="font-size:100px; font-family:Lucida Console; font-weight:bold")) | |
| index_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "Index", | |
| insert=(x_offset + 2300, y_offset + 500), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| index_num = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "", | |
| insert=(x_offset + 2300, y_offset + 700), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| binary_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "Index", | |
| insert=(x_offset + 2300, y_offset + 1000), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| binary_num = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "0b", | |
| insert=(x_offset + 2300, y_offset + 1200), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| x_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "x=0b", | |
| insert=(x_offset + 2300, y_offset + 1500), | |
| fill="rgb(200,100,100)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| y_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "y=0b", | |
| insert=(x_offset + 2300, y_offset + 1700), | |
| fill="rgb(100,100,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| circle = diagram.dwg.add(diagram.dwg.circle(r=30, | |
| fill="rgb(100,200,100)")) | |
| path = [] | |
| trajectory = diagram.dwg.add( | |
| diagram.dwg.polyline( | |
| points=[(0, 0)], | |
| stroke="rgb(100,200,100)", | |
| stroke_linejoin='round', | |
| stroke_width=15, | |
| fill='none')) | |
| frame = 0 | |
| index_bits = [] | |
| for i in range(0, number_of_index_bits): | |
| temp = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "1", | |
| insert=(x_offset + 2520+i*110, y_offset + 1200), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| index_bits.append(temp) | |
| for step in range(0, number_of_elements): | |
| digits = math.ceil(math.log10(number_of_elements)) | |
| format_string = '{0:0>' + str(digits) + '}' | |
| index_num.text = format_string.format(step) | |
| index_bit_list = binary_index[step]['binary'] | |
| for i in range(0, number_of_index_bits): | |
| index_bits[i].text = index_bit_list[i] | |
| if (i % 2) == 0: | |
| index_bits[i]['fill'] = "rgb(200,100,100)" | |
| else: | |
| index_bits[i]['fill'] = "rgb(100,100,200)" | |
| x_binary = binary_index[step]['x_bin'] | |
| x_dec = binary_index[step]['x'] | |
| y_binary = binary_index[step]['y_bin'] | |
| y_dec = binary_index[step]['y'] | |
| x_string = ''.join([str(e) for e in x_binary]) | |
| y_string = ''.join([str(e) for e in y_binary]) | |
| x_name.text = 'x=0b' + x_string | |
| y_name.text = 'y=0b' + y_string | |
| if step < number_of_elements-1: | |
| next_x_dec = binary_index[step+1]['x'] | |
| next_y_dec = binary_index[step+1]['y'] | |
| transition_steps = int(math.sqrt(pow((next_y_dec-y_dec), 2) + | |
| pow((next_x_dec-x_dec), 2))/0.1) | |
| for i in range(0, transition_steps): | |
| transitional_x = (transition_steps-i) * x_dec + i * next_x_dec | |
| transitional_y = (transition_steps-i) * y_dec + i * next_y_dec | |
| dot_coordinates = grid_coord_transform( | |
| (transitional_x / transition_steps, | |
| transitional_y / transition_steps)) | |
| coordinate_tuple = tuple(dot_coordinates) | |
| path.append(coordinate_tuple) | |
| trajectory.points = path | |
| circle['cx'] = dot_coordinates[0] | |
| circle['cy'] = dot_coordinates[1] | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
| else: | |
| transitional_x = x_dec | |
| transitional_y = y_dec | |
| dot_coordinates = grid_coord_transform((x_dec, y_dec)) | |
| coordinate_tuple = tuple(dot_coordinates) | |
| path.append(coordinate_tuple) | |
| trajectory.points = path | |
| circle['cx'] = dot_coordinates[0] | |
| circle['cy'] = dot_coordinates[1] | |
| for end_frames in range(0, 20): | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import svgwrite | |
| import math | |
| # mogrify -format gif *.svg | |
| # gifsicle --scale 0.2 --delay=5 --loop --optimize=2 --colors=256 --multifile *.gif > OutGIF/out.gif | |
| order = 3 | |
| number_of_index_bits = order * 2 | |
| number_of_elements = pow(2, number_of_index_bits) | |
| x_offset = 130 | |
| y_offset = 130 | |
| class Diagram: | |
| def __init__(self, width, height): | |
| self.width = width | |
| self.height = height | |
| self.dwg = svgwrite.Drawing(profile='full', | |
| size=(str(width) + 'px', | |
| str(height) + 'px'), | |
| viewBox=('0 0 ' + str(width) + | |
| ' ' + str(height))) | |
| self.dwg.add(self.dwg.rect(insert=(0, 0), | |
| size=(width, height), | |
| fill='rgb(50,50,50)')) | |
| def coordinate_transform(width, height, size, cells, offset): | |
| return lambda v: [(v[0] + 0.5) * size / cells + offset[0], | |
| size - (v[1] + 0.5) * size / cells + offset[1]] | |
| def draw_grid(d, size, number_of_cells, position): | |
| ct = coordinate_transform(d.width, d.height, size, number_of_cells, position) | |
| d.dwg.add(d.dwg.rect(insert=(position[0], position[1]), | |
| size=(size, size), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=5, | |
| fill='none')) | |
| for i in range(1, number_of_cells): | |
| offset = size * i / number_of_cells | |
| d.dwg.add(d.dwg.line(start=(position[0], position[1] + offset), | |
| end=(position[0] + size, position[1] + offset), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=5)) | |
| d.dwg.add(d.dwg.line(start=(position[0] + offset, position[1]), | |
| end=(position[0] + offset, position[1] + size), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=5)) | |
| return ct | |
| binary_index = [] | |
| for i in range(0, number_of_elements): | |
| binary_list = [] | |
| temp = i | |
| for element in range(0, number_of_index_bits): | |
| binary_list.append(temp % 2) | |
| temp //= 2 | |
| binary_list.reverse() | |
| gray_list = [binary_list[0]] + [abs(binary_list[j+1]-binary_list[j]) for j in range(number_of_index_bits-1)] | |
| print(binary_list) | |
| print(gray_list) | |
| print("---") | |
| x_bin = gray_list[0::2] | |
| y_bin = gray_list[1::2] | |
| x = 0 | |
| for bit in x_bin: | |
| x *= 2 | |
| x += bit | |
| y = 0 | |
| for bit in y_bin: | |
| y *= 2 | |
| y += bit | |
| binary_strings = {'index': i, | |
| 'binary': binary_list, | |
| 'gray': gray_list, | |
| 'x': x, | |
| 'x_bin': x_bin, | |
| 'y': y, | |
| 'y_bin': y_bin} | |
| binary_index.append(binary_strings) | |
| diagram = Diagram(1920*2, 1080*2) | |
| grid_coord_transform = draw_grid(diagram, | |
| 1900, | |
| pow(2, order), | |
| (x_offset, y_offset)) | |
| title = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "Gray Code Indexing", | |
| insert=(x_offset + 2000, y_offset + 100), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| attribution = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "@GPTreb", | |
| insert=(x_offset + 3100, y_offset + 1900), | |
| fill="rgb(200,200,200)", | |
| style="font-size:100px; font-family:Lucida Console; font-weight:bold")) | |
| index_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "Index", | |
| insert=(x_offset + 2000, y_offset + 450), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| index_num = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "", | |
| insert=(x_offset + 2000, y_offset + 650), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| binary_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "Gray code of Index", | |
| insert=(x_offset + 2000, y_offset + 1000), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| binary_num = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "0b", | |
| insert=(x_offset + 2000, y_offset + 1200), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| x_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "x=0b", | |
| insert=(x_offset + 2000, y_offset + 1500), | |
| fill="rgb(200,100,100)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| y_name = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "y=0b", | |
| insert=(x_offset + 2000, y_offset + 1700), | |
| fill="rgb(100,100,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| circle = diagram.dwg.add(diagram.dwg.circle(r=30, | |
| fill="rgb(100,200,100)")) | |
| path = [] | |
| trajectory = diagram.dwg.add( | |
| diagram.dwg.polyline( | |
| points=[(0, 0)], | |
| stroke="rgb(100,200,100)", | |
| stroke_linejoin='round', | |
| stroke_width=15, | |
| fill='none')) | |
| frame = 0 | |
| index_bits = [] | |
| for i in range(0, number_of_index_bits): | |
| temp = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "1", | |
| insert=(x_offset + 2220+i*110, y_offset + 1200), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| index_bits.append(temp) | |
| for step in range(0, number_of_elements): | |
| digits = math.ceil(math.log10(number_of_elements)) | |
| format_string = '{0:0>' + str(digits) + '}' | |
| index_num.text = format_string.format(step) | |
| index_bit_list = binary_index[step]['gray'] | |
| for i in range(0, number_of_index_bits): | |
| index_bits[i].text = index_bit_list[i] | |
| if (i % 2) == 0: | |
| index_bits[i]['fill'] = "rgb(200,100,100)" | |
| else: | |
| index_bits[i]['fill'] = "rgb(100,100,200)" | |
| x_binary = binary_index[step]['x_bin'] | |
| x_dec = binary_index[step]['x'] | |
| y_binary = binary_index[step]['y_bin'] | |
| y_dec = binary_index[step]['y'] | |
| x_string = ''.join([str(e) for e in x_binary]) | |
| y_string = ''.join([str(e) for e in y_binary]) | |
| x_name.text = 'x=0b' + x_string | |
| y_name.text = 'y=0b' + y_string | |
| marker_coordinates = grid_coord_transform((x_dec, y_dec)) | |
| diagram.dwg.add(diagram.dwg.circle(center=marker_coordinates, | |
| r=30, | |
| fill="rgb(100,200,100)")) | |
| if step < number_of_elements-1: | |
| next_x_dec = binary_index[step+1]['x'] | |
| next_y_dec = binary_index[step+1]['y'] | |
| transition_steps = int(math.sqrt(pow((next_y_dec-y_dec), 2) + | |
| pow((next_x_dec-x_dec), 2))/0.1) | |
| for i in range(0, transition_steps): | |
| transitional_x = (transition_steps-i) * x_dec + i * next_x_dec | |
| transitional_y = (transition_steps-i) * y_dec + i * next_y_dec | |
| dot_coordinates = grid_coord_transform( | |
| (transitional_x / transition_steps, | |
| transitional_y / transition_steps)) | |
| coordinate_tuple = tuple(dot_coordinates) | |
| path.append(coordinate_tuple) | |
| trajectory.points = path | |
| circle['cx'] = dot_coordinates[0] | |
| circle['cy'] = dot_coordinates[1] | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
| else: | |
| transitional_x = x_dec | |
| transitional_y = y_dec | |
| dot_coordinates = grid_coord_transform((x_dec, y_dec)) | |
| coordinate_tuple = tuple(dot_coordinates) | |
| path.append(coordinate_tuple) | |
| trajectory.points = path | |
| circle['cx'] = dot_coordinates[0] | |
| circle['cy'] = dot_coordinates[1] | |
| for end_frames in range(0, 20): | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import svgwrite | |
| import math | |
| import colorsys | |
| # mogrify -format gif *.svg | |
| # gifsicle --scale 0.2 --delay=5 --loop --optimize=2 --colors=256 --multifile *.gif > OutGIF/out.gif | |
| order = 4 | |
| number_of_index_bits = order * 2 | |
| number_of_elements = pow(2, number_of_index_bits) | |
| x_offset = 130 | |
| y_offset = 130 | |
| class BinaryCoordinate: | |
| def __init__(self, index, bits_per_dimension, dimensions): | |
| self.number_of_bits = dimensions * bits_per_dimension | |
| self.original_bits = [] | |
| self.index = index | |
| self.dimensions = dimensions | |
| self.bits_per_dimension = bits_per_dimension | |
| temporary_index = self.index | |
| for bit_index in range(0, self.number_of_bits): | |
| self.original_bits.append(temporary_index % 2) | |
| temporary_index //= 2 | |
| self.original_bits.reverse() | |
| self.bits = self.original_bits | |
| def dimension_subset_binary(self, dimension_number): | |
| subset = self.bits[dimension_number: | |
| self.number_of_bits: | |
| self.dimensions] | |
| return subset | |
| def dimension_subset_decimal(self, dimension_number): | |
| subset = self.dimension_subset_binary(dimension_number) | |
| decimal = 0 | |
| for bit_index in subset: | |
| decimal = decimal * 2 + bit_index | |
| return decimal | |
| def swap_lower_bits(self, dimension_1, dimension_2, offset): | |
| for bit_index in range(offset * self.dimensions, | |
| self.number_of_bits, | |
| self.dimensions): | |
| temporary_bit = self.bits[bit_index + | |
| dimension_1] | |
| self.bits[bit_index + dimension_1] =\ | |
| self.bits[bit_index + dimension_2] | |
| self.bits[bit_index + dimension_2] = \ | |
| temporary_bit | |
| def invert_lower_bits(self, dimension, offset): | |
| for bit_index in range(offset * self.dimensions, | |
| self.number_of_bits, | |
| self.dimensions): | |
| temporary_bit = self.bits[bit_index + | |
| dimension] | |
| self.bits[bit_index + dimension] = (-1) * temporary_bit + 1 | |
| def gray(bits): | |
| gray_bits = [bits[0]] +\ | |
| [abs(bits[j + 1] - bits[j]) for j in range(len(bits) - 1)] | |
| return gray_bits | |
| class Diagram: | |
| def __init__(self, width, height): | |
| self.width = width | |
| self.height = height | |
| self.dwg = svgwrite.Drawing(profile='full', | |
| size=(str(width) + 'px', | |
| str(height) + 'px'), | |
| viewBox=('0 0 ' + str(width) + | |
| ' ' + str(height))) | |
| self.dwg.add(self.dwg.rect(insert=(0, 0), | |
| size=(width, height), | |
| fill='rgb(50,50,50)')) | |
| def coordinate_transform(size, cells, offset): | |
| return lambda v: [(v[0] + 0.5) * size / cells + offset[0], | |
| size - (v[1] + 0.5) * size / cells + offset[1]] | |
| def draw_grid(d, size, number_of_cells, position): | |
| ct = coordinate_transform(size, number_of_cells, position) | |
| d.dwg.add(d.dwg.rect(insert=(position[0], position[1]), | |
| size=(size, size), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=1, | |
| fill='none')) | |
| for i in range(1, number_of_cells): | |
| offset = size * i / number_of_cells | |
| d.dwg.add(d.dwg.line(start=(position[0], position[1] + offset), | |
| end=(position[0] + size, position[1] + offset), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=1)) | |
| d.dwg.add(d.dwg.line(start=(position[0] + offset, position[1]), | |
| end=(position[0] + offset, position[1] + size), | |
| stroke='rgb(200,200,200)', | |
| stroke_width=1)) | |
| return ct | |
| diagram = Diagram(1920*2, 1080*2) | |
| line_1 = diagram.dwg.add( | |
| diagram.dwg.text( | |
| 'Gray Code to', | |
| insert=(x_offset + 2000, y_offset + 100), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| line_2 = diagram.dwg.add( | |
| diagram.dwg.text( | |
| 'Hilbert Curve', | |
| insert=(x_offset + 2000, y_offset + 350), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| line_3 = diagram.dwg.add( | |
| diagram.dwg.text( | |
| 'via the', | |
| insert=(x_offset + 2000, y_offset + 600), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| line_4 = diagram.dwg.add( | |
| diagram.dwg.text( | |
| 'Skilling Method', | |
| insert=(x_offset + 2000, y_offset + 850), | |
| fill="rgb(200,200,200)", | |
| style="font-size:150px; font-family:Lucida Console; font-weight:bold")) | |
| attribution = diagram.dwg.add( | |
| diagram.dwg.text( | |
| "@GPTreb", | |
| insert=(x_offset + 3100, y_offset + 1900), | |
| fill="rgb(200,200,200)", | |
| style="font-size:100px; font-family:Lucida Console; font-weight:bold")) | |
| grid_coord_transform = draw_grid(diagram, | |
| 1900, | |
| pow(2, order), | |
| (x_offset, y_offset)) | |
| elements = [] | |
| path = [] | |
| circles = [] | |
| lines = [] | |
| frame = 0 | |
| for element in range(0, number_of_elements): | |
| new_element = BinaryCoordinate(element, order, 2) | |
| new_element.bits = gray(new_element.bits) | |
| elements.append(new_element) | |
| x_coord = new_element.dimension_subset_decimal(0) | |
| y_coord = new_element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path.append(tuple(coordinates)) | |
| for element_index in range(0, number_of_elements): | |
| progress_fraction = element_index/number_of_elements | |
| hue = 40*progress_fraction + 216*(1-progress_fraction) | |
| rgb_color = colorsys.hsv_to_rgb(hue/256, 0.4, 0.9) | |
| color_string = 'rgb(' +\ | |
| str(int(rgb_color[0]*256)) +\ | |
| ',' +\ | |
| str(int(rgb_color[1]*256)) + \ | |
| ',' +\ | |
| str(int(rgb_color[2]*256)) + ')' | |
| coordinate_1 = path[element_index] | |
| new_marker = diagram.dwg.add(diagram.dwg.circle(center=coordinate_1, | |
| r=15, | |
| fill=color_string)) | |
| circles.append(new_marker) | |
| if element_index < number_of_elements-1: | |
| coordinate_2 = path[element_index+1] | |
| new_line = diagram.dwg.add(diagram.dwg.line(start=coordinate_1, | |
| end=coordinate_1, | |
| stroke=color_string, | |
| stroke_linecap='round', | |
| stroke_width=8, | |
| fill='none')) | |
| length = math.sqrt(pow((coordinate_1[0]-coordinate_2[0]), 2) + | |
| pow((coordinate_1[1]-coordinate_2[1]), 2)) | |
| number_of_steps = int(length / 500) + 1 | |
| for step in range(0, number_of_steps): | |
| line_progress = (step+1)/number_of_steps | |
| new_line['x2'] = (1-line_progress)*coordinate_1[0] +\ | |
| line_progress*coordinate_2[0] | |
| new_line['y2'] = (1-line_progress)*coordinate_1[1] +\ | |
| line_progress*coordinate_2[1] | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
| lines.append(new_line) | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
| path_progression = [] | |
| path_progression.append(path) | |
| path_progression.append(path) | |
| path_progression.append(path) | |
| #1**************************************************************** | |
| path_progression.append([]) | |
| for element in elements: | |
| if element.bits[5] == 0: | |
| element.swap_lower_bits(1, 0, 3) | |
| else: | |
| element.invert_lower_bits(0, 3) | |
| x_coord = element.dimension_subset_decimal(0) | |
| y_coord = element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path_progression[-1].append(tuple(coordinates)) | |
| path_progression.append(path_progression[-1]) | |
| #2**************************************************************** | |
| path_progression.append([]) | |
| for element in elements: | |
| if element.bits[4] == 0: | |
| element.swap_lower_bits(0, 0, 3) | |
| else: | |
| element.invert_lower_bits(0, 3) | |
| x_coord = element.dimension_subset_decimal(0) | |
| y_coord = element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path_progression[-1].append(tuple(coordinates)) | |
| path_progression.append(path_progression[-1]) | |
| #3**************************************************************** | |
| path_progression.append([]) | |
| for element in elements: | |
| if element.bits[3] == 0: | |
| element.swap_lower_bits(1, 0, 2) | |
| else: | |
| element.invert_lower_bits(0, 2) | |
| x_coord = element.dimension_subset_decimal(0) | |
| y_coord = element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path_progression[-1].append(tuple(coordinates)) | |
| path_progression.append(path_progression[-1]) | |
| #4**************************************************************** | |
| path_progression.append([]) | |
| for element in elements: | |
| if element.bits[2] == 0: | |
| element.swap_lower_bits(0, 0, 2) | |
| else: | |
| element.invert_lower_bits(0, 2) | |
| x_coord = element.dimension_subset_decimal(0) | |
| y_coord = element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path_progression[-1].append(tuple(coordinates)) | |
| path_progression.append(path_progression[-1]) | |
| #5**************************************************************** | |
| path_progression.append([]) | |
| for element in elements: | |
| if element.bits[1] == 0: | |
| element.swap_lower_bits(1, 0, 1) | |
| else: | |
| element.invert_lower_bits(0, 1) | |
| x_coord = element.dimension_subset_decimal(0) | |
| y_coord = element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path_progression[-1].append(tuple(coordinates)) | |
| path_progression.append(path_progression[-1]) | |
| #6**************************************************************** | |
| path_progression.append([]) | |
| for element in elements: | |
| if element.bits[0] == 0: | |
| element.swap_lower_bits(0, 0, 1) | |
| else: | |
| element.invert_lower_bits(0, 1) | |
| x_coord = element.dimension_subset_decimal(0) | |
| y_coord = element.dimension_subset_decimal(1) | |
| coordinates = grid_coord_transform((x_coord, y_coord)) | |
| path_progression[-1].append(tuple(coordinates)) | |
| path_progression.append(path_progression[-1]) | |
| path_progression.append(path_progression[-1]) | |
| path_progression.append(path_progression[-1]) | |
| for path_number in range(len(path_progression)-1): | |
| for step in range(25): | |
| b = step/25 | |
| a = 1 - b | |
| for coordinate in range(0, number_of_elements): | |
| circles[coordinate]['cx'] = \ | |
| a * path_progression[path_number][coordinate][0] +\ | |
| b * path_progression[path_number+1][coordinate][0] | |
| circles[coordinate]['cy'] =\ | |
| a * path_progression[path_number][coordinate][1] +\ | |
| b * path_progression[path_number+1][coordinate][1] | |
| for coordinate in range(0, number_of_elements-1): | |
| lines[coordinate]['x1'] =\ | |
| a * path_progression[path_number][coordinate][0] +\ | |
| b * path_progression[path_number + 1][coordinate][0] | |
| lines[coordinate]['y1'] =\ | |
| a * path_progression[path_number][coordinate][1] +\ | |
| b * path_progression[path_number + 1][coordinate][1] | |
| lines[coordinate]['x2'] =\ | |
| a * path_progression[path_number][coordinate + 1][0] +\ | |
| b * path_progression[path_number + 1][coordinate + 1][0] | |
| lines[coordinate]['y2'] =\ | |
| a * path_progression[path_number][coordinate + 1][1] +\ | |
| b * path_progression[path_number + 1][coordinate + 1][1] | |
| diagram.dwg.filename = format(frame, '04') + '.svg' | |
| diagram.dwg.save() | |
| frame += 1 | |
| a = BinaryCoordinate(2519, 6, 2) | |
| print(a.bits) | |
| a.swap_lower_bits(1, 0, 0) | |
| print(a.bits) | |
| a.invert_lower_bits(1, 2) | |
| print(a.bits) | |
| print(a.dimension_subset_decimal(0)) | |
| print(a.dimension_subset_decimal(1)) | |
| print(a.bits) | |
| a.bits = gray(a.bits) | |
| print(a.bits) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment