kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

ALDS1_5_C:Koch Curve

まずは自力で2次元ベクトルのクラスを作ってみる
add, sub, scaleを演算子オーバーロードで書いてみるテスト
ただしこの問題が解ける最低限で

from math import pi, sin, cos

class Point2D():

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, p):
        return Point2D(self.x + p.x, self.y + p.y)

    def __sub__(self, p):
        return Point2D(self.x - p.x, self.y - p.y)

    def __rmul__(self, a):
        if isinstance(a, float):
            return Point2D(self.x * a, self.y * a)
        else:
            return NotImplemented
    
    def rotate(self, theta):
        return Point2D(self.x * cos(theta) - self.y * sin(theta),
                       self.x * sin(theta) + self.y * cos(theta))

    def __str__(self):
        return "{} {}".format(self.x, self.y)

def koch(p1, p2, level):
    if level == 0:
        return
    l = p2 - p1
    s = p1 + (1/3) * l
    t = p1 + (2/3) * l
    u = s + (1/3) * l.rotate(pi/3)
    koch(p1, s, level - 1)
    print(s)
    koch(s, u, level - 1)
    print(u)
    koch(u, t, level - 1)
    print(t)
    koch(t, p2, level - 1)

def main():
    n = int(input())
    print(Point2D(0.0, 0.0))
    koch(Point2D(0.0, 0.0), Point2D(100.0, 0.0), n)
    print(Point2D(100.0, 0.0))

main()

おk

ていうかきっとライブラリがあるだろう
・・・numpyてやつ使わないとそれっぽくない?
複素数でも使うか

from math import pi
from cmath import rect

def print_xy(z):
    print(z.real, z.imag)

def koch(p1, p2, level):
    if level == 0:
        return
    l = p2 - p1
    s = p1 + (1/3) * l
    t = p1 + (2/3) * l
    u = s + (1/3) * l * rect(1, pi/3)
    koch(p1, s, level - 1)
    print_xy(s)
    koch(s, u, level - 1)
    print_xy(u)
    koch(u, t, level - 1)
    print_xy(t)
    koch(t, p2, level - 1)

def main():
    n = int(input())
    print_xy(0+0j)
    koch(0+0j, 100+0j, n)
    print_xy(100+0j)

main()