HTML5 – Canvas JavaScript Simple Drawing

Slides:



Advertisements
Similar presentations
Cascading Style Sheets
Advertisements

Introduction to JavaScript Module 1 Client Side JS Programming M-GO Sponsored By
HTML 5 Previous version: HTML4.01, 1999 Still work in progress, most browsers support some of it.
Programming games More drawing. Text. Radian measure. Faces. Homework: Do your own drawings. Create index.html file. Upload work.
CANVAS Fundamentals. What is Canvas? Canvas is a medium for oil painting. One of the earliest oils on canvas is a French Madonna from Canvas is.
Chapter 14 Introduction to HTML
Canvas, SVG, Workers Doncho Minkov Telerik Corporation
Web Programming Language Week 13 Ken Cosh HTML 5.
IT Engineering I Instructor: Rezvan Shiravi
JQuery Page Slider. Our goal is to get to the functionality of the Panic Coda web site.Panic Coda web site.
ITP 104.  While you can do things like this:  Better to use styles instead:
Eat Your Words! Creating webpage Layout. CONTENT The Layout of a Webpage HEADER FOOTER Each of these sections represents a ‘div’ (or divider). By linking.
HTML, HTML5 Canvas, JavaScript PART 3 LOOKING MORE CLOSELY AT FULL BLOWN GAME DESIGN A PATTERNED BACKGROUND (CREATED WTIH LOOPS) WITH A MOVING OBJECT CHALLENGES.
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout HTML5 – Canvas.
 This presentation introduces the following: › 3 types of CSS › CSS syntax › CSS comments › CSS and color › The box model.
Getting Started with Canvas IDIA Spring 2013 Bridget M. Blodgett.
Session: 17. © Aptech Ltd. 2Canvas and JavaScript / Session 17  Describe Canvas in HTML5  Explain the procedure to draw lines  Explain the procedure.
Element. The element Used to dynamically draw graphics using javascript. Capable of drawing paths, circles, rectangles, text, and images.
Programming Games Show project. Refresher on coordinates. Scaling, translation. HTML5 logo. Refresher on animation. Bouncing ball. Homework: Do your own.
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout Quick Review.
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout HTML5 – Canvas.
Digital Image Processing
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout HTML5 – Canvas.
INT222 - Internet Fundamentals Shi, Yue (Sunny) Office: T2095 SENECA COLLEGE.
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout Edge Detection:
Programming games Context of what we are doing. Drawing on canvas. Homework: [Complete coin toss examples.] Do your own drawings. Upload files to website.
Digital Image Processing
HTML 5 Hands On By Rohit Ghatol
Programming games Review concepts. Crooked coin toss. Drawing on canvas. Homework: Complete [static] drawings. Upload files to website.
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout Image Processing.
HTML 5 (Part 1) – Start from SCRATCH. HTML 5 – Start from SCRATCH.
HTML5 ProgLan HTML5 Making a Game on the Canvas Part 1.
Brent M. Dingle, Ph.D Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout Color Image.
Chapter 9 HTML 5 Video and Audio
Cascading Style Sheets for layout
Getting Started With HTML
Introduction to.
That Gauge is COOL! 
Internal Style Sheets External Style Sheets
What is a Function Expression?
Internet of the Past.
4.01 Cascading Style Sheets
( Cascading style sheet )
© 2016 Pearson Education, Inc., Hoboken, NJ. All rights reserved.
Canvas Notes
Tutorial 6 Topic: jQuery and jQuery Mobile Li Xu
Cascading Style Sheets for layout
Web Programming Language
Image Warping (Geometric Transforms)
Creating a Baseline Grid
מדעי המחשב ורובוטיקה בחט"ב
ISC440: Web Programming II Ch14: HTML5 Canvas
The Canvas.
Browser Support for HTML5
Introduction to Web Page Design
Programming in JavaScript
Drawing Graphics in JavaScript
Programming in JavaScript
Context of what we are doing.
Graphics Canvas.
Programming games Share your plans for your virtual something.
Creating User Interfaces
Introduction to Web Application Design
4.01 Cascading Style Sheets
CSc 337 Lecture 5: Grid layout.
Web Programming and Design
JavaScript – Let’s Draw!
Getting Started With Web Page Creation Using HTML
Presentation transcript:

HTML5 – Canvas JavaScript Simple Drawing Image Processing HTML5 – Canvas JavaScript Simple Drawing Brent M. Dingle, Ph.D. 2015 Game Design and Development Program Mathematics, Statistics and Computer Science University of Wisconsin - Stout

Lecture Objectives Identify a text editor for coding Identify a web browser for testing Provide Examples Basic HTML5 canvas Simple Drawing and Manipulation in JavaScript

