2011-06-16 11 views
7

Quiero dibujar una línea vertical que se puede cambiar de tamaño (según el contenido de la página), pero que parece estar dibujada a mano, en lugar de recta.Cómo dibujar una línea irregular/dibujada a mano usando svg/canvas?

Actualmente estoy pensando en usar SVG o Canvas para lograr esto. La línea se ejecutará al costado de mi página web, por lo tanto, debe ser escalable entre la parte superior e inferior del contenedor. ¿Cómo puedo conseguir esto?

+0

Suena complicado. ¿Estás seguro de que no puedes usar una imagen de fondo de repetición? – nkorth

+0

Simplemente repitiendo la y significará que habrá puntos en los que la línea no se alineará a menos que aterrice al final del patrón. – Jeepstone

+0

Bueno, esto acaba de dibujarse con un panel táctil, pero pude hacer que funcione con la herramienta de corte en GIMP: http://jsfiddle.net/nkorth/K6r3u/embedded/result/ – nkorth

Respuesta

10

¿Deseas trazar una línea con jitter?

Intente dibujar un montón de curvas Bezier sucesivas, con todas las partes puntuales del eje Y espaciadas equitativamente, y aleatorice los valores x en cierta cantidad.

He aquí un ejemplo para empezar:

var can = document.getElementById('canvas1'); 
 
var ctx = can.getContext('2d'); 
 

 
function addJitteryBezier(fromx, fromy, tox, toy) { 
 
var diffx = tox - fromx; 
 
var diffy = toy - fromy; 
 
    
 
var neg = Math.random()*diffy/5; // so the x value can go positive or negative from the typical 
 
    
 
    
 
ctx.bezierCurveTo(
 
-neg + fromx + 2*(Math.random()*diffy/8), fromy + .3*diffy, 
 
-neg + fromx + 2*(Math.random()*diffy/8), fromy + .6*diffy, 
 
tox, toy 
 
); 
 
} 
 

 
ctx.beginPath(); 
 
ctx.moveTo(50,0); 
 

 
var i = 0; 
 
while (i < 500) { 
 
    addJitteryBezier(50, i, 50, i+50); 
 
    i+= 50; 
 
} 
 

 
ctx.stroke();
<canvas id="canvas1" width="500" height="500"></canvas>

http://jsfiddle.net/GfGVE/9/

+0

Exactamente lo que estaba empezando a intente, pero no he codificado Canvas por un tiempo. – nkorth

+1

Ejemplo perfecto Simon. Muchas gracias. También encontré http://29a.ch/2010/2/10/hand-drawn-lines-algorithm-javascript-canvas-html5 que estaba bien. El único problema es que donde las líneas a veces se encuentran con las curvas forman un pico. – Jeepstone

+0

Sí, hay formas de evitarlo ... Si el ÚLTIMO punto de control de una curva tiene un valor de X realmente negativo, querrá que el PRIMER punto de control de la siguiente curva tenga un valor positivo. De modo que podría hacer algunas comprobaciones adicionales y asegurarse de que el primer punto de control de la 2da curva sea siempre el signo opuesto. Si eso suena confuso, puedo modificar mi ejemplo para mostrar –

Cuestiones relacionadas