ࡱ> &(#$%q` VbjbjqPqP J/:: $$$$$$$8 j j j8Xjj$8 lnnnno>oo $+hRД$opio"oopopД$$nnaQopp $n$nopV\@$$nl c96 jy Βg0T4$Ɛoo p pXoooДД/Xoooopopopop888;>> print range(0, 6) [0, 1, 2, 3, 4, 5] So we could have constructed the for loop as follows: for i in range(0, 6): print "i now equal to:", i sumsquares = sumsquares + i**2 # etc. Here is another example of the use of range(): >>> print range(5, 10) [5, 6, 7, 8, 9] If you are uncertain what parameters to give range() to get it to execute your for loop the required number of times, just find the difference between the first and second parameters. This is then the number of times the contents of the for loop will be executed. You may also specify the step, i.e. the difference between successive items. As we have seen above, if you do not specify the step the default is one. >>> print range(10, 20, 2) [10, 12, 14, 16, 18] Note that this goes up to 18, not 19, as the step is 2. You can always get the number of elements the list produced by range() will contain (and therefore the number of times the for loop will be executed) by finding the difference between the first and second parameters and dividing that by the step. For example range(10, 20, 2) produces a list with 5 elements since  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img5.gif" \* MERGEFORMATINET . The range function will only produce lists of integers. If you want to do something like print out the numbers from 0 to 1, separated by 0.1 some ingenuity is required: for i in range(0, 10): print i / 10 EXERCISE Use the range function to create a list containing the numbers 4, 8, 12, 16, and 20. Write a program to read a number from the keyboard and then print a ``table'' (don't worry about lining things up yet) of the value of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img6.gif" \* MERGEFORMATINET and 1/x from 1 up to the number the user typed, in steps of, say, 2. 1.3 Nested Loops: In class we talked about the normal distribution. This distribution is generated when there are random uncorrelated events. If we want to flip 50 coins, 50 times we might use code that looks something like this: from random import random times = 100 flips = 100 for i in range(times): heads = 0 for n in range(flips): if random() > 0.5: heads = heads + 1 print heads EXERCISE Write a program to read a pair of numbers from the keyboard and then calculate the factorial of each of the numbers between those two numbers. Your program should display the factorials on the screen. 2. else and elif statements else and elif statements allow you to test further conditions after the condition tested by the if statement and execute alternative statements accordingly. They are an extension to the if statement and may only be used in conjunction with it. If you want to execute some alternative statements if an if test fails, then use an else statement as follows: if [condition]: [Some statements executed only if [condition] is true] else: [Some statements executed only if [condition] is false] [rest of program] If the first condition is true the indented statements directly below it are executed and Python jumps to [rest of program] Otherwise the nested block below the else statement is executed, and then Python proceeds to [rest of program]. The elif statement is used to test further conditions if (and only if) the condition tested by the if statement fails: x = input("Enter a number") if 0 <= x <= 10: print "That is between zero and ten inclusive" elif 10 < x < 20: print "That is between ten and twenty" else: print "That is outside the range zero to twenty" 3 Using library functions Python contains a large library of standard functions which can be used for common programming tasks. You can also create your own (see Section ``Making Functions''). A function is just some Python code which is separated from the rest of the program. This has several advantages: Repeated sections of code can be re-used without rewriting them many times, making your program clearer. Furthermore, if a function is separated from the rest of the program it provides a conceptual separation for the person writing it, so they can concentrate on either the function, or the rest of the program. Python has some built-in functions, for example type() and range() that we have already used. These are available to any Python program. To use a function we call it. To do this you type its name, followed by the required parameters enclosed in parentheses. Parameters are sometimes called arguments, and are similar to arguments in mathematics. In math, if we write sin(p/4), we are using the sin function with the argument p/4. Functions in computing often need more than one variable to calculate their result. These should be separated by commas, and the order you give them in is important. Refer to the discussion of the individual functions for details. Even if a function takes no parameters (you will see examples of such functions later), the parentheses must be included. However, the functions in the library are contained in separate modules, similar to the ones you have been writing and saving in the editor so far. In order to use a particular module, you must explicitly import it. This gives you access to the functions it contains. The most useful module for us is the math library. If you want to use the functions it contains, put the line from math import * at the top of your program. The math functions are then accessible in the same way as the built in functions. For example, to calculate the sin and cos of p/3 we would write a module like this: from math import * mynumber = pi / 3 print sin(mynumber) print cos(mynumber) The math module contains many functions, the most useful of which are listed below. Remember that to use them you must from math import *. FunctionDescriptionsqrt( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Returns the square root of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET exp( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Return  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img15.gif" \* MERGEFORMATINET log( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Returns the natural log, i.e.  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img16.gif" \* MERGEFORMATINET log10( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Returns the log to the base 10 of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET sin( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Returns the sine of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET cos( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Return the cosine of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET tan( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Returns the tangent of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET asin( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Return the arc sine of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET acos( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Return the arc cosine of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET atan( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Return the arc tangent of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET fabs( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Return the absolute value, i.e. the modulus, of  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET floor( INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img14.gif" \* MERGEFORMATINET )Rounds a float down to its integerThe math library also contains two constants: pi,  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img4.gif" \* MERGEFORMATINET , and e,  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img17.gif" \* MERGEFORMATINET . These do not require parentheses (see the above example). Note the floor function always rounds down which can produced unexpected results! For example >>> floor(-1.01) -4.0 EXERCISE Use the math library and the vpython curve function to write a program to generate a sphere. 4 Arrays The elements of a list can, in principle, be of different types, e.g. [1, 3.5, "boo!"]. This is sometimes useful but, as scientists you will mostly deal with arrays. These are like lists but each element is of the same type (either integers or floats). This speeds up their mathematical manipulation by several orders of magnitude. Arrays are not a ``core'' data type like integers, floating points and strings. In order to have access to the array type we must import the Numeric library. This is done by adding the following line to the start of every program in which arrays are used: from Numeric import * The visual library imports the Numeric library so you do not need that line if you are writing a Vpython program. >>> from Numeric import * >>> xx = array([1, 5, 6.5, -11]) >>> print xx [ 1. 5. 6.5 -11. ] The square brackets within the parentheses are required. You can call an array anything you could call any other variable. The decimal point at the end of 1, 5 and -11 when they are printed indicates they are now being stored as floating point values; all the elements of an array must be of the same type and we have included 6.5 in the array so Python automatically used floats. We can extend the box analogy used to describe variables in Section  HYPERLINK "http://www.pentangle.net/python/handbook/node19.html" \l "Elements:Variables" 1.2 to arrays. An array is a box too, but within it are smaller, numbered boxes. Those numbers start at zero, and go up in increments of one. Arrays can be thought of as boxes around boxesThis simplifies the program--there need not be very many differently named variables. More importantly it allows the referencing of individual elements by offset. By referencing we mean either getting the value of an element, or changing it. The first element in the array has the offset [0] (n.b. not 1). The individual element can then be used in calculations like any other float or integer variable The following example shows the use of referencing by offset using the array created above: >>> print xx [ 1. 5. 6.5 -11. ] >>> print xx[0] 1.0 >>> print xx[3] -11.0 >>> print range(xx[1]) # Using the element just like any other variable [0, 1, 2, 3, 4] >>> xx[0] = 66.7 >>> print xx [ 66.7 5. 6.5 -11. ] Let's consider an example. The user has five numbers representing the number of counts made by a Geiger-Muller tube during successive one minute intervals. The following program will read those numbers in from the keyboard. and store them in an array. from Numeric import * counts = zeros(5, Int) # See below for an explanation of this for i in range(0, 5): print "Minute number", i response = input("Give the number of counts made in the minute") counts[i] = response print "Thank you" The contents of the for loop are executed five times (see Section ``Using the range function'' if you are unsure). It asks the user for the one minute count each time. Each response is put into the counts array, at the offset stored in i (which, remember, will run from 4 to sin (2pi/100)). The new thing in this example is the zeros function. You cannot get or change the value of an element of an array if that element does not exist. For example, you cannot change the 5th element of a two element array: >>> xx = array([3, 4]) >>> xx[4] = 99 Traceback (most recent call last): File "", line 1, in ? xx[4] = 99 IndexError: index out of bounds Contrast this with numbers (floats and integers) and strings. With these assigning to the variable creates it. With arrays Python must first know how many elements the variable contains so it knows where to put things, i.e. ``how many boxes are inside the box''. This means we must create an empty five element array before we can start storing the Geiger-Muller counts in it. We could do this by writing counts = array(0, 0, 0, 0, 0) but this would quickly get tedious if we wanted a bigger array. Instead we do it with the zeros() function. This takes two parameters, separated by a comma. The first is the number of elements in the array. The second is the type of the elements in the array (remember all the elements are of the same type). This can be Int or Float (Note the upper case ``I'' and ``F'' -- this is to distinguish them from the float() and int() functions discussed in Section ``File input and output''). In the Geiger-Muller example we created an array of type Int because we knew in advance that the number of counts the apparatus would make would necessarily be a whole number. Here are some examples of zeros() at work: >>> xx = zeros(5, Int) >>> print xx [0 0 0 0 0] >>> yy = zeros(4, Float) >>> print yy [ 0. 0. 0. 0.] If there is any uncertainty as to whether Int or Float arrays are appropriate then use Float. Note: Python has both arrays and lists. Arrays have all elements of the same type, where lists can have objects of different types, IE strings, integers etc. EXERCISE Using for loops, range(), and the zeros() function, construct two 100 element arrays, such that element i of one array contains cos (2pi/100) and the corresponding element of the other contains sin (2pi/100). Compute the scalar (i.e. dot) products of the two arrays, to check that sin and cos are orthogonal, i.e. their dot product is zero. The scalar, or dot, product is defined as:  5 Making your own functions As we saw earlier, functions are very useful tools for making your programs more concise and modular. The libraries provide a useful range of facilities but a programmer will often want or need to write their own functions if, for example, one particular section of a program is to be used several times, or if a section forms a logically complete unit. Functions must be defined before they are used, so we generally put the definitions at the very top of a program. Here is a very simple example of a function definition that returns the sum of the two numbers it is passed: >>> def addnumbers(x, y): sum = x + y return sum >>> x = addnumbers(5, 10) >>> print x 15 The structure of the definition is as follows: The top line must have a def statement: this consists of the word def, the name of the function, followed by parentheses containing the names of the parameters passed as they will be referred to within the function. Then an indented code block follows. This is what is executed when the function is called, i.e. used. Finally the return statement. This is the result the function will return to the program that called it. If your function does not return a result but merely executes some statements then it is not required. If you change a variable within a function that change will not be reflected in the rest of the program. For example: >>> def addnumbers(x, y): sum = x + y x = 1000 return sum >>> x = 5 >>> y = 10 >>> answer = addnumbers(x, y) >>> print x, y, answer 5 10 15 Note that although the variable x was changed in the function, that change is not reflected outside the function. This is because the function has its own private set of variables. This is done to minimize the risk of subtle errors in your program If you really want a change to be reflected then return a list of the new values as the result of your function. Lists can then be accessed by offset in the same way as arrays: >>> def addnumbers(x, y): sum = x + y x = 100000 return [sum, x] >>> x = 5 >>> y = 10 >>> answer = addnumbers(x, y) >>> print answer[0] 15 >>> print answer[1] 100000 Exercise: Use your homework program that takes three arguments representing degrees, minutes, seconds of an angle (i.e. Declination) and returns a single value, representing the same angle converted to decimal degrees. Turn this program into a function that is called with arguments of degrees, minutes and seconds and returns a single value as a decimal. 6 File input and output So far we have taken input from the keyboard and sent output to the screen. However, you may want to save the results of a calculation for later use or read in data from a file for Python to manipulate. You give Python access to a file by opening it: >>> fout = open("results.dat", "w") fout is then a variable like the integers, floats and arrays we have been using so far--fout is a conventional name for an output file variable, but you are free to choose something more descriptive. The open function takes two parameters. First a string that is the name of the file to be accessed, and second a mode. The possible modes are as follows: ModeDescriptionrThe file is opened for readingwThe file is opened for writing, erasing the old file--be careful!aThe file is opened for appending--data written to it is added on at the end6.1 Reading from a file There are various ways of reading data in from a file. The readline() method returns the first line the first time it is called, and then the second line the second time it is called, and so on, until the end of the file is reached when it returns an empty string: >>> fin = open("input.dat", "r") >>> fin.readline() '10\n' >>> fin.readline() '20\n' >>> fin.readline() '' The \n characters are newline characters. The parentheses are required. If they are not included the file will not be read. They are to tell Python that you are using the readline() function (recall a function is always followed by parentheses, whether it takes any arguments or not). You can see from the example that you tell Python to use methods by adding a full stop followed by the name of the method to the variable name of the file. This syntax may seem strange but for now just use the examples below as your guide to the syntax, and don't worry about what it means. The contents are read in and returned as a string, but if the data are numeric you need to coerce them into either floats or integers before they are used in calculations: >>> fin = open("input.dat", "r") >>> x = fin.readline() >>> type(x) >>> y = float(x) >>> type(y) >>> print y 10.0 However, if the file you are inputting from is formatted such that each line contains more than one datum, you will need to use the string library to turn a line of text into several separate numbers. Begin your program with from string import * to have access to the library, then create a file variable and read in the first line as usual. (Note: the data read in are just examples). >>> fin = open("input.dat", "r") >>> line = fin.readline() >>> print line 1 5.06 78 15 >>> type(line) The variable line is now simply a string containing the contents of the line. Assuming the data on the line are separated by white space (ie. any number of spaces or tabs), you can split the string into individual numbers using the split function. The split function takes at least one argument: the string which it will split into a list: >>> data = line.split() >>> print data ['1', '5.06', '78', '15'] The variable data is now a list, each element of which contains each number from the line. Unfortunately, each element is still in the form of a string so you will usually need to coerce them into numbers using either int() or float(). Remember that lists can be referenced by offset in exactly the same way as arrays, so we coerce as follows: >>> x = int(data[0]) >>> print x 1 >>> y = float(data[1]) >>> print y 5.06 6.2 Writing to a file To output or write to a file use the write() method. It takes one parameter--the string to be written. Unlike the print command, the write() function does not automatically start a new line; if you want to start a new line after writing the data, add a \n character to the end: >>> fout = open("output.dat", "w") >>> fout.write("This is a test\n") >>> fout.write("And here is another test line\n") >>> fout.close() Note: in order to commit changes to a file, you must close() the file as above. The write() method must be given a string to write. Attempts to write integers, floats or arrays will fail: >>> fout = open("output.dat", "w") >>> fout.write(10) Traceback (most recent call last): File "", line 1, in ? fout.write(10) TypeError: argument 1 must be string or read-only character buffer, not int To output the value of a numeric variable, you must first coerce it into a string using the str() function: >>> x = 4.1 >>> print x 4.1 >>> str(x) '4.1' To print several variables using the same write() function, use the + operator to concatenate the strings: >>> element = Lithium >>> Z = 3 >>> fout.write("The atomic number of " + element + " is " + str(Z)) Exercise: Write a program that takes a slope, intercept and number of points as input from the user and generates a set of points with the independent variable incremented by one. Have it write the output to a user specified file in the format: 4 8 12 16 7 Putting it all together This section shows a complete, well-commented program to indicate how most of the ideas discussed so far (Variables, Arrays, Files, etc.) are used together. Below is a rewritten version of the example in the first section, which did nothing more than add two numbers together. However, the two numbers are stored in arrays, the numbers are read in by a separate function, the addition is also done by a separate function, and the result is written to a file. from Numeric import * def addnumbers(x, y): # Declare functions first. sum = x + y return sum def getresponse(): # Create a two element array to store the numbers # the user gives. The array is one of floating # point numbers because we do not know in advance # whether the user will want to add integers or # floating point numbers. response = zeros(2, Float) # Put the first number in the first element of # the list: response[0] = input("Please enter a number: ") # Put the second number in the second element: response[1] = input("And another: ") # And return the array to the rest of the program return response # Allow the user to name the file. Remember this is a string # and not a number so raw_input must be used. filename = raw_input("What file would you like to store the result in?") # Set up the file for writing: output = open(filename, "w") # Put the user's response (which is what the getresponse() function # returns) into a variable called numbers numbers = getresponse() # Add the two elements of the array together using the addnumbers() # function answer = addnumbers(numbers[0], numbers[1]) # Turn the answer into a string and write it to file stringanswer = str(answer) output.write(stringanswer) # And finally, don't forget to close the file! output.close() 8. Graphing in Vpython (With Credit to Bruce Sherwood and the Visual Documentation) In this section we describe features for plotting graphs with tick marks and labels. Here is a simple example of how to plot a graph: from visual.graph import * # import graphing features funct1 = gcurve(color=color.cyan) # a connected curve object for x in arange(0., 8.1, 0.1): # x goes from 0 to 8 funct1.plot(pos=(x,5.*cos(2.*x)*exp(-0.2*x))) # plot Importing fromvisual.graphmakes available all Visual objects plus the graph plotting module. The graph is autoscaled to display all the data in the window. Exercise: Now plot 3 complete cycles of a sine function with an amplitude of 2m and a wavelength of 2m centered about the origin. You can also plot points on a graph instead of a connected curve using a gvdots object. funct1 = gcurve(color=color.cyan) funct2 = gvdots(delta=0.05, color=color.blue) for x in arange(0., 8.1, 0.1): funct1.plot(pos=(x,5.*cos(2.*x)*exp(-0.2*x))) # curve funct2.plot(pos=(x,4.*cos(0.5*x)*exp(-0.1*x))) # dots In a plot operation you can specify a different color to override the original setting: mydots.plot(pos=(x1,y1), color=color.green) You can provide a list of points to be plotted, just as is the case with the ordinarycurveobject: points = [(1,2), (3,4), (-5,2), (-5,-3)] data = gdots(pos=points, color=color.blue) Creating multiple Graph Windows You can establish agdisplayto set the size, position, and title for the title bar of the graph window, specify titles for the x and y axes, and specify maximum values for each axis, before creatinggcurveor other kind of graph plotting object: graph1 = gdisplay(x=0, y=0, width=600, height=150, title='N vs. t', xtitle='t', ytitle='N', xmax=50., xmin=-20., ymax=5E3, ymin=-2E3, foreground=color.black, background=color.white) For example: from visual.graph import * # import graphing features graph1 = gdisplay() #Create Graph Display graph2 = gdisplay(y = 100) #Create 2nd Graph Display funct1 = gcurve(gdisplay = graph1,color=color.cyan) #Create a function funct2 = gdots(gdisplay = graph2, color=color.blue) for x in arange(0., 8.1, 0.1): funct1.plot(pos=(x,5.*cos(2.*x)*exp(-0.2*x))) # curve funct2.plot(pos=(x,4.*cos(0.5*x)*exp(-0.1*x))) # dots Exercise: Create graphs of the normal curve between the bounds of -5 and 5, and its first and second derivatives each in a separate window. 9. Windows and Mouse Events (Excerpts from Visual Documentation) Initially, there is one Visual display window namedscene. Display objects do not create windows on the screen unless they are used, so if you immediately create your own display object early in your program you will not need to worry about scene. If you simply begin creating objects such as sphere they will go into scene. display()Creates a display with the specified attributes, makes it the selected display, and returns it. For example, the following creates another Visual display window 600 by 200, with 'Graph of position' in the title bar, centered on (5,0,0) and with a background color of cyan filling the window. scene2 = display(title='Graph of position', width=600, height=200, center=(5,0,0), background=(0,1,1)) Some handy attributes of the display are: centerLocation at which the camera continually looks, even as the user rotates the position of the camera. If you changecenter, the camera moves to continue to look in the same "compass" direction toward the new center, unless you also changeforward(see next attribute). Default (0,0,0). autocenterscene.center is continuously updated to be the center of the smallest axis-aligned box containing the scene. This means that if your program moves the entire scene, the center of that scene will continue to be centered in the window. forward Vector pointing in the same direction as the camera looks (that is, from the current camera location, given by scene.mouse.camera, toward scene.center). The user rotation controls, when active, will change this vector continuously. Whenforwardis changed, the camera position changes to continue looking atcenter. Default (0,0,-1). rangeThe extent of the region of interest away fromcenteralong each axis. This is always 1.0/scale, so use eitherrangeorscaledepending on which makes the most sense in your program. Default (10,10,10) or set byautoscale. scaleA scaling factor which scales the region of interest into the sphere with unit radius. This is always 1.0/range, so use eitherrangeorscaledepending on which makes the most sense in your program. Default (0.1,0.1,0.1) or set by autoscale. Mouse Interactions This program displays a sphere (which automatically creates a window referred to asscene), then repeatedly waits for a mouse left click, prints the mouse position, and displays a small red sphere. A mouse left click is defined as pressing and releasing the left mouse button at nearly the same location. scene.range = 4 sphere() # display a white sphere for context while 1: if scene.mouse.clicked: #Is there a mouse click event mouseevent = scene.mouse.getclick() #Get the Mouse Event location = mouseevent.pos print location sphere(pos=location, radius=0.1, color=(1,0,0)) Try running this program. You will find that if you click inside the white sphere, nothing seems to happen. This is because the mouse click is in the x,y plane, so the little red sphere is buried inside the large white sphere. If you rotate the scene and then click, you'll see that the little red spheres go into the new plane parallel to the screen and passing throughdisplay.center. If you want all the red spheres to go into the xy plane, do this: location = mouseevent.project(normal=(0,0,1))#project into xy if location: # loc is None if no intersection with plane print location sphere(pos=location, radius=0.1, color=(1,0,0)) There are four kinds of mouse events: press, click, drag, and drop: A press event occurs when a mouse button is depressed. A click event occurs when all mouse buttons are released with no or very slight movement of the mouse. Note that a click event happens when the mouse button isreleased. A drag event occurs when the mouse is moved slightly after a press event, with mouse buttons still down. This can be used to signal the beginning of dragging an object.. A drop event occurs when the mouse buttons are released after a drag event. AE * - \ _  ( 0  $ 6 ; !-|>CS?BMW`g #L\¸jhsUhh hs56\] hs5\hy hs0J hs0J hs0J hs6]hshvhsCJ,aJ,hvhvCJ,aJ,D0 [   S l s C slUq^gdsgdsgdsgds$a$gdsHUq3<IGY/IUax [$\$gd.gd.gds^gdsGY/ (,Dl}R T vvvvvmvvvvvh^aPh)CJh^aPh)CJh^aPh)0JCJhsh)CJ(hshsCJ( hsCJ( hh 5\ h.5\ h.h.CJOJQJ^JaJh.h.h.5CJ aJ j`hs5U\jhs5U\ hs5\ hs0JjhsUhs*DZg #!/!j!!#gdB_gdB_^gds^gd)gd)gd)gd. [$\$gd.T g /!i!j!k!!!## $$$$x$|$$$&&l&n&((k)q)))2*V*****++V,Z,,,,,,,,T-U-V-W-X-־־־ַɝ}#j"hB_CJOJQJU^JaJhB_CJOJQJ^JaJ#jhB_CJOJQJU^JaJhB_CJaJ hB_5\hJxhhB_OJQJ hB_0J hB_6]hB_hshsh)CJ h^aPh)h^aPh)CJh^aPh)CJ1#c$#(()*+ , ,",:,R,,,, $IfgdB_^gdB_gdB_,,Y--zqq $IfgdB_kdc$$IfT40|064abpTX-t-u---------/.0.1.2.3.;.<..............//r/s/t/u/v/w/}/~////////̬̾̾̒̾x#jhB_CJOJQJU^JaJjhB_U#j%hB_CJOJQJU^JaJjr hB_U#j hB_CJOJQJU^JaJhB_CJOJQJ^JaJ#jhB_CJOJQJU^JaJ hB_0JhB_CJaJjhB_UjhB_UhB_/--4..|ss $IfgdB_kd $$IfT0|064abpT...v/|ss $IfgdB_kdi$$IfT0|064abpTv/w//Z0|ss $IfgdB_kd$$IfT0|064abpT/V0W0X0Y0Z0[0_0`00000000*1+1,1-1.1/1314111111111222222 2a2b2c2d2e2}2~222̬̾̾̒̾x#j-!hB_CJOJQJU^JaJjhB_U#jhB_CJOJQJU^JaJj!hB_U#jEhB_CJOJQJU^JaJhB_CJOJQJ^JaJ#jhB_CJOJQJU^JaJ hB_0JhB_CJaJjhB_UjhB_UhB_/Z0[00.1|ss $IfgdB_kd$$IfT0|064abpT.1/112|ss $IfgdB_kd$$IfT0|064abpT22f22|ss $IfgdB_kdq $$IfT0|064abpT222222293:3;3<3=3U3V33333333344444/4044444444444444 5 5c5d5˽˫˽ˑ˽w#j.hB_CJOJQJU^JaJj+hB_U#j*hB_CJOJQJU^JaJj}'hB_U#j%hB_CJOJQJU^JaJhB_CJOJQJ^JaJ#jhB_CJOJQJU^JaJ hB_0JhB_CJaJhB_jhB_Uj #hB_U-22>33|ss $IfgdB_kd$$$IfT0|064abpT3344|ss $IfgdB_kdY)$$IfT0|064abpT444g5|ss $IfgdB_kd-$$IfT0|064abpTd5e5f5g5h5m5n55555555T6U6V6W6X6Y6_6`6666666666667777k7l7m7n7t7u7w7x77777˽˫˽ˑzj;hB_Uj :hB_U hB_6]#jq7hB_CJOJQJU^JaJj4hB_U#j2hB_CJOJQJU^JaJhB_CJOJQJ^JaJ#jhB_CJOJQJU^JaJ hB_0JhB_CJaJhB_jhB_Uje0hB_U0g5h55X6|ss $IfgdB_kdA2$$IfT0|064abpTX6Y666|ss $IfgdB_kd6$$IfT0|064abpT668o88888K:L;f;;|wwnnidwwnwgdB_gdV/^gdB_gdB_kdM9$$IfT0|064abpT 788888888888D9T999:::: >>h>i>l>m>>>>>+?,?????L@O@V@Y@Z@[@ AABBgDjD@EAEFF>>+?$$9DIfa$gdB_HkdL$$IfTgX634ap T $IfgdB_gdB_^gdB_ +?,?A-AKA_AgA{AAAABB7B4CNCOCCCCCgdB_gdB_HkdL$$IfTgX634ap TCDyy"z#z1zŻ{mjh,sUmHnHuhJ5B*OJQJ\phhJB*CJOJQJaJphhJB*ph ho5 hJ5h,shJ0J h]80J h[L0Jh.h[Lhsh[L5CJ, h]85CJ,hdhd5 hd5 hB_0JhB_0J5\ hB_0JhB_&OoooooppppppRqrrrrrrrsLsssst:t^gd[Lgd[L & Fgddgds^gdB_:tqtttt uZurusuuu3v4vWvxv}vvvww\wkwwwwwxxGx^gd[LGxcxx>ytyvyyyy"zzzzF{G{{{80x9D[$\$^8`0gdi|6809D[$\$^8`0gdJ80x9D[$\$^8`0gdJ$x9D[$\$a$gdJgdo1z2z>z?zzzzG{{{{{I|||}\}]}b}c}k}}}}}}}}~~~~~ _㵦ŵŜŵŜŜŵ|j#hi|6hi|65B*OJQJ\ph h[LhJ h[Lhi|6hi|6B* phhi|60JB*phhi|60JB*phhi|65B*OJQJ\phhi|6B*CJOJQJaJphhi|6B*phhi|6h,s5>*B*phh,sB*phhJB*phhJ0JB*phhJ0JB*ph%{{|I|||}k}}}}}~ =q80[$\$^8`0gdi|6gdo$x9D[$\$a$gdi|680x9D[$\$^8`0gdi|6809D[$\$^8`0gdi|6Ò%_j12w<=a80[$\$^8`0gd]8$x9D[$\$^`a$gd]8gd]8$9D[$\$a$gd]8gdo80[$\$^8`0gdi|6_ij 01efkw=CD129:aklV]_KLST!"'(*+0ƶծh]8#h]8h]85B*OJQJ\phh]80JB*phh]80JB*phh]8B*phh.h]85CJOJQJaJh.h]8CJOJQJaJh.h]8CJOJQJaJh.h[L5h.ho5;h.h[L5;4aVЋS͌ʎQ809D[$\$^8`0gd80x9D[$\$^8`0gd$x9D[$\$a$gdgd]8$x9D[$\$^`a$gd]801 %&ЋwxʎՎڎގ#fk̐͐¸̨¸̨zzzvhB_h5B*OJQJ\phhB*CJOJQJaJphh5B*OJQJ\phhB*CJOJQJaJphh0JB*phh0JB*phhB*phh]8h[L5 h]8h]8h]80JB*phh]8B*phh]80JB*ph-Ql'א֑-[lmwDEGHgdB_gd[L$x9D[$\$^`a$gd$x9D[$\$a$gd809D[$\$^8`0gd͐Ր֑-01]^mWXtuHIY[bc1?@de !"jklmvwï&h.hB_5;CJOJQJ^JaJ&h.h5;CJOJQJ^JaJh.hB*phh0JB*phh0JB*phhB*phUhB*phh6B*]ph9The mouseevent has the following attributes: posThe current 3D position of the mouse cursor;scene.mouse.pos. Visual always chooses a point in the plane parallel to the screen and passing throughdisplay.center. button= None (no buttons pressed), 'left', 'right', 'middle', or 'wheel' (scroll wheel pressed on some Windows mouses). Example:scene.mouse.button == 'left'is true if the left button is currently down. pickThe nearest object in the scene which falls under the cursor, or None. At present only spheres, boxes, cylinders, and convex can be picked. The picked object isscene.mouse.pick. pickposThe 3D point on the surface of the picked object which falls under the cursor, or None;scene.mouse.pickpos. cameraThe read-only current position of the camera as positioned by the user,scene.mouse.camera. For example,mag(scene.mouse.camera-scene.center)is the distance from the center of the scene to the current position of the camera. If you want to set the camera position and direction by program, usescene.forwardandscene.center. rayA unit vector pointing from camera in the direction of the mouse cursor. Exercise: Write a program to have the user click two points on the screen and place a ball at each of those points. Create a graph object that plots the position of those two points with the line connecting them.     wCDEFGHIKLNOQRUVļh8jh8Uhdh3hB_5hB_h#h.h5CJOJQJ^JaJh.5CJOJQJ^JaJ#h.hx5CJOJQJ^JaJHJKMNPQSTUVgdB_ 21h:pV// =!"#$% n-*ybi7PNG  IHDR GcsRGB,IDATx^O%yz胦1L Bv ֣C @^`_{qi^k<]ߨtOo1n[/?m<u;`?{Sؘ)\؟1S?-oߺzn-hm]t6^ۦ^kەp6>ۑ[Tiߺ7*ZU>F۪W7I1IO޿ FȮ}c,{p.לaMѿRG/}]H`Eˋx @Jg_z'''/>Zq~G\><яG??gw}Uj`Yn F}.wnKw6ޜ~`>;k7Vop{ۍws [}kweW֖_>9 ]{u‹./ӓ'NN?.~7|^v<`i4X[ZI>6n`s==4X뷣g[>J-` yGu]uw ֈ<"K}3}/}7_~}|~/xr|xcxԖ{췏 @_smW~|~~}o?_~>ߏ{w~G?sDlL @@6U[?ÿy̮}NN>.g7~ٟկB׳Mށ @AwX"=??^{ǮX?խwW[?_s_W~߳C; 0]5`u @{2y=Qj?{}C. @@}skW=<NnVw?a ?SmVrrI,/ @*1?`hx<dWv_'/t9i~X羺>_/߸i!ꋷo6Wu @@;G̅?aH4sW|K_8uS!X~?'{gU#^?g4tt kXzߍqO"V ݤ6}S=_&qm}ic_ vUbUpzF6~QzFpT鎢ڬ~/ ׾c`;6ur 2N3gbI7)7oye- z 7OSMwk;L'۾n}Ko=Y}UQ}UΈ|_}ֿ|7e[P=۸m^v(|;o`m4X^oK-^{ åc¬]l`{A_<. kukJdt˝`ݾo[{ 6߿XRu˞( @Z>U$͋ GvZk6,:OB@`V &ZM S@S۱ @&4XM$  @ڎE4!j"&I`v, @  Vi6I @ +c @MhHI @94X9hB@DM)ʩX @@&l @@N VNm"@`5f$@r hrj; Є4$ S@S۱WJ}Qէ rhxyj,Yz+Oej{na/%0z就<^*`v+Py(p~~EmK #!5XG|@tz$F V mm7&hڨm V6N12!@@*TQG;?E,/fTW Զmi^ -\ &0!G51w8KFնC5c^׶KW!PZEL[<qTl2( y5&V"p׶+c8R埨Koˠ$@@%ߠ`5^-M<śkŃڎW5eDp쉝) ₲ *.e&@@ޠ`Q_L$P쉚h9^Ń>>QJm' V8 U@53eTPJʼA*(DL5-v)05v!B%L @ V9 ePD pVly8-JB hjͬy pLeCoPB4X%d)N8h5ޫU&@$XL (IJwI4HHR.BK;.s ԺxmɄ ,m'fJ$Bf{"4sj O`1 bKE(V>DC@ )C5  @F4X&i[MfY  ̹7<ZX<-Mg\K hZCk'Gh @@29jˠG>|` LQCԋPUeN4X@OEhr~-w|G&P@;y`E͌4#j&&J! VC9Uˠpv*pz !K Ъ@kVϼ8}_{>o?c3ˠL'p{HT$2 ^GOO"tt@ V!R.BK;.,[RKq @f4XͤzD-Bٌ x [ #D cQr Kv,+p ֲ9wtfx8vб1ڞ@)R2%0.BaR! XX\a @5ʆ @aaN"@ ` lC+K @A`̆ xG`XGPJ5 @5 @$`%-c8ȓ(  @ @OwhRgx,(` ?E(U!M@-#)JEt @%OUZK`OQ- AUPEi $E(mF#G@'")SE̼@I%e&V VI2 [@;?ɣ JNj@ @@((IZa4z>1#_yC󟨅 J9xi̛  @ P̼}qn/H  VLO2QD]^6O8k]  @4X X@4p3͍ @` 9kȨc P!!֡ ,%ZJqp.&D`a0I|v&@<`QAm,  @8>hK %`']( h;b.Bx-xĠ#@hˠl 0R`>|ko|]X=lNKl]O w/..N?\^^v< V%BHC1U<-hS XNMHCΡ 2R&NmM[OE6t;!CA:D`cY[ʷ-*gCCJPoCRl7 ]k|U`tv,K@/goӖft+úW+wM| k{6;̫^s =C@'gWׯ9~n `qj6)0Sy4\Fn[D:g!g ذ*m\3 k 8>,BeǰQ;Pa,'j#Aj{4,`Pc4X5 Ц[ՕO!@B4X&NxpOcET4X \O -`0.,ص": @`@k`6%`6 @@  V<=y,! pp)P.Bz{%0a9r;'@`?aG @-[83vj; @@ x>F qIxV^,'j!#L @`@K @ h O*|HI @@5jRi"jx(%>QJęK@Kqt.BʀOڨ Pg @V V33` K hُ,N;i=V 8R&`,0j"VDD ` fAj1ޫ.% hJʖX 4$cp{5QT=|(%S_@5#pRZ䡍n\(A$@ nN>#ˠ$@)4X)A@Z9G!c`N*p8F`C3rjM$I:\,$`%4 ,RI.5K;n$ Vl)m: |"R9+C |UsYX%'5 H'Jgi$ X3gl;?a=`?W""TI"MVE25o P@Q VYɣ JNj@ 0kW 0\aU[zPb|ko|$^y2`682j1u &vʫoeQ>;;K#pmjԈ]OՅw/..N?tkWkmmeT~;r{͓!htfU7[o=y#jj"X}W>}ULަ 4?{'PfD- `egr@ @p p Za  @h h:; 0M`}aM,aoOKȒS `9QSq hcZ,'j\v5z,e`%Yz gp| 0]@5 x&n6&\QDmnn,[Ca nE V&9,S @ +hXjR,'jejZ'j[)`3/ :>gx;{ @XX ,*Lj)A`AkA*K5y؀x8Ϋk M ;YHR#@`qW?,'jev7)Hbqb(F@ULJ<r\n.gsT`9Q(cFP j@ ֡i@ H#Jh6,ın+f6XNe'Ij{ LxL6XEdYZDI` fsX< QC7hUE-U7XNZ<6Զ RdC@\-wymnd~Fm UR*@⡀$E E(J4$P{6AaS#3y51R6 ` pM^zpP3/kpv 4X/BO5S&@hZJ6'm`\ 6a=`:Q]򔶣 @hud Y?X<̞Kxem rUv&L%*~x^ߡ `-~M+V{ @RZjJɉ8 Xv`0"ev(B,@c ւ'+POk>H#X\`⩯>]}k`{ "'+P'9 @]5Xj@SP&'+ЀB IK`19k!x1Tڮ,O+[^]Q;#ps1&iB Om/x8zȦImL+C&eCXJZ*%@A۬5X3:Kg@5d" ~P4XN*.BވC#8M V; V UhtC#&NԉjwqR |ko|ݼ^yͺfz65ojQEQw ,{΢#@#]OՍw/..4X a E V^[Aو1 G1r" - ZʿhB@DM@dU숍qqn"@`)BY!  hAd cG@, V|@@UAM% @h*H) @4X! @ VI4 @ +V>DCT @`ʇh @ 4X$ @XX  P$ Kه?~퍏? V\!@(w/..*0uB&@b \ZA P@wɓ'+P @@  ޖUcIENDB``Ddl  S HA  img5$(20 - 10)/2=5$b쌷1rF|Dnt쌷1rFPNG  IHDRq"?0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712OmIDATH?,`Ƌ 6 E ,2H/$R9I7;?pC#XD$Dnx۫H$>߯y|oPOŸ#WnzA2 ]2u3LXڄM7OOyP4+PxBS E** V܇@C8|XE6wf$PI6A[(Y^47YQ !}%T AhD_9d'DT \rUI/?fh̻51}ҋ4_:G{"oZ<;p^oIENDB`Dd,X  S 4A  img6$x^2$bWtEn6/N APNG  IHDR٬0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712OmoIDATc>0`?٣+!:SC?Y'n"t5@55L?kDd|W_:LeCYIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV   S 2A  img14$x$b2 ,5A n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV   S 2A  img14$x$ b2 ,5A n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV   S 2A  img14$x$ b2 ,5A n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV   S 2A  img14$x$ b2 ,5A en ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV   S 2A  img14$x$ b2 ,5A n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV  S 2A img14$x$ b2 ,5A n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV  S 2A img14$x$b2 ,5A q!n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV  S 2A img14$x$b2 ,5A M#n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV  S 2A img14$x$b2 ,5A %n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV  S 2A img14$x$b2 ,5A 'n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV  S 2A img14$x$b2 ,5A Y*n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV  S 2A img14$x$b2 ,5A 5,n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV  S 2A img14$x$b2 ,5A .n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV  S 2A img14$x$b2 ,5A 0n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV  S 2A img14$x$b2 ,5A A3n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`DdV  S 2A img14$x$b2 ,5A 5n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdV  S 2A img14$x$b2 ,5A 7n ,5A PNG  IHDR  XD0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712Om?IDATcES' @O,!_Atnӵu"X2PeZGMZIENDB`$$If!vh5*5a#v*#va:V 06,5/ 4pTDdX  S 4A  img4$\pi$b.4:=⼝.J M:n4:=⼝.JPNG  IHDR&:G0PLTExxx```TTTHHH<<<000 B%tRNSEbKGDH cmPPJCmp0712Om=IDATc  $W00Җn%@:u[-[ \}mZ}QݻOhIENDB`DdV  S 2A img17$e$b%oEkl2!E%'<noEkl2!E%PNG  IHDR "3z0PLTExxxlllTTTHHH<<<000 1m_ tRNS="bKGDH cmPPJCmp0712Om5IDATc8 Q`**<HxH Dx 1 J3@r'[T1?^`IENDB`Dd 0  # AbN?-w`Ybٱ*=n"?-w`YbٱPNG  IHDR+ZsRGB IDATx^]=Z4E` X%L Rg{ :~Bw~5t Vu[ϟ?tI)mTR)-WR@[* R}-)-WR@[* R}-)-WR@υwwws|40]Xv&@](l2NNN4ސ 6">(tSyңkMGˇ'#q0 ߞٙp#3R`Cb }R/q!#~d3 2 VjYAb%/[V n֫i3K(np)c\/n0>+{б=Z `M 뙧'HO Ig$l[li$$2l6n7-2d A$,n3AXU)b|8l8ʨV S02Ŝ$!]-nKY#/_43AJR/ejFޔCg6~,ce `TtF2H2]P3":nk-b&RU@J$22-\L+R++RU@J$22-\DH (++RU@J$22-\DH (++RU@J$22-\r =88p @PsAg.)-WR@[* R}- $fW MZya ;P@*IXeW\@;l=;g <|Gˋϻq]WePQV@ӧ>l1=Ҳ:>>ea!s ϟ?0<79Yx<)5Ÿ 7]n.&MAø\kLq̗MѤqt@qyqqޒxG%C0`sQWk%~ 'R6@HQpd+Dd . &#E|v8*|rs\h`*A:I$ >ghH'A|H>4yd\(.>p{i#\ b`7E\k[O34j$9y+#c@<}ۂ g0氃96c"fhHF*ZbspCaAZƟ*}Hlf& `A; ΁}}`Fd@Znzy )`䑡hIMA"\Y\n.-]Xs)҅ ll&x$0ɖQK_َ 2ОrUB}WaVYsS4ɷ> @]&5uM<"8n.̵bC+`xbs|A,&cYa<ck}&oYw!hz;53CNClzQ7vWG΁㽊x?Frss* õI6rsBk(K6@+ ΓcV5exinyc~?CGΑUCh&a =Paݣ{pSͨz^z\.7h}%B)еOW@}ʁPv]}"߽Pt2~tɻ{|MRH Lg`)kIuf`jq'"M5"RU@*%2)X4VbX95gAoSdJ tvZŢ' ("F (;8ʯTdz}ڡ8$>פ*9`>H^yyX<1@ܲ#Lp4  & J1n/4/xbLn)~ 9$Cyl;>j8ji2b4hR!3v2lIu_\c᮲0T䁶8^`~k4"e#Ae9cpA&Ϫbe`I6y6.#\H35H<1{UE؜"lML Xw%kͅ\3?S}k o)U"'v, `J `#|ci0ԫhS*GƯ)[~R*SpN\v0.=͚Ō'oq,eA+_#E1{X3n Yx`r jpLNͻ9Ņ+BwK28q@o!saϑ4gi&np2BfJsrX5B(J̜e3(4ٻ. ѡCYU)@uLPÒj pa>`9Ҿ'.uV1ŀF.Ga0(4|>H0A6x?iQX:|>hdZ?6 V qXq44 5M*>58q&@ HG% ﹕= u3Ⱦe _rIu@S߮n N &ƣq7.=GPNzf6'. >k.C-ɇ.4s'<6x+]z#OuDNEܛx#ޟlH;OfwN'7bGY^&) (a ([q_e-׎B_$y()`;un)Ne:tX2p~[ S@N?-)D- R`K[2P1 T@*[ (R`K]{)-IENDB`j$$If!vh5#v:V 6,5X34p Tx$$If!vh5#v:V 6,5X/ 34p T Dd 9|0  # Ab oTNq Myni oTNPNG  IHDRa7R=lsRGB IDATx^=MKyB(DP($ "BDFD|T$RBи[OrBB4\ qBB'~y}=3g>^ܵ^{͚33|2111>>~wu|[-S303q鱱KnܸQB̙79qQsg  T n"(cA U!BAu>$n* )hZч űa_#X+ {,JaA% ۛn(vA2->8qmSnX>c.*|Sq(4*UКDzW=%:[/fɤ… {VGPAoB)^+;.NݿѥRS85;vL(|^K -ơƉfS_cāT9Ђĉq-[&I*h)Mkdw,"rL&`h±;ɱD')9k_ȅ *l Hxu o?(vZ{7Uhk1tZBB[%mT>ƛ y襅V)7^!"Ȼ/e9)bs@TtP0ITc\K`ICdƊNsQ!_>hYm|*vxRtEL`TʡCk:#ϰ+}ڄ І#)ȴ1'!`DJfiQd?#AP4\ _% U*gm1-2am|-=f?{2 0#!r*kD7o vƎ=X:9c-8pXi}eQ=BnF j!! ma2JqG3H:_Vie#dZ`NWVj%Y]/ٻ̇ʃ< u} 7 'A_H[PD9ODVn1"(yR ҒadOa Q|~0|Ĥ$-Z>ZnR]\EUZYň.g:e6vr?u/YQP(a.]əjʶsNv$Œ+WL?+-g #G`hh`:sd˗$jNly+&ta;ͯ@_!Fp,׻J^=tX-( 0Ch&2Z2Gpe h5j_n4F 2k4Fa 7#^5Q֐g U~J*b t`瑍Wt} ~yAh򈱱ݻw~h N#}3A={Vm۶(ў-` zbddDn.208 dGIݛ'&&VZD72mc ԰km*9Ku`/zIENDB`$$If!vh55#v#v:V 406,5/ 4pT$$If!vh55#v#v:V 06,5/ 4pT$$If!vh55#v#v:V 06,5/ 4pT$$If!vh55#v#v:V 06,5/ 4pT@@@ NormalCJ_HaJmH sH tH R@R B_ Heading 1dd@&[$\$5CJ0KH$\aJ0N@"N B_ Heading 2dd@&[$\$5CJ$\aJ$FBF B_ Heading 4dd@&[$\$5\DA@D Default Paragraph FontRi@R  Table Normal4 l4a (k(No ListB^@B B_ Normal (Web)dd[$\$Bb@B B_ HTML CodeCJOJPJQJ^JaJ4U@4 B_ Hyperlink >*phe@" B_HTML Preformatted7 2( Px 4 #\'*.25@9CJOJQJ^JaJ O1 B_note6OB6 B_normaldd[$\$8OR8 B_programdd[$\$*Oa* B_ attributeFVqF B_FollowedHyperlink >*B* ph$O$ stextsfJd@J s HTML KeyboardCJOJPJQJ^JaJBOB Japple-converted-spaceROR ,sHeading 2 Char5CJ$\_HaJ$mH sH tH >O> ]8 attributesdd[$\$ 0[SlsCsl   U q  3 < IGY/IUaxDZg#/jcq >!X!n!p!!!,"6"C"D""# ####I$$$)%%% &|&}&&Q'R''(()(())d)))>***+++ ,.,/,^----B.L./00&1D1i1z1123G4I4J4y4z4j6{6666667A7V7g77888889$9m9999:;;;;</<S<[=H>?@@@ A'A8ANAANB*CCCC`D]E=F[FsFFFFFFFG4HI|IIIIIIIJ"J=JIJBKKL*LAL]LbLpLLLLLLLLLJNKNdN`OOPPPPQ Q!Q#QeQfQhQQQQRRSS6SASXS_SS~TUOVtVVVVVVVVWWXXXXXXYeZZZZ \$\4\:\U\e\n\\]]] ^5^^^_1_X_____X`h`x````aa-auavawaambobqbtbwbb0c_dydzdddddd*eaeeeefOfcffff8gPgQggghh5hVh[hhhhh:iIiyiziiiii%jAjjkRkTkkkkllll$m%m~mmmm'nannnIorooooppqOqqqqq-rvrrrs=sHssttUuvvvvww?x4yzp{h|i|j|}|}}}}1~r~~~~/JˁeW҇ !+ 000000000000000000000000000000000000000000000000000000000000000000000000000j0j0j0j0j0j0j0j0j0j0j0j0j0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j0j0j0j0j00B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B. 0B. 0B. 0B. 0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.0B.00C0C0C0C0C0C0C0C0C0C0C 0C 0C 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00KN0KN0KN0KN 0KN 0KN 0KN 0KN 0KN 0KN 0KN 0KN 0KN 0KN 0KN 0KN0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0KN0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\0n\ 0n\ 0n\ 0n\ 0n\0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@0I00=@0I00=@0I00=@0I00=I00` =0[SlsCsl   U q  3 < IGY/IUaxDZg#/jcq >!X!n!p!!!,"6"C"D""# ####I$$$)%%% &|&}&&Q'R''(()(())d)))>***+++ ,.,/,^----B.L./00&1D1i1z1123G4I4J4y4z4j6{6666667A7V7g77888889$9m9999:;;;;</<S<[=H>?@@@ A'A8ANAANB*CCCC`D]E=F[FsFFFFFFFG4HI|IIIIIIIJ"J=JIJBKKL*LAL]LbLpLLLLLLLLJNiii%jkRkTkkkkllll$m%m~mmmm'nannnIoroooppqOqqqvrrrs=sstUuvvv?x4yzp{h|}|}}}}1~r~~~~/JˁeW҇ ! 000"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0000000000000000000000000000000000000000000000000000000 00z0z0z0z0z0z0z0z0z0z0z0z0z0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z 0z0z0z0z 0 00e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e. 0e. 0e. 0e. 0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e.0e. 00C0C0C0C0C0C0C0C0C0C0C 0C 0C 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C 0CJ00(J00'J00%J000J000BJ000BJ000BJ000BJ000BJ000BJ000J00J00J000J000J000J000@0@0@0@0@0@0@0@0@0@0J000BJ000BJ000BJ000J000J000@0J0 1 !J0 1J0 100J01"@00@00@00@00@00@00@00@00@00@00J000@00@00@00@00@00@00@00@00@00@00@00@00@00@00@00@00@00@00J000BJ000BH000J000H000@000 T X-/2d57I/[k1z_0͐wVIMORVZ^bfiptwy{q#,-.v/Z0.12234g5X66;+?CQDX_B___a\jOo:tGx{aQHVJLNPQSTUWXY[\]_`acdeghjklmnoqrsuvxzUKI""""##$#}######D$F$g$$$$$%&%K%%%%&&&x&z&&&&&M'O'V''''$(&(.(((((()_)a)}))))9*;*X****++I++++,,a,,,,- -[333 CCCCCCCCCCCCCCCCCCCCCCCCCCCXl,b$*ybi7-4@(  J  # A"`B S  ?l f+ T _Hlt202177958 _Hlt20217795933 @@33 M|-P 0P >*urn:schemas-microsoft-com:office:smarttags PersonName )3HR 67_ ` ef!!\!d!~!!!!!!D"H"}&&)(-())))**. .1155r6{6666666668888"9#9|9}9::;;3<=<I?L???+@.@@@AAAAAAAAAA5A7AxA{ABBBBzC}CIFSFFFIIJJL LLLhOlOuOOOOOO RRRRSS'S3SISUS TTcVlVVVVVVVVVXXXX Y YYYtZ~Z[[\\]]]]]]]](^2^^^__"_,_5_>_______G`J```5a?amapaddddgggghhhh-i7iVi`iiiiiiiii2j>jQjXj!k-k]kckjktkkkkkllmlwlnmtmmmmmmmmmmmn nAnDnnnnnyo~oooooppppq qqq%q)q/q3q:q>qDqHqdqoq|qqqqqqrr6r  CMB!F!\!d!t!y!!!_,a,----00.121L1N1~11 66n6z666666666I7L7k7q7e8h8888888 99,949u9|99999;;;;<<$<'<==b>h>??@@@@AA4        pw7S^C*R7d@icE8- 9&|7~K;&| =a ?qWd@SLS^CNDF>w7HGK UVb{qWb{?YW]q{K[s;N] C^`qWN#gqW1g&|34^h^MlK_lxLqqW%usND6XtND}>vs{74xqWxb{]q{&||ND|{1JOjU< h 5 ei@huyHTF!cm#f[%>#&G&B)R\-S.x135_86i|66]8K@=Y3>:DyoD\rDGIHOHmJ+fO#PlWbWTYN<[y\B_}2`~a`>d&ef7i&kl ***+++ ,.,/,G4I4J4y4z4PPPPQ Q!Q#QeQfQhQQQ @m|NNN N!:;BC P@P&PP@P*PX@PFP@PPP@P@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier NewO1 CourierCourier NewMCentury Schoolbook"1h''frtErtE!42qHX ?G&21Martin S. Masonnone   Oh+'0  4 @ L Xdlt|1Martin S. MasonNormalnone2Microsoft Office Word@F#@NR@#46@#46rt՜.+,D՜.+,@ hp  Mt. San Antonio CollegeE' 1 Title 8@ _PID_HLINKSAnbQ5http://www.pentangle.net/python/handbook/node19.htmlElements:Variables  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"'Root Entry Fv96)Data v[1TableWordDocumentJ/SummaryInformation(DocumentSummaryInformation8CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q