What this is Not To complete your projects You must learn more about HTML5 and JavaScript than what is about to be shown This is an “on-your-own” activity Instructor can help, but you must try on your own A prereq to this course is CS 244 So you have programmed before This stuff is “easy” compared to that =) Likewise on the math topics In Sum: The following is just a place to start More examples will follow throughout the course

Suggested Text Editor Notepad works in Windows TextEdit works on Macs vi and emacs work on LINUX Notepad++ has worked well for students in the past https://notepad-plus-plus.org/ Let the instructor know outside of class if obtaining an editor will be problematic for you You may use what you are comfortable with, but it must result in clean and easy to read (by humans) HTML and javaScript files when the files are opened using editors such as the above

Web Browsers Instructor tends to use Firefox used for grading Others that you should test your stuff with Safari, Chrome, IE… variations of mobile devices Let the instructor know outside of class if testing using Firefox will be problematic for you

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Declares the Type of document being defined

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Declares the Start of the document and the language it is written in/for

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Header portion of your document I suggest using this to “include” your javascript file(s) …Rather than writing code in the html file itself…

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Body portion of your document with a “division” declared

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Creates a canvas on your webpage The id=“myCanvas” is important as your javaScript code will use that id Width and Height are also important to note, They define the size of the canvas display (in pixels) on the webpage

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> The end of your document This HTML file is typical of the ones you will use for this class Most of the changes will be in the size of the canvas, any words/text you want on the page and the rest will (typically) be in the javaScript code file(s)…

Drawing a Rectangle: HTML HTML File: simpleRectangle.html <!DOCTYPE html> <html lang="en"> <head> <script src="simpleRectangle.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="300" height="200"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Questions on the HTML ?

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; theProgram is a Singleton variable object Useful for isolating your functions and ‘global’ variables from other “stuff” that might be on the webpage

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Main is a ‘member’ function of theProgram This helps identify the entry point function which is first called after the webpage loads

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Aside: For what we will be doing this approach is ok… we control the entire page and all things that it will load However… if you are making plugins, you may not want to just take over the window.onload. Instead check if another already has (to avoid race conditions on whose plugin loads first), which means you must hard code a function call directly into the javaScript as it is being loaded (which may have issues too) This would look something like: function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { if (oldonload) { oldonload(); } func(); addLoadEvent(nameOfSomeFunctionToRunOnPageLoad); addLoadEvent(function() { /* more code to run on page load */ }); window.onload is automatically called by the browser This event occurs “after” the html page has been loaded including all the page’s content: images, css, scripts…

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; So… This function’s code is what will be executed when the page finishes loading

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Gets a “handle” to the canvas element on the webpage It is important that the HTML file has a canvas element with id = “myCanvas” If not, then the variable theCanvas will be assigned a non-value and the rest of the code will not run

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Gets a “handle” to the drawing context of theCanvas This context defines where “stuff” will actually be drawn

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Sets the drawing fillstyle to be grey The numbers are hex: RRGGBB

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Draws a filled rectangle with diagonally opposed corners at (0, 0) and (300, 200) In this case this matches the size of the canvas (hence background) The fill color is whatever the current fillstyle is set to

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Draws the edges of a rectangle with diagonally opposed corners at (20, 10) and (80, 60) The line color is whatever the current strokestyle is set to (it defaults to 000000 = black)

Drawing a Rectangle: JS JavaScript File: simpleRectangle.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); ctx.fillStyle = "#aaaaaa"; ctx.fillRect(0, 0, 300, 200); // draw a grey background ctx.strokeRect(20, 10, 80, 60); // draw a black rectangle }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; Questions on the JavaScript?

Challenges for Home Code is available online (zipped) Download and attempt the following Change the background rectangle to be size: 0, 0, 300, 100 Use ctx.scale(s1, s2) to scale the drawn rectangle to be bigger Alter the drawn rectangle to be filled RED

Rotating a Rectangle: HTML loopRotate.html <!DOCTYPE html> <html lang="en"> <head> <script src="loopRotate.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="320" height="240"> Your browser does NOT support canvas! </canvas> </div> </body> </html>

Rotating a Rectangle: HTML loopRotate.html <!DOCTYPE html> <html lang="en"> <head> <script src="loopRotate.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="320" height="240"> Your browser does NOT support canvas! </canvas> </div> </body> </html> JavaScript filename changed from previous example

Rotating a Rectangle: HTML loopRotate.html <!DOCTYPE html> <html lang="en"> <head> <script src="loopRotate.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="320" height="240"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Canvas size changed from previous example

Rotating a Rectangle: HTML loopRotate.html <!DOCTYPE html> <html lang="en"> <head> <script src="loopRotate.js" type="text/javascript"></script> </head> <body> <div> <canvas id="myCanvas" width="320" height="240"> Your browser does NOT support canvas! </canvas> </div> </body> </html> Questions on the HTML ?

