(B) As the sun comes up, the sky must change from black to cyan and the ground from dark gray to orange. It should be 320x240 but should be written so the size of the canvas is a variable.
I can only make the Canvas, other wise I'm lost. Any contributions, ideas would be helpful. Thank You!
Expand|Select|Wrap|Line Numbers
- import time
- def INT(N):
- return int(round(N))
- def Interpolate (N0,N1,T=0.5):
- return (N1 - N0) * float(T) + N0
- def InterpInt (N0,N1,T=0.5):
- return INT(Interpolate(N0,N1,T))
- def Parabola (N0,N1,N2,T=0.5):
- A = +2.0*N0 - 4.0*N1 + 2.0*N2
- B = -3.0*N0 + 4.0*N1 - N2
- C = N0
- return (A * T * T) + (B * T) + C
- def ParabolaInt (N0,N1,N2,T=0.5):
- return INT(Parabola(N0,N1,N2,T))
- def BlendPoints2D(P0,P1,T=0.5):
- X = InterpInt(P0[0],P1[0],T)
- Y = InterpInt(P0[1],P1[1],T)
- return [X,Y]
- def BlendPoints3D(P0,P1,T=0.5):
- X = InterpInt(P0[0],P1[0],T)
- Y = InterpInt(P0[1],P1[1],T)
- Z = InterpInt(P0[2],P1[2],T)
- return [X,Y,Z]
- def BlendColor(C0,C1,T=0.5):
- R = InterpInt(C0.getRed(), C1.getRed(), T)
- G = InterpInt(C0.getGreen(), C1.getGreen(), T)
- B = InterpInt(C0.getBlue(), C1.getBlue(), T)
- return makeColor(R,G,B)
- #--------------------------------------------------
- def BlendParabola2D(P0,P1,P2,T=0.5):
- X = ParabolaInt(P0[0],P1[0],P2[0],T)
- Y = ParabolaInt(P0[1],P1[1],P2[1],T)
- return [X,Y]
- def BlendParabola3D(P0,P1,P2,T=0.5):
- X = ParabolaInt(P0[0],P1[0],P2[0],T)
- Y = ParabolaInt(P0[1],P1[1],P2[1],T)
- Z = ParabolaInt(P0[2],P1[2],P2[2],T)
- return [X,Y,Z]
- #--------------------------------------------------
- def BlendParabolaColor(C0,C1,C2,T=0.5):
- R = ParabolaInt(C0.getRed(), C1.getRed(), C2.getRed(), T)
- G = ParabolaInt(C0.getGreen(), C1.getGreen(), C2.getGreen(), T)
- B = ParabolaInt(C0.getBlue(), C1.getBlue(), C2.getBlue(), T)
- return makeColor(R,G,B)
- def addCircleFilled (Canvas, Xc,Yc,R,NewColor=black):
- addOvalFilled(Canvas,INT(Xc-R),INT(Yc-R),INT(2*R+1),INT(2*R+1),NewColor)
- return
- def addEllipseFilled (Canvas, Xc,Yc,Rx,Ry,NewColor=black):
- addOvalFilled(Canvas,INT(Xc-Rx),INT(Yc-Ry),INT(2*Rx+1),INT(2*Ry+1),NewColor)
- return
- #--------------------------------------------------
- # These routines all use 2D points as arguments
- # instead of explicit X and Y values, while again
- # keeping in the same style as the built-in JES
- # routines. All routines in this category start
- # with the prefix "plot". Some directly map onto
- # JES routines, others implement new funtionality
- # (such as triangles and polygons).
- #--------------------------------------------------
- def plotLine (Canvas,P,Q,NewColor=black):
- addLine(Canvas,INT(P[0]),INT(P[1]),INT(Q[0]),INT(Q[1]),NewColor)
- return
- def plotRect (Canvas,P,Q,NewColor=black):
- addRect(Canvas,INT(P[0]),INT(P[1]),INT(Q[0]-P[0]+1),INT(Q[1]-P[1]+1),NewColor)
- return
- def plotRectFilled (Canvas,P,Q,NewColor=black):
- addRectFilled(Canvas,INT(P[0]),INT(P[1]),INT(Q[0]-P[0]+1),INT(Q[1]-P[1]+1),NewColor)
- return
- def plotOval (Canvas,P,Q,NewColor=black):
- addOval(Canvas,INT(P[0]),INT(P[1]),INT(Q[0]-P[0]+1),INT(Q[1]-P[1]+1),NewColor)
- return
- def plotOvalFilled (Canvas,P,Q,NewColor=black):
- addOvalFilled(Canvas,INT(P[0]),INT(P[1]),INT(Q[0]-P[0]+1),INT(Q[1]-P[1]+1),NewColor)
- return
- def plotCircleFilled (Canvas,Center,Radius,NewColor=black):
- addCircleFilled(Canvas,Center[0],Center[1],Radius,NewColor)
- return
- def plotTriangle(Canvas,P,Q,R,NewColor=black):
- plotLine(Canvas,P,Q,NewColor)
- plotLine(Canvas,Q,R,NewColor)
- plotLine(Canvas,R,P,NewColor)
- return
- def plotCenteredTriangle(Canvas,P,Radius,NewColor=black):
- Offset = sqrt(3)/2.0 * Radius
- P0 = [P[0], P[1]-Offset]
- P1 = [P[0]+Offset,P[1]+Radius/2.0]
- P2 = [P[0]-Offset,P[1]+Radius/2.0]
- plotTriangle(Canvas,P0,P1,P2,NewColor)
- return
- def plotCenteredPolygon(Canvas,P,Radius,Sides,NewColor=black):
- Step = 2 * pi / Sides
- Angle = 0.0
- Last = [P[0] + Radius, P[1]]
- for I in range(Sides):
- Angle = Angle + Step
- Next = [P[0] + Radius * cos(Angle), P[1] - Radius * sin(Angle)]
- plotLine(Canvas, Last, Next, NewColor)
- Last = Next
- return
- Origin = [0,0] # Global, 2D position on screen
- def Ortho(P3D):
- # Angle = 30.0 * pi / 180.0
- X = P3D[0]
- Y = P3D[1]
- Z = P3D[2]
- NewX = X + Z * 0.8660254
- NewY = -(Y + Z * 0.5)
- return [NewX,NewY]
- def add3D (P3D,Q3D):
- return [P3D[0]+Q3D[0],P3D[1]+Q3D[1],P3D[2]+Q3D[2]]
- def add2D (P2D,Q2D):
- return [P2D[0]+Q2D[0],P2D[1]+Q2D[1]]
- #--------------------------------------------------
- def SetOrigin (X,Y):
- global Origin
- Origin = [X,Y]
- return
- def Line3D (Canvas,P3D,Q3D,NewColor=black):
- global Origin
- plotLine(Canvas,add2D(Origin,Ortho(P3D)), add2D(Origin,Ortho(Q3D)), NewColor)
- return
- def Axes (Canvas,Size,Separation,Tic=5):
- Line3D(Canvas,[-Size,0,0],[+Size,0,0])
- Line3D(Canvas,[0,-Size,0],[0,+Size,0])
- Line3D(Canvas,[0,0,-Size],[0,0,+Size])
- N = 0
- while (N <= Size):
- Line3D(Canvas,[+N,0,-Tic],[+N,0,+Tic])
- Line3D(Canvas,[-N,0,-Tic],[-N,0,+Tic])
- Line3D(Canvas,[0,+N,-Tic],[0,+N,+Tic])
- Line3D(Canvas,[0,-N,-Tic],[0,-N,+Tic])
- Line3D(Canvas,[-Tic,0,+N],[+Tic,0,+N])
- Line3D(Canvas,[-Tic,0,-N],[+Tic,0,-N])
- N = N + Separation
- return
- def addCircleXY (Canvas, Center, Radius, NewColor=black):
- Steps = 60
- StepAngle = 2.0 * pi / Steps
- Last = [Center[0]+Radius, Center[1], Center[2]]
- for I in range(Steps):
- Angle = (I+1) * StepAngle
- X = Radius * cos(Angle)
- Y = Radius * sin(Angle)
- Current = [Center[0]+X,Center[1]+Y,Center[2]]
- Line3D(Canvas, Last, Current, NewColor)
- Last = Current
- return
- def addCircleXZ (Canvas, Center, Radius, NewColor=black):
- Steps = 60
- StepAngle = 2.0 * pi / Steps
- Last = [Center[0]+Radius, Center[1], Center[2]]
- for I in range(Steps):
- Angle = (I+1) * StepAngle
- X = Radius * cos(Angle)
- Y = Radius * sin(Angle)
- Current = [Center[0]+X,Center[1],Center[2]+Y]
- Line3D(Canvas, Last, Current, NewColor)
- Last = Current
- return
- def addCircleYZ (Canvas, Center, Radius, NewColor=black):
- Steps = 60
- StepAngle = 2.0 * pi / Steps
- Last = [Center[0], Center[1]+Radius, Center[2]]
- for I in range(Steps):
- Angle = (I+1) * StepAngle
- X = Radius * cos(Angle)
- Y = Radius * sin(Angle)
- Current = [Center[0],Center[1]+X,Center[2]+Y]
- Line3D(Canvas, Last, Current, NewColor)
- Last = Current
- return
- def addSimpleSphere (Canvas, Center, Radius, NewColor=black):
- addCircleXY(Canvas, Center, Radius, NewColor)
- addCircleXZ(Canvas, Center, Radius, NewColor)
- addCircleYZ(Canvas, Center, Radius, NewColor)
- return
- def addSphere (Canvas, Center, Radius, NewColor=black):
- Angle = -90.0
- while (Angle <= 90.0):
- Radians = Angle / 180.0 * pi
- NewRadius = Radius * cos(Radians)
- NewOffset = Radius * sin(Radians)
- NewCenter = add3D(Center, [NewOffset,0,0])
- addCircleYZ(Canvas, NewCenter, NewRadius, NewColor)
- NewCenter = add3D(Center, [0,NewOffset,0])
- addCircleXZ(Canvas, NewCenter, NewRadius, NewColor)
- NewCenter = add3D(Center, [0,0,NewOffset])
- addCircleXY(Canvas, NewCenter, NewRadius, NewColor)
- Angle = Angle + 15.0
- return
- def BounceSpheres():
- Canvas = makeEmptyPicture(640,480)
- SetOrigin(320,240)
- Radius = 30 # Radius of sphere
- Size = 100 # Size of cube
- Center = [5,7,-3] # Original center of sphere
- DeltaX = 3 # Change in X per step
- DeltaY = 7 # Change in X per step
- DeltaZ = 5 # Change in X per step
- Trails = [] # List of previous centers
- while (True):
- # Clear previous image
- setAllPixelsToAColor(Canvas,white)
- # Paint back "wall" of the cube
- Line3D(Canvas,[-Size,+Size,+Size],[+Size,+Size,+Size],gray)
- Line3D(Canvas,[-Size,-Size,+Size],[+Size,-Size,+Size],gray)
- Line3D(Canvas,[-Size,+Size,+Size],[-Size,-Size,+Size],gray)
- Line3D(Canvas,[+Size,+Size,+Size],[+Size,-Size,+Size],gray)
- # Plot the center of the cube and the current
- # position of the sphere.
- Axes(Canvas,10,10,2)
- addSphere(Canvas, Center, Radius, blue)
- # Plot the remaining edges of the cube.
- Line3D(Canvas,[-Size,+Size,-Size],[+Size,+Size,-Size],gray)
- Line3D(Canvas,[-Size,-Size,-Size],[+Size,-Size,-Size],gray)
- Line3D(Canvas,[-Size,+Size,-Size],[-Size,-Size,-Size],gray)
- Line3D(Canvas,[+Size,+Size,-Size],[+Size,-Size,-Size],gray)
- Line3D(Canvas,[-Size,-Size,-Size],[-Size,-Size,+Size],gray)
- Line3D(Canvas,[-Size,+Size,-Size],[-Size,+Size,+Size],gray)
- Line3D(Canvas,[+Size,-Size,-Size],[+Size,-Size,+Size],gray)
- Line3D(Canvas,[+Size,+Size,-Size],[+Size,+Size,+Size],gray)
- # Keep a list of upto the last 50 positions
- # of the sphere, then plot those positions
- # as a color spot, <R,G,B> color depending on
- # the <X,Y,Z> position.
- Trails = Trails + [center]
- if (len(Trails) > 50): Trails = Trails[1:len(Trails)]
- for P in Trails:
- Q = add2D(Origin,Ortho(P))
- RR = int(float(P[0]+Size)/float(2*Size)*255.0)
- GG = int(float(P[1]+Size)/float(2*Size)*255.0)
- BB = int(float(P[2]+Size)/float(2*Size)*255.0)
- plotCircleFilled(Canvas, Q, 3, makeColor(RR,GG,BB))
- # Update the position of the sphere,
- # bouncing off a wall as needed.
- Center = add3D(Center, [DeltaX,DeltaY,DeltaZ])
- if (abs(Center[0])+Radius > Size): DeltaX = -DeltaX
- if (abs(Center[1])+Radius > Size): DeltaY = -DeltaY
- if (abs(Center[2])+Radius > Size): DeltaZ = -DeltaZ
- # Display updated screen and hold.
- repaint(Canvas)
- time.sleep(0.01)
- return
- def Exercise2():
- Canvas = makeEmptyPicture(640,480)
- SetOrigin(320,240)
- addSimpleSphere(Canvas, [+100,10,0], 100, blue)
- show(Canvas)
- time.sleep(0.1)
- addSimpleSphere(Canvas, [+100,10,0], 50, blue)
- repaint(Canvas)
- time.sleep(0.1)
- addSimpleSphere(Canvas, [+100,10,0], 40, red)
- repaint(Canvas)
- addSimpleSphere(Canvas, [+100,10,0], 30, green)
- addSimpleSphere(Canvas, [+100,10,0], 20, orange)
- addSimpleSphere(Canvas, [-100,0,0], 50, blue)
- repaint(Canvas)
- return
- def TraceParabola():
- Canvas = makeEmptyPicture(640,480)
- SetOrigin(getWidth(Canvas)/2,getHeight(Canvas)/2)
- Center = [0,0,0]
- P0 = [-90,40,80]
- P1 = [10,-50,10]
- P2 = [90,70,60]
- Steps = 100
- Points = [P0]
- MyStyle = makeStyle(serif, bold+italic, 24)
- for I in range(Steps):
- setAllPixelsToAColor(Canvas,white)
- T = float(I)/(Steps-1)
- P = BlendParabola3D(P0,P1,P2,T)
- X = P[0]
- Y = P[1]
- Z = P[2]
- Points = Points + [P]
- Line3D(Canvas, [X,0,0], [X,0,Z], red)
- Line3D(Canvas, [X,Y,Z], [X,0,Z], red)
- Line3D(Canvas, [0,0,Z], [X,0,Z], red)
- Last = Points[0]
- for P in Points:
- Line3D(Canvas, Last, P, blue)
- Last = P
- Axes(Canvas,200,200,2)
- plotCircleFilled(Canvas, add2D(Origin,Ortho(P0)), 3, green)
- plotCircleFilled(Canvas, add2D(Origin,Ortho(P1)), 3, green)
- plotCircleFilled(Canvas, add2D(Origin,Ortho(P2)), 3, green)
- addTextWithStyle(Canvas, 10, getHeight(Canvas)-10, "P = <" + str(P[0]) + "," + str(P[1]) + "," + str(P[2]) + ">", MyStyle)
- repaint(Canvas)
- time.sleep(0.3)
- return