def draw(self, vsk: vsketch.Vsketch) -> None: vsk.size(self.width, self.height, landscape=self.landscape, center=False) delta = (vsk.height - vsk.width) / (self.M - self.N) margin = (self.M * vsk.width - self.N * vsk.height) / 2 / (self.M - self.N) vsk.stroke(1) vsk.vpype( f"text -p 10 20 -s 25 'cell size = {delta*PX_TO_CM:0.2f}cm / " f"margin = {margin*PX_TO_CM:0.2f}cm' penwidth -l1 3") if delta < 0: vsk.vpype( "text -p 10 55 -s 25 'negative cell size, adjust M and N!!!'") else: vsk.stroke(2) vsk.translate(margin, margin) for i in range(self.N + 1): vsk.line(i * delta, 0, i * delta, self.M * delta) for j in range(self.M + 1): vsk.line(0, j * delta, self.N * delta, j * delta) vsk.vpype("color -l2 #ccc") vsk.stroke(3) vsk.penWidth(3, 3) for i, j in itertools.product(range(self.N + 1), range(self.M + 1)): vsk.point(i * delta, j * delta) vsk.vpype("color -l3 red")
def draw(self, vsk: vsketch.Vsketch) -> None: vsk.size("5x5cm", landscape=False, center=False) random.seed(vsk.random(1.0)) rays = tuple( Ray( random.randint(1, self.m + 1), random.randint(0, self.n), vsk.random(-0.2, 1.2), 3.0, 0.5, ) for _ in range(100)) time = self.frame / self.frame_count for ray in rays: for time_offset in (-1, 0, 1): start_pos = ((time + time_offset) - ray.start_time) * ray.speed * vsk.width vsk.stroke(ray.x) vsk.line( start_pos, ray.y / self.n * vsk.height, start_pos - ray.length * vsk.width, ray.y / self.n * vsk.height, ) vsk.vpype("crop 0 0 {vp_page_size[0]} {vp_page_size[1]}") vsk.vpype( f"pspread {5/self.m}cm perspective --hfov 100 --pan 90 --move 0 0 -1cm" ) vsk.vpype("lmove all 1")
def draw(self, vsk: vsketch.Vsketch) -> None: vsk.size("a6", landscape=True, center=False) vsk.scale("cm") address = ADDRESSES[self.addr_id].split("\n") if not self.address_only: vsk.line(8, 0.5, 8, 10) vsk.rect(12.5, 0.5, 1.8, 2.2) self.draw_text( vsk, HEADER.split("\n"), (0.5, 0.8), self.header_line_spacing, self.header_font_size, ) # deal with abbreviated first name name_line = address[0].split(" ") if len(name_line) > 2 and len(name_line[1]) > len(name_line[0]): name = name_line[1] else: name = name_line[0] self.draw_text( vsk, MESSAGE.replace("$FirstName$", name).split("\n"), (0.5, self.message_y_offset), self.message_line_spacing, self.message_font_size, ) self.draw_text( vsk, address, (8.5, self.address_y_offset), self.address_line_spacing, self.address_font_size, )
def draw(self, vsk: vsketch.Vsketch) -> None: vsk.size("10in", "10in") vsk.scale("3mm") i = 0 for i, prime in enumerate(get_primes(self.N)): vsk.circle(0, 0, 2 * (i + 1)) if self.random_phase: phase = np.random.random() * 2 * math.pi else: phase = -math.pi / 2 for angle in np.linspace(0, 2 * math.pi, prime, endpoint=False): vsk.line( (i + 1) * math.cos(angle + phase), (i + 1) * math.sin(angle + phase), (i + 2) * math.cos(angle + phase), (i + 2) * math.sin(angle + phase), ) vsk.circle(0, 0, 2 * (i + 2))