Rotating a Rectangle: JS loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; Much the same as in the previous example window.onload = function() { theProgram.Main(); };

Rotating a Rectangle: JS loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; We will be drawing a series of rectangles Each will be colored light-blue / cyan with a thick border line window.onload = function() { theProgram.Main(); };

setTransform loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable window.onload = function() { theProgram.Main(); };

setTransform loopRotate.js Iterative for-loop i counts from 0 to 49 var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; Iterative for-loop i counts from 0 to 49 for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable window.onload = function() { theProgram.Main(); };

setTransform loopRotate.js A ‘time’ parameter t var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; A ‘time’ parameter t controls translation and rotation amounts for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable window.onload = function() { theProgram.Main(); };

setTransform loopRotate.js This is interesting var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable This is interesting window.onload = function() { theProgram.Main(); };

setTransform loopRotate.js This is interesting var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable window.onload = function() theProgram.Main(); }; ctx.setTransform(1,0,0,1,0,0); // reset to identity This is interesting

setTransform loopRotate.js ctx.setTransform(1,0,0,1,0,0); // reset to identity

setTransform loopRotate.js ctx.setTransform(1,0,0,1,0,0); // reset to identity Resets the transform matrix to the identity matrix: Its parameter order is a little strange: setTransform(A, b, c, D, e, f) Conceptually: A Scales the drawings horizontally b Skews the drawings horizontally c Skews the drawings vertically D Scales the drawings vertically e Moves the drawings horizontally f Moves the drawings vertically

Transforms in General setTransform() good for clearing transform matrix back to identity rotate(), translate(), and scale() tend to be more intuitive to use HOWEVER they are cumulative so ORDER matters and what you ALREADY DID matters thus resetting transform matrix back to identity becomes important

translate, scale, rotate loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable Examples of translate() scale() rotate() window.onload = function() { theProgram.Main(); };

translate, scale, rotate loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable Begins or resets a path Needed here to make certain each box is fully drawn window.onload = function() { theProgram.Main(); };

translate, scale, rotate loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable Closes a path Needed here to make certain each box is fully drawn window.onload = function() { theProgram.Main(); };

translate, scale, rotate loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable Without the beginPath and closePath The boxes are all drawn ‘at the same time’ Resulting in a different image window.onload = function() { theProgram.Main(); };

translate, scale, rotate loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable Draws a rectangle with opposing diagonal corners of (0, 0) and (30, 20) Note: It will be transformed based on current Transform Matrix window.onload = function() { theProgram.Main(); };

translate, scale, rotate loopRotate.js var theProgram = { Main: function() theCanvas = document.getElementById("myCanvas"); ctx = theCanvas.getContext("2d"); // grey background ctx.fillStyle="#aaaaaa"; ctx.fillRect(0, 0, 320, 240); // for subsequent boxes: ctx.fillStyle="#00ffff"; ctx.lineWidth = 3; for (var i = 0; i < 50; i++) { var t = i / 50.0; // time parameter [0..1) ctx.setTransform(1,0,0,1,0,0); // reset to identity ctx.translate(10 + 270 * t, 210 - 120 * t); ctx.scale(1 + t * 1.5, 1 + t * 1.5); ctx.rotate(3.5 * t); ctx.beginPath(); ctx.rect(0, 0, 30, 20); ctx.stroke(); ctx.fill(); ctx.closePath(); } }, }; // end theProgram variable Questions on the JavaScript? window.onload = function() { theProgram.Main(); };

Challenges for Home Code is available online (zipped) Download it and experiment Try adding a ctx.transform() call to skew each rectangle before it is drawn Try using ctx.save() and ctx.store() to “push” and “pop” the transform matrix’s state instead of explicitly resetting it to the identity Try other things arcs, gradients, pixel manipulation, pattern fills

Questions? Beyond D2L Examples and information can be found online at: http://docdingle.com/teaching/cs.html Continue to more stuff as needed

Extra Reference Stuff Follows

Credits Much of the content derived/based on slides for use with the book: Digital Image Processing, Gonzalez and Woods Some layout and presentation style derived/based on presentations by Donald House, Texas A&M University, 1999 Bernd Girod, Stanford University, 2007 Shreekanth Mandayam, Rowan University, 2009 Igor Aizenberg, TAMUT, 2013 Xin Li, WVU, 2014 George Wolberg, City College of New York, 2015 Yao Wang and Zhu Liu, NYU-Poly, 2015 Sinisa Todorovic, Oregon State, 2015 Beej’s Bit Bucket / Tech and Programming Fun http://beej.us/blog/ w3schools.com