<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="utf-8"> <title>Drawing with text</title> <meta name="keywords" content="geovindu"> <meta name="description" content="涂聚文"> <meta name="author" content="Tim Holman"> <style type="text/css"> @import "compass/css3"; html, body { 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; } </style> </head> <body> <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 --> <script type="text/javascript"> //A PEN BY Tim Holman //https://onaircode.com/awesome-html5-canvas-examples-source-code/ // 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 = "中国人民解放了!中国人站起来了!涂聚文(Geovin Du),明者因事而变,知者随事而制!--《盐铁论》。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(); </script> </body> </html>