示例#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("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")
示例#3
0
    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,
        )
示例#4
0
    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))