# Copyright 2014 The Cayley Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import svgwrite import math import random dwg = svgwrite.Drawing((210,130)) node_radius = 15 big_radius = 50 fan_dist = 90 center = (105,65) edge_stroke = 2.5 edge_color = '#555555' fan_color = '#aa0000' b = '#4285F4' r = '#DB4437' g = '#0F9D58' y = '#F4B400' n = '#999999' center_colors = [b, r, y, b, r, y] edge_color = n fan_color = n def center_list(center, big_r): x, y = center out = [] for i in range(0,6): ox = x + (math.cos(2 * math.pi * i / 6.0) * big_r) oy = y - (math.sin(2 * math.pi * i / 6.0) * big_r) out.append((ox, oy)) return out cx, cy = center ring_centers = center_list(center, big_radius) outer_left = (cx - fan_dist, cy) outer_right = (cx + fan_dist, cy) left = ring_centers[3] right = ring_centers[0] all_lines = [] l = dwg.add(dwg.line(outer_left, left)) l.stroke(edge_color, edge_stroke) all_lines.append(l) l = dwg.add(dwg.line(outer_right, right)) l.stroke(edge_color, edge_stroke) all_lines.append(l) for i, c in enumerate(ring_centers): for j, d in enumerate(ring_centers): if i > j or i == j: continue if (i % 3) == (j % 3): continue if (i % 3) == 1 and (j % 3) == 2: continue if (j % 3) == 1 and (i % 3) == 2: continue if i == 0 and j == 3: continue if i == 3 and j == 0: continue l = dwg.add(dwg.line(c,d)) l.stroke(edge_color, edge_stroke) all_lines.append(l) circle_elems = [] for i, c in enumerate(ring_centers): elem = dwg.add(dwg.circle(c, node_radius, fill=center_colors[i])) circle_elems.append(elem) left_circle = dwg.add(dwg.circle(outer_left, node_radius, fill=fan_color)) right_circle = dwg.add(dwg.circle(outer_right, node_radius, fill=fan_color)) anims = [] def flash(element, orig_color, start, is_line=False): prop = "fill" if is_line: prop = "stroke" a = svgwrite.animate.Animate(prop, href=element) a['from'] = orig_color a['to'] = g a['begin'] = "+%0.2fs" % start a['dur'] = "1.0s" dwg.add(a) anims.append(a) a = svgwrite.animate.Animate(prop, href=element) a['from'] = g a['to'] = orig_color a['begin'] = "+%0.2fs" % (start + 1.0) a['dur'] = "1.2s" dwg.add(a) anims.append(a) return a dwg.saveas("cayley.svg") first = flash(left_circle, n, 0) flash(all_lines[0], n, 0.5, True) flash(all_lines[7], n, 1.0, True) flash(all_lines[3], n, 1.5, True) flash(all_lines[9], n, 1.0, True) flash(all_lines[5], n, 1.5, True) flash(all_lines[1], n, 2.0, True) flash(right_circle, n, 2.5) flash(left_circle, n, 3.5) flash(all_lines[0], n, 4.0, True) flash(all_lines[6], n, 4.5, True) flash(all_lines[4], n, 5.0, True) flash(all_lines[8], n, 4.5, True) flash(all_lines[2], n, 5.0, True) flash(all_lines[1], n, 5.5, True) final = flash(right_circle, n, 6.0) for anim in anims: anim["begin"] = anim["begin"] + "; " + final.get_id() + ".end" + anim["begin"] dwg.saveas("cayley_active.svg")