03 Mathematical Expressions in Alice

advertisement
Mathematical Expressions in Alice
Some of the information about an Alice world, and its objects, is stored in properties. In general, only
the properties used in setting up the world (e.g., color or opacity) are listed. There are many other
properties (such as height, width, and position) that are very useful, particularly as our program
executes.
In order to make use of these other properties, Alice provides functions, which are programming
statements that can be used to ask questions about various properties of objects (e.g., height and
width), as well as relationships between objects (e.g., distance between objects).
When the built-in functions do not provide the answers you need, it is also possible to form
mathematical expressions that allow the programmer to refine their answer. These mathematical
expressions can be used with functions or user input to provide necessary details for the animation of
your program.
Mathematical Expressions
You are probably familiar with mathematical expressions from math class, where you use algorithms
to perform calculations. Examples are calculations of the slope of a line, or the area of a circle. The
most common mathematical operations are addition, subtraction, multiplication, and division. Most
(perhaps all) programming languages, including Alice, provide a variety of mathematical operators,
including the basic operators shown in the following table.
Operator
Description
+
Addition
-
Subtraction
*
Multiplication
/
Division
For example, consider a simple calculation that relates the diameter of a circle to the radius. You may
recall that the mathematical relationship is radius = diameter / 2.
Page 1 of 5
Mathematical Expressions in Alice
To perform this simple operation in Alice, we will need:
1. Variables to store the values for diameter and radius.
2. User input to provide the diameter of the circle.
3. A mathematical expression to calculate the radius from the given diameter.
As you can see, we have created our variables (diameter, radius), and initialized them to both have
values of zero. Although Alice, by default, initializes numeric values to one, it is a better programming
practise to initialize numeric values to zero.
Since a diameter of zero isn't very interesting, the user is asked to enter a value (number) for the
diameter. We have also set the radius equal to the diameter, but this isn't the correct calculation. This
was simply the starting point.
In the “set value to” operation, click on the
diameter to see additional options. There is a
“Math” option, which shows mathematical
operations that can be performed on diameter. We
want to divide diameter by something, so choose
the “diameter /”, and set the value to 2 (i.e., divide
diameter by 2).
Unfortunately, this program doesn't actually do
anything useful, but we have looked at the way to
use mathematical expressions in our program.
Page 2 of 5
Mathematical Expressions in Alice
Exercise 1 – Using Math to Avoid Collisions
In graphics programming, a collision is when two graphical objects come into contact with each other.
Quite often, the objects will continue and pass through each other, or end up occupying the same
space. Here you will create an Alice world where one object moves to another object but does not
collide with it.
Consider the following problem: “A snowman and a snowWoman are standing, facing in the same
direction. The snowman turns to face the snowWoman, and then the snowWoman turns to face the
snowman. The snowman moves to the snowWoman and stops just in front of her. He engages her in
a conversation”
A simple design, using pseudocode, might look like:
snowman turns to face snowWoman
snowWoman turns to face snowman
snowman moves forward to the front of the snowWoman
snowman says something
snowWoman says something
The majority of this program contains concepts you are already familiar with. The real issue is the
move instruction, shown in blue. As a first attempt, our Alice instruction would probably look like the
one shown below.
Unfortunately, this movement will result in a collision, where the snowman and snowWoman are
completely overlapping each other.
Since there doesn't seem to be a better primitive function to use, we will need to create a
mathematical expression to refine our result. The problem is that the distance to function
calculates and returns the distance between the centres of the objects. We need to calculate the
distance between the front of the snowman and the front of the snowWoman.
Page 3 of 5
Mathematical Expressions in Alice
distance between centres
snowman
depth
snowWoman
depth
From our simple diagram, the unwanted distance is related to the depth (front-to-back distance) for
the snowman and snowWoman. If we can account for this, the movement should occur without a
collision. To make things a bit easier (for now), we will notice that the depth of each figure is
approximately the same, so instead of using half of each, we will simply use the full depth of one of
them. The snowWoman seems to be slightly larger, so we'll use that one just to be on the safe side.
Our new code will subtract the depth of the snowWoman from the distance between them. Now that
our distance is getting complicated, it's probably a good idea to use a variable to store the distance
between the snowPeople.
1. Create a new Alice world using the snow template. Add an instance of the Snowman class
and the SnowWoman class (both from the People collection).
2. Create a variable named distance
that is of type Number. Set the
initial value to zero.
3. Create the instructions as shown.
Since the distance variable is
initialized to zero, the snowman
won't move when you run the
program.
4. Now we will add the distance calculation using a mathematical expression. Drag the distance
variable between the second and third lines in the code.
a) Start by setting the distance to the distance between their centres.
Page 4 of 5
Mathematical Expressions in Alice
b) Perform the subtraction operation by using the menu on the set value to instruction. You
will need to use a default value for now (zero is suggested).
click here
c) Replace the default value from step (b) with the depth of the snowWoman, which is another
function from the snowWoman object.
5. Play the world. The snowman should move close to the snowWoman, but they should not be
touching. Try moving the snowman and snowWoman to random locations and ensure the
program still works.
Save your program as snowmanDistance.a2w
Page 5 of 5
Download