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("a6", landscape=self.orient == "landscape") vsk.penWidth(self.pen_width) for j in range(self.num_y): for i in range(self.num_x): if self.mapping == "grad": amt = j / self.num_y color_prob = 1.0 elif self.mapping == "double_grad": amt = abs(j - self.num_y / 2) / self.num_y * 2 color_prob = 1.0 elif self.mapping == "double_grad_inside": amt = 1.0 - abs(j - self.num_y / 2) / self.num_y * 2 color_prob = 1.0 elif self.mapping == "crossover": amt = 1.0 - abs(j - self.num_y / 2) / self.num_y * 2 color_prob = (j / self.num_y - 0.5) * 1.2 + 0.5 elif self.mapping == "circular": amt = 1 - math.hypot(i - self.num_x / 2, j - self.num_y / 2) / max(self.num_x, self.num_y) color_prob = 1.0 elif self.mapping == "circular_crossover": amt = 1 - math.hypot(i - self.num_x / 2, j - self.num_y / 2) / max(self.num_x, self.num_y) color_prob = (j / self.num_y - 0.5) * 1.2 + 0.5 elif self.mapping == "diagonal": amt = 1.0 - abs(1.0 - i / self.num_x - j / self.num_y) color_prob = 1.0 elif self.mapping == "diagonal_crossover": amt = 1.0 - abs(1.0 - i / self.num_x - j / self.num_y) color_prob = vsk.lerp( -0.2, 1.2, (i / self.num_x + j / self.num_y) / 2) elif self.mapping == "stripes": color_prob = math.floor(i / self.num_x * 9) % 2 amt = j / self.num_y if color_prob == 1: amt = 1 - amt elif self.mapping == "circle_grad": if math.hypot(i - self.num_x / 2, j - self.num_y / 2) > 0.4 * min(self.num_x, self.num_y): color_prob = 1.0 amt = j / self.num_y else: color_prob = 0.0 amt = vsk.lerp(-0.5, 1.5, 1 - j / self.num_y) else: raise NotImplementedError prob = vsk.lerp(self.hi_density, self.lo_density, amt) if vsk.random(1.0) < color_prob: vsk.stroke(1) else: vsk.stroke(2) if vsk.random(1.0) < prob: vsk.point(i * self.pitch, j * self.pitch)
def draw(self, vsk: vsketch.Vsketch) -> None: vsk.size("a4", landscape=False) vsk.scale("1mm") with vsk.pushMatrix(): for _ in range(40): vsk.rotate(2, degrees=True) vsk.scale(0.95) vsk.point(-75, 75) vsk.point(0, 75) vsk.point(75, 75) vsk.point(75, 0) vsk.point(75, -75) vsk.point(0, -75) vsk.point(-75, -75) vsk.point(-75, 0) with vsk.pushMatrix(): vsk.rotate(80, degrees=True) vsk.scale(0.95**40) vsk.square(0, 0, 150, mode="center")