示例#1
0
    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")
示例#2
0
    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)
示例#3
0
    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")