Assignment 2: Moving rockets

This assignment is due on Wednesday, 8/29 at 11:59 PM. Submit it using the handin server as assignment a2. Your submission is only accepted if the message "Handin successful" appears.

Let’s use what we’ve learned to animate a rocket launch.

We’ll solve this problem in two parts, horizontal and vertical, then combine them. The examples we animated in class and in the textbook prologue can guide us to solve both parts of the problem. This divide-and-conquer approach is possible because force applied along one axis to a moving body only affects motion along that axis and not any other axis. So the horizontal motion of a rocket is decoupled from its vertical motion, and we can write down two completely independent equations. Only the equation governing vertical motion involves gravity.

First make sure that you require the 2htdp/image and 2htdp/universe libraries.

Exercise 1 Your program will animate a rocket fired with an initial speed init-speed and initial angle to the horizontal init-angle.

Define init-speed and init-angle as program variables. Use an initial speed of 1 and an initial angle of pi/4 to start. Once your program is running, you should try using different values to see how your animation behaves. Note here that we are using an angle specified in radians.

Exercise 2 Since only the initial speed will be specified, you will need to calculate the x and y components of the initial velocity. These may be calculated via

init-x-vel = init-speed * cos(init-angle)

init-y-vel = init-speed * sin(init-angle)

Define the initial horizontal velocity init-x-vel and the initial vertical velocity init-y-vel using the initial speed init-speed and the initial angle init-angle. We define the initial speed and velocity components (horizontal and vertical) as numbers rather than functions because they do not change over time.

Exercise 3 The rocket experiences a gravitational acceleration in the vertical direction. Therefore, the vertical position (height) of the rocket is this function of the time t:

height = init-y-vel * t - 1/2 * 0.002 * t * t

where init-y-vel is the initial velocity in the vertical direction, and 0.002 is the gravitational acceleration, which is a constant.

Design a function y-pos which calculates the vertical position (height) as a function of time t. Test your new function to make sure that (y-pos 0) produces 0.

Exercise 4 The rocket does not experience any acceleration in the horizontal direction. Therefore, it has constant horizontal velocity, and the horizontal position is a simpler function of the time t:

horizontal position = init-x-vel * t

where init-x-vel is the initial velocity in the horizontal direction.

Design a function x-pos that calculates the horizontal position as a function of time t. Test your new function to make sure that (x-pos 0) produces 0.

Exercise 5 Design a function draw-sprite that draws a scene with a ’sprite’ on it. This function should be called draw-sprite and take two inputs, the horizontal position and the height. The term ’sprite’ is commonly used in computer graphics to refer to a small image that moves around. You may use any small image of your choice, such as a small circle, or even the rocket image. Remember, the 2htdp/image library specifies the Y position from the top down, and the height you calculated above specifies the vertical position starting at the bottom, so you will need to convert your calculated height into a Y position that the place-image function can understand. This conversion can be performed as follows:

image-y = scene-height - h

where scene-height is the height of your scene, and h is the vertical position (height) starting at the bottom. You should use the place-image to place an image on a scene that you create using empty-scene. A scene size of 500 wide by 200 tall should work well for the numbers provided here. It may be useful to test out your sprite drawing function using the interaction window.

Test your new function to make sure that (draw-sprite 0 0) produces an image that places the rocket in the lower-left corner. Also test that (draw-sprite 20 50) produces an image that places the rocket above the lower-left corner and a little bit to the right.

Exercise 6 Finally, combine all of these functions together into a single function launch that draws an image at the correct horizontal and vertical positions, as a function of time t.

Your definition of launch should not mention multiplication (*) or subtraction (-) directly anywhere. Test it to make sure that (launch 0) produces an image that places the rocket in the lower-left corner.

Use your launch function with the animate we discussed in class to produce an animation of a rocket launching with an initial angle to the horizontal and an initial speed.

You should see your rocket starting off at the lower left. It should then move up and right, and eventually, it should fall, but continue moving right, and eventually move off your scene.