This shows you the differences between two versions of the page.

Both sides previous revision Previous revision Next revision | Previous revision | ||

cs190c:lab5_09 [2009/02/11 10:09] seh |
cs190c:lab5_09 [2009/02/13 11:58] (current) |
||
---|---|---|---|

Line 4: | Line 4: | ||

===== Demo Problems ===== | ===== Demo Problems ===== | ||

+ | ==== Random Grid Visualization ==== | ||

+ | <code python>from visual import * | ||

+ | from random import randint | ||

+ | |||

+ | def visualize(grid): | ||

+ | global scene | ||

+ | |||

+ | #hide all the objects in the scene | ||

+ | for object in scene.objects: | ||

+ | object.visible = False | ||

+ | |||

+ | rows = len(grid) # get number of rows | ||

+ | cols = len(grid[0]) # get number of cols | ||

+ | |||

+ | for row in range(rows): | ||

+ | for col in range(cols): | ||

+ | |||

+ | # Choose the color for the box. Colors are specified in | ||

+ | # (r,g,b) notation. | ||

+ | if grid[row][col] == 1: | ||

+ | color = (1,0,0) # make the box red | ||

+ | else: | ||

+ | color = (0,0,1) # make the box blue | ||

+ | |||

+ | # draw a box with position (x,y,z), where | ||

+ | # x=col (left (-1) to right (+1) displacement) | ||

+ | # y=-row (up (+1) to down (-1) displacement; | ||

+ | # and the given color. | ||

+ | box(pos=(col, -row, 0), color=color) | ||

+ | |||

+ | |||

+ | def random_grid(n): | ||

+ | grid = [] # intialize grid | ||

+ | for row in range(n): | ||

+ | rowlist = [] # make an empty row | ||

+ | for col in range(n): | ||

+ | num = randint(0,1) # fill out the row with | ||

+ | rowlist.append(num) # random numbers | ||

+ | |||

+ | grid.append(rowlist) # add the row to the grid | ||

+ | |||

+ | return grid | ||

+ | |||

+ | | ||

+ | if __name__ == "__main__": | ||

+ | scene = display( # 3D window parameters | ||

+ | title="Random grid visualization", # Window title | ||

+ | autocenter=True # Automatically center object | ||

+ | ) | ||

+ | |||

+ | grid_size = 10 | ||

+ | total_red, total_blue = 0, 0 | ||

+ | label = label(pos=(grid_size/2, 2), text="Ratio of red:blue = 0") | ||

+ | for i in range(grid_size): | ||

+ | grid = random_grid(grid_size) # Make a random 20x20 grid | ||

+ | visualize(grid) # Visualize the grid | ||

+ | | ||

+ | count_red = 0 # Count the red (=1) squares | ||

+ | for row in grid: | ||

+ | count_red = count_red + sum(row) | ||

+ | |||

+ | count_blue = (grid_size**2) - count_red | ||

+ | # Compute the blue (=0) squares | ||

+ | total_red += count_red | ||

+ | total_blue += count_blue | ||

+ | label.text = "Ratio of red:blue = " + str(float(total_red)/total_blue) | ||

+ | label.visible = True | ||

+ | | ||

+ | rate(.5) # Allow at most 1/2 loop iterations | ||

+ | # per second | ||

+ | # (one frame per 2 seconds) | ||

+ | </code> | ||

+ | |||

+ | ===== In-Lab Problem ===== | ||

+ | Download this file to use as a starting point: {{cs190c:lab5.py|}}. Your job is to take this Monte Carlo estimation of pi (which you did in problem set 2) and use VPython to animate how the points as you generate them. Here is an example of how it would look, although it's still-image, not animated: | ||

+ | |||

+ | {{cs190c:vpython_pi.png|}} | ||

+ | |||

+ | The VPython primitives used are: curve for the circle arc, arrow for the axes, and sphere for the points. | ||

+ | |||

+ | One way to use curve to graph the quarter circle is to use [[http://mathworld.wolfram.com/ParametricEquations.html|parametric equations]]. As you can see from the link, to graph a circle, the formula for each x and y point would be (r*cos(t), r*sin(t)). Since we're only worried about the first quadrant of the circle, then t should vary between 0 and pi/2. So start by making an array of t values like so: | ||

+ | |||

+ | <code python>t = arange(0, math.pi/2, 0.01)</code> | ||

+ | |||

+ | Now, when you specify the points to the curve function, you need to do some sort of manipulation on t (the formula above) to get what you want. You can use the cos function to take the cosine of the entire array (not math.cos) and simply multiply that by 200 to get an array of x values that contain what you want. VPython documentation is [[http://vpython.org/contents/docs/visual/index.html|here]]. |