- from graphics import *
- import math
- from math import *
- import random
- from random import *
- def buildWindow():
- win=GraphWin("Random Race", 500, 600)
- xAxis=Line(Point(250,0),Point(250,500)) #axes
- xAxis.setWidth(2)
- xAxis.draw(win)
- yAxis=Line(Point(0,250),Point(500,250))
- yAxis.setWidth(2)
- yAxis.draw(win)
- Line(Point(150,0),Point(150,500)).draw(win) #other lines
- Line(Point(50,0),Point(50,500)).draw(win)
- Line(Point(350,0),Point(350,500)).draw(win)
- Line(Point(450,0),Point(450,500)).draw(win)
- Line(Point(0,150),Point(500,150)).draw(win)
- Line(Point(0,50),Point(500,50)).draw(win)
- Line(Point(0,350),Point(500,350)).draw(win)
- Line(Point(0,450),Point(500,450)).draw(win)
- rectangle=Rectangle(Point(5,500),Point(495,595)) #information box
- rectangle.setFill("Yellow")
- rectangle.draw(win)
- Text(Point(220,515),"Step #").draw(win) #box labels
- Text(Point(80,535),"Red distance = ").draw(win)
- Text(Point(320,535),"Red maximum distance = ").draw(win)
- Text(Point(80,555),"Green distance = ").draw(win)
- Text(Point(320,555),"Green maximum distance = ").draw(win)
- return win
- def generateData():
- change=uniform(0,2*math.pi) #get the random change
- y=5*math.sin(change) #get the y change
- x=5*math.cos(change) #get the x change
- return x, y
- def distToOrigin(p): #calculate distance to origin from particular point
- dx=p.x-250
- dy=p.y-250
- return sqrt((dx*dx)+(dy*dy))
- def main():
- win=buildWindow()
- red=Point(250,250) #create starting points
- green=Point(250,250)
- redMaxDistance=0 #track max distances
- greenMaxDistance=0
- stepLabel=Text(Point(260,515),"0") #great label text
- redDistLabel=Text(Point(170,535),"0")
- redMaxLabel=Text(Point(450,535),"0")
- greenDistLabel=Text(Point(170,555),"0")
- greenMaxLabel=Text(Point(450,555),"0")
- for i in range(0,501):
- xChRe,yChRe=generateData() #get random changes
- newRed=Point(red.x+xChRe,red.y+yChRe) #get new point
- redLine=Line(red,newRed) #link old point and new point
- redLine.setFill("Red")
- redLine.draw(win)
- red=newRed #set new point as old point for next run
- xChGr,yChGr=generateData() #same as for red
- newGreen=Point(green.x+xChGr,green.y+yChGr)
- greenLine=Line(green,newGreen)
- greenLine.setFill("Green")
- greenLine.draw(win)
- green=newGreen
- stepLabel.undraw() #update step number
- stepLabel.setText(str(i))
- stepLabel.draw(win)
- redDist=round(distToOrigin(red),3) #get distances
- greenDist=round(distToOrigin(green),3)
- redDistLabel.undraw() #update distances
- redDistLabel.setText(str(redDist))
- redDistLabel.draw(win)
- greenDistLabel.undraw()
- greenDistLabel.setText(str(greenDist))
- greenDistLabel.draw(win)
- if(redDist>redMaxDistance): #update max distances if applicable
- redMaxDistance=redDist
- redMaxLabel.undraw()
- redMaxLabel.setText(str(redDist))
- redMaxLabel.draw(win)
- if(greenDist>greenMaxDistance):
- greenMaxDistance=greenDist
- greenMaxLabel.undraw()
- greenMaxLabel.setText(str(greenDist))
- greenMaxLabel.draw(win)
- Text(Point(250,580),"Click to close window").draw(win)
- win.getMouse()
- win.close()
- if __name__ == '__main__':
- main()
