An Investigation of 3D Graphics Methods

Similar documents
Midterm Exam Fundamentals of Computer Graphics (COMP 557) Thurs. Feb. 19, 2015 Professor Michael Langer

Curriculum Map: Mathematics

COMP30019 Graphics and Interaction Scan Converting Polygons and Lines

List of NEW Maths content

3. Replace any row by the sum of that row and a constant multiple of any other row.

Year 9: Long term plan

correlated to the Michigan High School Mathematics Content Expectations

YEAR 12 Core 1 & 2 Maths Curriculum (A Level Year 1)

Maths Year 11 Mock Revision list

Instructional Focus: Use unit circles and inverse trigonometric functions

GTPS Curriculum Grade 6 Math

Cecil Jones Academy Mathematics Fundamentals

Spring 2018 Updates. Computing Technology for All. Data Structure Essentials. Digital Design

Tips and Guidance for Analyzing Data. Executive Summary

Integrated Math 1 Module 7 Honors Connecting Algebra and Geometry Ready, Set, Go! Homework Solutions

Process model formulation and solution, 3E4 Computer software tutorial - Tutorial 3

Computer Graphics Prof. Sukhendu Das Dept. of Computer Science and Engineering Indian Institute of Technology, Madras Lecture - 14

The Mathematical Association of Victoria. Trial Examination 2016 FURTHER MATHEMATICS. Written Examination 1 - SOLUTIONS

AQA GCSE Maths - Higher Self-Assessment Checklist

Stage 1 Place Value Calculations Geometry Fractions Data. Name and describe (using appropriate vocabulary) common 2d and 3d shapes

KS4 Curriculum Plan Maths HIGHER TIER Year 9 Autumn Term 1 Unit 1: Number

Bar Graphs and Dot Plots

CAMBRIDGE TECHNOLOGY IN MATHS Year 11 TI-89 User guide

To be a grade 1 I need to

Performance Level Descriptors. Mathematics

New Jersey Core Curriculum Content Standards for Mathematics Grade 7 Alignment to Acellus

CMSC427: Computer Graphics Lecture Notes Last update: November 21, 2014

Mastery. PRECALCULUS Student Learning Targets

Transformations. Ed Angel Professor of Computer Science, Electrical and Computer Engineering, and Media Arts University of New Mexico

Scope and Sequence for the New Jersey Core Curriculum Content Standards

CCSSM Curriculum Analysis Project Tool 1 Interpreting Functions in Grades 9-12

Class #10 Wednesday, November 8, 2017

Introduction to MatLab. Introduction to MatLab K. Craig 1

Bramhall high school Year 9 Assessment descriptor Mathematics

Algebra 2 Semester 2 Final Exam Study Outline Semester 2 Final Exam Study Tips and Information

A = [1, 6; 78, 9] Note: everything is case-sensitive, so a and A are different. One enters the above matrix as

Analytical Modeling of Parallel Systems. To accompany the text ``Introduction to Parallel Computing'', Addison Wesley, 2003.

CS140 Final Project. Nathan Crandall, Dane Pitkin, Introduction:

MRT based Fixed Block size Transform Coding

Edexcel Linear GCSE Higher Checklist

Universiteit Leiden Computer Science

0_PreCNotes17 18.notebook May 16, Chapter 12

