import turtle
import math

class Line:    
    def __init__(self, Point1,Point2):
        self.Point1 = Point1
        self.Point2 = Point2


myTurtle = turtle.Turtle()
#edit the scale to make the overall image bigger or smaller
scale = 1500
#edit fractal count to increase or decrease the amount of transformations performed
fractalCount = 1

def DrawLine(Point1, Point2):
    myTurtle.penup()
    myTurtle.goto(ReturnX(Point1[0]),ReturnY(Point1[1]))
    myTurtle.pendown()
    myTurtle.goto(ReturnX(Point2[0]),ReturnY(Point2[1]))

def ReturnX(x):
    return (x - 1/2) * scale

def ReturnY(y):
    return y * scale - scale / 10

def Transformation1(Point):
    newX = (1/3)*math.cos(math.radians(0))*Point[0] - (1/3)*math.sin(math.radians(0))*Point[1]
    newY = (1/3)*math.sin(math.radians(0))*Point[0] + (1/3)*math.cos(math.radians(0))*Point[1]
    return (newX,newY)

def Transformation2(Point):
    newX = (1/3)*math.cos(math.radians(60))*Point[0] - (1/3)*math.sin(math.radians(60))*Point[1] + (1/3)
    newY = (1/3)*math.sin(math.radians(60))*Point[0] + (1/3)*math.cos(math.radians(60))*Point[1]
    return (newX,newY)

def Transformation3(Point):
    newX = (1/3)*math.cos(math.radians(-60))*Point[0] - (1/3)*math.sin(math.radians(-60))*Point[1] + (1/2)
    newY = (1/3)*math.sin(math.radians(-60))*Point[0] + (1/3)*math.cos(math.radians(-60))*Point[1] + (math.sqrt(3)/6)
    return (newX,newY)

def Transformation4(Point):
    newX = (1/3)*math.cos(math.radians(0))*Point[0] - (1/3)*math.sin(math.radians(0))*Point[1] + (2/3)
    newY = (1/3)*math.sin(math.radians(0))*Point[0] + (1/3)*math.cos(math.radians(0))*Point[1]
    return (newX,newY)


turtle.tracer(0,0)
myTurtle.speed('fastest')
lines = [Line((0.0,0.0),(1.0,0.0))]
transformations = (Transformation1,Transformation2,Transformation3,Transformation4)

for x in range (fractalCount):
    newLines = []
    for line in lines:
        for Transformation in transformations:
            newLines.append(Line(Transformation(line.Point1),Transformation(line.Point2)))

    lines = newLines

myTurtle.color("red")
myTurtle.pensize(1)
for line in lines:
    DrawLine(line.Point1,line.Point2)

turtle.update()
turtle.exitonclick()
