# example based on article in BYTE magazine
# Problem Solving with Logo: Using Turtle Graphics to Redraw a Design
# November 1982
# p. 118 - 134

from tWrapper import tWrapper

# wrapper for any additional drawing routines
# that need to know about each other
class turtleWrapper(tWrapper):
    def design(self):
        self.pu()
        for i in range(5):
            self.fd(64.65)
            self.pd()
            self.wheel(self.getXY())
            self.pu()
            self.bk(64.65)
            self.rt(72)
        self.pu(); self.home(); self.rt(36); self.fd(24.5); self.rt(198); self.pd()
        self.centerpiece(46, 143.4)

    def wheel(self, initpos):
        self.rt(54)
        for i in range(4): self.pentpiece(initpos)
        self.pd(); self.lt(36)
        for i in range(5): self.tripiece(initpos)
        self.lt(36)
        for i in range(5):
            self.pd()
            self.rt(72)
            self.fd(28)
            self.pu()
            self.bk(28)
        self.lt(54)

    def tripiece(self, initpos):
        oldh = self.getHeading()
        self.pd(); self.bk(2.5)
        self.tripolyr(31.5)
        self.pu(); self.setXY(initpos); self.setHeading(oldh)
        self.pd(); self.bk(2.5)
        self.tripolyl(31.5)
        self.pu(); self.setXY(initpos); self.setHeading(oldh)
        self.lt(72)

    def pentpiece(self, initpos):
        oldh = self.getHeading()
        self.pu(); self.fd(29); self.pd()
        for i in range(5):
            self.fd(18)
            self.rt(72)
        self.pentr(18, 75)
        self.pu(); self.setXY(initpos); self.setHeading(oldh)
        self.fd(29); self.pd()
        for i in range(5):
            self.fd(18)
            self.rt(72)
        self.pentl(18, 75)
        self.pu(); self.setXY(initpos); self.setHeading(oldh)
        self.lt(72)

    def pentl(self, side, ang):
        if side < 2: return
        self.fd(side)
        self.lt(ang)
        self.pentl(side - .38, ang)

    def pentr(self, side, ang):
        if side < 2: return
        self.fd(side)
        self.rt(ang)
        self.pentr(side - .38, ang)

    def tripolyr(self, side):
        if side < 4: return
        self.fd(side)
        self.rt(111)
        self.fd(side / 1.78)
        self.rt(111)
        self.fd(side / 1.3)
        self.rt(146)
        self.tripolyr(side * .75)

    def tripolyl(self, side):
        if side < 4: return
        self.fd(side)
        self.lt(111)
        self.fd(side / 1.78)
        self.lt(111)
        self.fd(side / 1.3)
        self.lt(146)
        self.tripolyl(side * .75)
        
    def centerpiece(self, s, a):
        self.fd(s); self.lt(a)
        if s < 7.5: return
        self.centerpiece(s - 1.2, a)

def drawMain(dc_local, w, turtleWrapper=turtleWrapper):
    t = turtleWrapper(dc_local)
    t.cls()

    t.design()