Linear algebra deals with matrixes: two-dimensional arrays of values. Here s a matrix: [ x + 5y + 7z 9x + 3y + 11z

Game Architecture. 2/19/16: Rasterization

YEAR 11 GCSE MATHS REVISION CHECKLIST HIGHER TIER

Mathematical Operations with Arrays and Matrices

CSCE 411 Design and Analysis of Algorithms

Big Mathematical Ideas and Understandings

Prentice Hall Mathematics: Course Correlated to: Colorado Model Content Standards and Grade Level Expectations (Grade 6)

Matrix Inverse 2 ( 2) 1 = 2 1 2

Computer Vision I. Announcements. Fourier Tansform. Efficient Implementation. Edge and Corner Detection. CSE252A Lecture 13.

Stage 1 (intervention) Stage 2 Stage 3 Stage 4. Advanced 7-8. Secure 4-6

1 Introduction to Matlab

Integrated Mathematics I Performance Level Descriptors

2. Use elementary row operations to rewrite the augmented matrix in a simpler form (i.e., one whose solutions are easy to find).

GTPS Curriculum Mathematics Grade 8

UNIVERSITY OF OSLO. Faculty of Mathematics and Natural Sciences

T:\Staff Resources\Maths\1 Dept Admin\School website\key Stage 4\GCSE Higher Topic Detail doc 1

CW High School. Advanced Math A. 1.1 I can make connections between the algebraic equation or description for a function, its name, and its graph.

Introduction to Matlab

CARIBBEAN CORRESPONDENCE SCHOOL

Exploring Fractals through Geometry and Algebra. Kelly Deckelman Ben Eggleston Laura Mckenzie Patricia Parker-Davis Deanna Voss

Graphical Methods Booklet

Time Topic What students should know Mathswatch links for revision Number problems and reasoning

Grade 9 Curriculum Map

8.NS.1 8.NS.2. 8.EE.7.a 8.EE.4 8.EE.5 8.EE.6

Computer Graphics: Geometric Transformations

6.4. Arithmetic Sequences. Investigate

Basic Elements. Geometry is the study of the relationships among objects in an n-dimensional space

Themes in the Texas CCRS - Mathematics

9-1 GCSE Maths. GCSE Mathematics has a Foundation tier (Grades 1 5) and a Higher tier (Grades 4 9).

SAS Visual Analytics 8.2: Working with Report Content

Bramhall High school Year 8 Assessment Descriptors Mathematics

OpenVMS Performance Update

KS4 3 Year scheme of Work Year 10 Higher

Year 11 Key Performance Indicators Maths (Number)

technique: seam carving Image and Video Processing Chapter 9

Hegarty Maths Clip Numbers List

Integrated Algebra 2 and Trigonometry. Quarter 1

A Survey of Mathematics with Applications 8 th Edition, 2009

1 to 5 NUMBER Numbers and Operations Place Value, Rounding and Estimation Understanding Products ALGEBRA Expressions and Formulae

round decimals to the nearest decimal place and order negative numbers in context

The p-sized partitioning algorithm for fast computation of factorials of numbers

MEI Casio Tasks for A2 Core

Prentice Hall Mathematics: Pre-Algebra 2004 Correlated to: Colorado Model Content Standards and Grade Level Expectations (Grade 8)

291 Programming Assignment #3

Practices (1) 6.MP.2. Reason abstractly and quantitatively.

Ganado Unified School District Pre-Calculus 11 th /12 th Grade

8 th Grade Mathematics Unpacked Content For the new Common Core standards that will be effective in all North Carolina schools in the

Suggested Foundation Topics for Paper 2

1

Lab 21.1 The Tangent Galvanometer

Agile Mind Mathematics 6 Scope and Sequence, Indiana Academic Standards for Mathematics

Linear Equation Systems Iterative Methods

Chapter 1 Section 1 Solving Linear Equations in One Variable

Geometry. Prof. George Wolberg Dept. of Computer Science City College of New York

The exam begins at 2:40pm and ends at 4:00pm. You must turn your exam in when time is announced or risk not having it accepted.

Algorithm. Lecture3: Algorithm Analysis. Empirical Analysis. Algorithm Performance

Ganado Unified School District Trigonometry/Pre-Calculus 12 th Grade

Honors Precalculus: Solving equations and inequalities graphically and algebraically. Page 1

Transcription:

An Investigation of 3D Graphics Methods Ramesh Srigiriraju Computer Systems Lab 2006-07 June 4, 2007 Abstract The purpose of this research project is to find a way to maximize the speed of a 3D graphics program. To change the runtime speeds, I used different methods to store the matrices used for graphics-related operations (such as rotations, translations, etc.). One storage method involved a matrix expression tree where all the points were recalculated with each rotation and were stored as column vectors. My second storage method stored data as row vectors, while the third calculated the points once at the beginning of the program. The final version that was tested hard-coded the formulas and avoided expression trees altogether. Another area of focus of my program was Z-buffering. After running the Z-buffer algorithm on a set of points, I experimented with four different methods of graphing. The first graphing method simply plotted the points that were visible. The second one drew triangles between the pixels, and the third method combined the first two. The fourth method, which used different schemes for different regions of the graph, worked almost as well as the third. 1 Introduction 1.1 Scope of Study The scope of this program is to allow the user to graph functions of two variables. The program uses homogeneous coordinates and matrices to perform rotations on the graphs while viewing. The function and the bounds of the viewing window are inputted by the user. In order to store the function, the 1

program creates a binary expression tree and substitute in values of the independent variables to determine the value of the function at various points. I used this program to test the speeds of the various data storage methods. Another area of my program involved a matrix editor, which I used to test my matrix expression tree class. This editor allows the user to set the size of a matrix and input data into the cells. After editing the matrix, the user can then perform various operations on it, such as matrix multiplication, Gauss-Jordan elimination, matrix inversion, etc. After creating these two programs, I used them to test the data structures. The first data storage scheme that I used involved a matrix expression tree. This data structure is similar to a binary expression tree, but it stores matrices instead of numbers. The tree would be used to store the matrix expressions needed to rotate my graphs, and it would be evaluated whenever I needed to plot points. The original, unrotated points would be recalculated each time the viewing window updates itself to take into account any changes in screen size. The original data points would also be stored as column vectors. My second data storage scheme was similar to the first one. However, the points would be stored as row vectors instead of column vectors to take advantage of the way Java stores arrays. My third data storage scheme involved calculating the original data points only once at the beginning of the program. Other than that, this storage scheme was similar to my second one. My final data storage scheme involved hard-coding the rotation formulas instead of using matrices. The original data would only be calculated once at the beginning. The graphing calculator module was also used to test various graphing methods for the Z-buffer algorithm. This time, instead of drawing the graph like a wire mesh, the function would be graphed as a continuous surface. In order to fill in tears that appeared in the graph, I used four different graphing schemes. The first scheme simply plotted the data points that were not being obscured by other parts of the function. The second scheme drew triangles between visible points: after the points (x, y, f(x, y)), (x+1, y, f(x+1, y)), and (x, y+1, f(x, y+1)) were rotated, a triangle would be drawn containing these points as its vertices. If any one of the points was being obscured, the triangle would not be drawn. The third scheme combined the first and second schemes, while the fourth scheme used the first scheme for shallow gradients and the second scheme for steep gradients. 2

1.2 Purpose/Relevance The purpose of this research project is to compare different data structures in order to maximize the speed of a 3D graphics program. To do this, I first had to create a binary expression tree class to store expressions. Then, I had to expand this class so that it d store matrix expressions. Next, I had to create a class that allowed the user to perform matrix operations in order to test my matrix expression tree. Finally, I had to create a class that graphed functions of two variables in order to test my data storage schemes. This research is important to others because it s trying to find a way to optimize the processes involved in 3D graphics. Another purpose is to find ways to reduce the presence of whitespace in a 3D graphics program. The same expression tree classes were used, but the graphing calculator class was modified so that it implemented the Z-buffer algorithm. This area of research is also important to others because it s trying to find a way to optimize the performance of the graphing techniques. 2 Background Previous projects concerning this area of research include The Investigation of Graphics in the Processing Language by J. Trent and CityBlock Project: Multi-perspective Panoramas of City Blocks by M. Levoy. The 3D graphics projects used rotation matrices, such as the 2D matrix [[cos(a) -sin(a)] [sin(a) cos(a)]], to rotate graphs by an angle a (Levoy, Trent). However, they didn t seem to indicate how these matrices were stored. Other sources specific to Java programming suggested the use of the format xb instead of Ax for linear transformations, where both the column vector and the matrix get transposed. The purpose of this was to take advantage of the way arrays are stored in Java and to reduce errors (Ameraal). Possible state-of-the art programs could be MatLab or other computer algebra systems or even the 3D-graphing feature of the TI-89. One algorithm that was used in my program was infix traversal. My binary expression trees consisted of a String and two other binary expression trees. The String represented the operation that was being stored, while the subtrees were the two operands. In my infix evaluation, the two subtrees would be evaluated, and the results would be used as inputs to the specified operation. In order to create the binary expression trees, I split up my Strings 3

in the reverse of my order of operations. They would be split up first based on addition and subtraction, then by multiplication and division, then by exponentiation, etc. That way, my order of operations would be preserved when I evaluated the trees. Another algorithm that was used in my program was the Z-buffer algorithm. My program started with a set of discrete points, which would be rotated by certain viewing angles. After the rotation is performed, each point would be mapped to a certain pixel on the screen and then drawn. A Z-buffer algorithm uses an array to keep track of each pixel on the screen. Whenever a point gets mapped to a certain pixel, the algorithm checks the array to see whether the point is closer to the viewer than the point that currently occupies that pixel. In my program, the distance from the viewer is determined by the y-coordinate of the point. If the new point is closer to the old point, the old point is replaced in the array and does not get drawn (Ameraal). 3 Development 3.1 Development Plan My project uses the staged delivery development process, since I have a different plan for each quarter. Every quarter, I have a specific version in mind that has specific functionality. For the first quarter, I planned to just implement a regular calculator module to make sure my infix evaluation algorithms were functioning properly. These recursive algorithms would be used again for my graphing calculator, since the equations would be read in and stored in binary expression trees before graphing. During second quarter, I planned to implement a matrix editing module since the 3D graphics component required the use of matrices. For third quarter, I planned to actually implement my graphing module so that I could test the various data structures. For the fourth quarter, I planned to test the data storage schemes, modify my graphing calculator so that it uses the Z-buffer algorithm, and find ways to eliminate whtiespace. 4

3.2 Testing Requirements The implementation of the binary expression trees was pretty straightforward, so my first criteria for determining success involved the actual parsing of Strings. I had to make sure that the listeners associated with the Enter button followed the correct order of operations and created binary expression trees based on that order. To test the accuracy of my program, I used the TI-83 evaluation algorithm as a standard. My second criteria was to make sure the matrix editing panel and the matrix operations panel interacted correctly so that matrices could be inputted without losing data. For the graphing panel, I had to see whether the program could plot points according to a right-handed set of coordinate axes and apply the relevant matrix operations to rotate the graphs. I also had to measure the amount of lag that resulted for each data storage scheme and see which one resulted in the shortest waiting time. After implementing the Z-buffer algorithm, my final test was to determine the amount of white spaces in the graphs. 3.3 Research Theory and Design Criteria To find out the quickest way to store data, I used four different data structures when graphing my functions. The first data storage scheme that I used involved a matrix expression tree. The tree was used to store the matrix expressions needed to rotate my graphs, and it was evaluated whenever I needed to plot points. The original, unrotated points were recalculated each time the viewing window updated itself to take into account any changes in screen size. The original data points were to be stored as column vectors. My second data storage scheme was similar to the first one. However, the points were be stored as row vectors instead of column vectors. My third data storage scheme involved calculating the original data points only once at the beginning of the program and using row vectors. My final data storage scheme involved hard-coding the rotation formulas and calculating the original points only once. In order to gather my data, I modified one of the listeners for my graphing calculator so that whenever you pressed one of the Rotate buttons, it changes the viewing angles and re-rotates the graph 10,000,000 times. Each time, it executes the method System.nanoTime() before and after repainting the graphing window, since it is in the repaint() process that it performs the viewing transformations. Then, it prints out the elapsed time to a text 5

file. After gathering data for each different data storage scheme, I ran another program to analyze this data. This program ignored the first million data points for each scheme, since the programs tended to run slower at the beginning of the trial period and then reached a steady state after multiple iterations. The analyzer program calculated the average runtime for the remaining 9,000,000 iterations and printed out the results. I decided to go with 9,000,000 iterations to dilute the effects of outliers on the averages. No other programs were running except for the NetBeans IDE v. 4.1. The computer on which I ran my program had 512 MB of RAM and a 1.5 GHz processor. The version of Java used was J2SE 1.5. However, after I realized that my program was leaving data on the RAM each iteration, and was therefore suffering from memory leaks, I had to modify my program. Each iteration, I had to do a garbage collect to clean up the RAM. Because my program wasn t constantly increasing its RAM allocation, it didn t run as fast, so the number of iterations had to be reduced from 10,000,000 to 10,000. To gather data concerning the Z-buffering schemes, I took a screenshot of each running version of my program and used GIMP to crop out the region from (0, 24) to (501, 525). The screenshots that I took were of the function z = graphed on the domain xɛ[ 10, 10], yɛ[ 10, 10], zɛ[ 10, 10] 1 x 2 + y2 viewed from the angles θ =.1, φ = π/4. I then used GIMP to convert the screenshots to PPM format. Since the graphs were being drawn in a monochromatic red, the number of white spaces was determined by the number of pixels with nonzero values of blue and green pixels. 3.4 Runtime Process During the runtime of my third quarter version, the user starts out with this window: 6

Here, the user can input equations to graph and change the window bounds. After pressing the Begin Graphing button, a graph of the function is displayed. The Rotate buttons allow the user to rotate the graph in the specified directions. 4 Results, Conclusion, and Discussion The purpose of this research project is to find a way to maximize the speed of a 3D graphics program. To change the runtime speeds, I used different methods to store the matrices used for graphics-related operations. This research is important to others because it s trying to find a way to optimize 7

the processes involved in 3D graphics. I consider my project to be a success since I obtained enough to compare the performances of each data structure. So far, I have managed to create a working binary expression trees class that can handle logarithmic functions, exponential functions, trigonometric operations, inverse trigonometric operations, and regular arithmetic operations. The trees for non-arithmetic operations only have one subtree since they only take one argument. I created a class that parsed input Strings and broke them up based on an order of operations that I determined. My matrix editor also uses binary expression trees, except this time, the arguments are matriceds instead of doubles. It can handle addition, subtraction, multiplication, and other operations such as matrix inversion and Gauss-Jordan elimination. I also have a working graphing calculator that can store functions in binary expression trees, apply the rotations that are necessary to view the object, and display the data points on the screen. The slowest version of my program involved a matrix expression tree where all the points were recalculated with each rotation and were stored as column vectors (Scheme 1). Each iteration, this scheme took 2685 nanoseconds to rotate a single graph. Storing the points as row vectors instead of column vectors made a significant difference, since this scheme only took 2513 nanoseconds (Scheme 2). Calculating the points once at the beginning of the program seemed to make no appreciable difference in speed, since the runtime per iteration was 2592 nanoseconds (Scheme 3). The change that seemed to make the biggest difference was to get rid of the matrix trees completely and hard-code the rotation formulas, since this scheme only took 2440 nanoseconds per iteration (Scheme 4). I will not include the data points that were collected in this paper, since there are 40 million of them and they took up a total of 240 megabytes. However, there are anomalies in the data. Scheme 3 took longer than Scheme 2, even though it performed fewer flops per iteration. A closer analysis of the data I collected revealed that the runtimes did not stay constant. At the beginning, each program took over 10,000 nanoseconds per iteration to run. After a few iterations, the runtime length would spike, and then it would decrease to 9,000 nanoseconds. After running at 9,000 nanoseconds, the runtime length would spike again and then plateau at an even lower value. This process continued until the programs reached a steady-state. By iteration number 20,000, the runtimes would alternate between 2235 ns and 2514 ns. An calculation of the mode data point confirmed this operation: Schemes 1 and 2 had modes of 2514 ns, while Schemes 3 and 4 had modes of 8

2235 ns. Table 1: Mean and mode runtimes, without the garbage collect Link Scheme 1 Scheme 2 Scheme 3 Scheme 4 Mean Runtime (ns) 2685 2513 2592 2440 Mode Runtime (ns) 2514 2514 2235 2235 One possible explanation for the spike-and-plateau pattern involves the use of memory. Every time I ran the repaint() method, my program left data in the computer s memory. As the Java Virtual Machine started to run out of RAM, it would ask the system for more, which explains the spikes. This increase in RAM allocation allows the program to run faster, which explains the plateaus. One solution to this problem would be to run the garbage collector (System.gc()) every iteration so that the amount of RAM usage stays constant. After rewriting my program so that it did a garbage collect every iteration, I redid the data collection. Because memory leaks were no longer a problem, the data didn t show a spike-and-plateau pattern. However, the programs also ran much slower because the RAM allocation wasn t constantly being increased. Because of the decrease in speed, I had to reduce the number of iterations from 10,000,000 to 10,000. The data indicated that optimiation was having the exact opposite effect that it was intended to have: Scheme 1 ran the fastest, while Scheme 4 was the slowest. The average runtimes were 42,558 ns for Scheme 1; 45,343 ns for Scheme 2; 44,679 ns for Scheme 3; and 50,457 ns for Scheme 4. One would think that these results were caused by outliers, which now have more influence on the averages because there are fewer data points. An analysis of the modes disproves this hypothesis. The median runtimes were 33,803 ns for Scheme 1; 36,876 ns for Scheme 2; and 37,435 ns for Schemes 3 and 4. Another area of research for this project is to test the effectiveness of different drawing schemes for a Z-buffer algorithm. Scheme 1 just plotted the points that were not being obscured by other points. Scheme 2 drew triangles between these points, and Scheme 3 combined Schemes 1 and 2. Scheme 4 implemented Scheme 1 for regions of the function where the gradient was shallow, and Scheme 2 for steeper gradients. 9

An analysis of the screenshots revealed that for Scheme 1, 72.901 percent of the pixels contained nonzero values for blue and green. Although this can include regions of the screenshot that are outside of the function, this also includes white spaces that show up in the graph. Most of the whitespace in Scheme 1 occurred on the asymptote of the function, where the magnitude of the gradient was greater: For Scheme 2, 88.699 percent of the pixels were whitespace. Most of the white spaces occurred in regions of the function where the gradient was shallower. One possible explanation is that in those regions, it is more likely for a point to be obscured by another point, which makes it less likely that a triangle will be drawn: Table 2: Mean and mode runtimes, with garbage collect Link Scheme 1 Scheme 2 Scheme 3 Scheme 4 Mean Runtime (ns) 42,558 45,343 44,679 50,457 Mode Runtime (ns) 33,803 36,876 37,435 37,435 10

For Scheme 3, 65.815 percent of the screen was covered in whitespace. Since it combined Schemes 1 and 2, it worked well for most of the function (both steep and shallow regions). However, a few tears occurred where the magnitude of the gradient was approximately 1: In order to improve runtime efficiency, I created Scheme 4, which uses Scheme 1 for shallow gradients and Scheme 2 for steep gradients. Because 11

it does not run both schemes over the entire viewing window, it should run faster than Scheme 3, although I did not compare their runtime speeds. However, the measures that I included to save time did not compromise perforamnce, since the amount of whitespace only increased to 66.948 percent: Table 3: Percent whitespace Link Scheme A Scheme B Scheme C Scheme D Percent 72.901 88.699 65.815 66.948 The conclusion that I can draw is that the type of data structure being used has a significant impact on the runtime efficiancy of the program. Although the use of a binary search tree allows the user to write neater code, it results in considerable lag when the program runs. The best way to store a matrix is to hard-code the formulas. Areas for future research would involve collecting more data to see if the unexpected results of optimization can be repeated. Another conclusion that I can draw is that the magnitude of the gradient determines the success or failure of different graphing schemes. Areas for future research can include testing other schemes and collecting more data. 12

References [1] M. Levoy, CityBlock Project: Multi-perspective Panoramas of City Blocks, 2006. [2] J. Trent, The Investigation of Graphics in the Processing Language, 2006. [3] L. Ameraal, Computer Graphics for Java Programmers, 1998. 13