Draw on the html5 canvas using text as your medium.
A Pen by Tim Holman on CodePen.
Draw on the html5 canvas using text as your medium.
A Pen by Tim Holman on CodePen.
<canvas id='canvas'></canvas> | |
<span id='info'>Click and drag to draw!<span> | |
<!-- | |
Drawing with text: | |
- Click and drag to draw. | |
- Double click to clear. | |
Ported from java at http://www.generative-gestaltung.de | |
by Tim Holman - @twholman | |
--> |
// Drawing with text. Ported from Generative Design book - http://www.generative-gestaltung.de - Original licence: http://www.apache.org/licenses/LICENSE-2.0 | |
// Application variables | |
var position = {x: 0, y: window.innerHeight/2}; | |
var counter = 0; | |
var minFontSize = 3; | |
var angleDistortion = 0; | |
var letters = "There was a table set out under a tree in front of the house, and the March Hare and the Hatter were having tea at it: a Dormouse was sitting between them, fast asleep, and the other two were using it as a cushion, resting their elbows on it, and talking over its head. 'Very uncomfortable for the Dormouse,' thought Alice; 'only, as it's asleep, I suppose it doesn't mind.'"; | |
// Drawing variables | |
var canvas; | |
var context; | |
var mouse = {x: 0, y: 0, down: false} | |
function init() { | |
canvas = document.getElementById( 'canvas' ); | |
context = canvas.getContext( '2d' ); | |
canvas.width = window.innerWidth; | |
canvas.height = window.innerHeight; | |
canvas.addEventListener('mousemove', mouseMove, false); | |
canvas.addEventListener('mousedown', mouseDown, false); | |
canvas.addEventListener('mouseup', mouseUp, false); | |
canvas.addEventListener('mouseout', mouseUp, false); | |
canvas.addEventListener('dblclick', doubleClick, false); | |
window.onresize = function(event) { | |
canvas.width = window.innerWidth; | |
canvas.height = window.innerHeight; | |
} | |
} | |
function mouseMove ( event ){ | |
mouse.x = event.pageX; | |
mouse.y = event.pageY; | |
draw(); | |
} | |
function draw() { | |
if ( mouse.down ) { | |
var d = distance( position, mouse ); | |
var fontSize = minFontSize + d/2; | |
var letter = letters[counter]; | |
var stepSize = textWidth( letter, fontSize ); | |
if (d > stepSize) { | |
var angle = Math.atan2(mouse.y-position.y, mouse.x-position.x); | |
context.font = fontSize + "px Georgia"; | |
context.save(); | |
context.translate( position.x, position.y); | |
context.rotate( angle ); | |
context.fillText(letter,0,0); | |
context.restore(); | |
counter++; | |
if (counter > letters.length-1) { | |
counter = 0; | |
} | |
//console.log (position.x + Math.cos( angle ) * stepSize) | |
position.x = position.x + Math.cos(angle) * stepSize; | |
position.y = position.y + Math.sin(angle) * stepSize; | |
} | |
} | |
} | |
function distance( pt, pt2 ){ | |
var xs = 0; | |
var ys = 0; | |
xs = pt2.x - pt.x; | |
xs = xs * xs; | |
ys = pt2.y - pt.y; | |
ys = ys * ys; | |
return Math.sqrt( xs + ys ); | |
} | |
function mouseDown( event ){ | |
mouse.down = true; | |
position.x = event.pageX; | |
position.y = event.pageY; | |
document.getElementById('info').style.display = 'none'; | |
} | |
function mouseUp( event ){ | |
mouse.down = false; | |
} | |
function doubleClick( event ) { | |
canvas.width = canvas.width; | |
} | |
function textWidth( string, size ) { | |
context.font = size + "px Georgia"; | |
if ( context.fillText ) { | |
return context.measureText( string ).width; | |
} else if ( context.mozDrawText) { | |
return context.mozMeasureText( string ); | |
} | |
}; | |
init(); |
@import "compass"; | |
html, body { | |
width: 100%; | |
height: 100%; | |
margin: 0px; | |
overflow: hidden; | |
&:hover { | |
span { | |
display: none; | |
} | |
} | |
} | |
canvas { | |
cursor: crosshair; | |
} | |
span { | |
font-family: 'Georgia', cursive; | |
font-size: 40px; | |
position: fixed; | |
top: 50%; | |
left: 50%; | |
color: #000; | |
margin-top: -40px; | |
margin-left: -200px; | |
} |