Si bien esto es una especie de seguimiento de la respuesta anterior, agrega un poco (con suerte).
Principalmente lo que quiero aclarar es que generalmente pensamos en dibujar cosas como draw a rectangle at 10, 3
.
Así que si pensamos en eso de esta manera: move origin to 10, 3
, entonces draw rectangle at 0, 0
. Entonces todo lo que tenemos que hacer es agregar un giro en el medio.
Otro punto importante es la alineación del texto. Es más fácil dibujar el texto en 0, 0, por lo que usar la alineación correcta puede permitirnos hacer eso sin medir el ancho del texto.
Todavía deberíamos mover el texto por una cantidad para centrarlo verticalmente, y desafortunadamente el lienzo no tiene gran soporte de altura de línea, así que eso es algo de adivinar y verificar (corríjanme si hay algo mejor).
He creado 3 ejemplos que proporcionan un punto y un texto con 3 alineaciones, para mostrar cuál es el punto real en la pantalla donde irá la fuente.
var font, lineHeight, x, y;
x = 100;
y = 100;
font = 20;
lineHeight = 15; // this is guess and check as far as I know
this.context.font = font + 'px Arial';
// Right Aligned
this.context.save();
this.context.translate(x, y);
this.context.rotate(-Math.PI/4);
this.context.textAlign = 'right';
this.context.fillText('right', 0, lineHeight/2);
this.context.restore();
this.context.fillStyle = 'red';
this.context.fillRect(x, y, 2, 2);
// Center
this.context.fillStyle = 'black';
x = 150;
y = 100;
this.context.save();
this.context.translate(x, y);
this.context.rotate(-Math.PI/4);
this.context.textAlign = 'center';
this.context.fillText('center', 0, lineHeight/2);
this.context.restore();
this.context.fillStyle = 'red';
this.context.fillRect(x, y, 2, 2);
// Left
this.context.fillStyle = 'black';
x = 200;
y = 100;
this.context.save();
this.context.translate(x, y);
this.context.rotate(-Math.PI/4);
this.context.textAlign = 'left';
this.context.fillText('left', 0, lineHeight/2);
this.context.restore();
this.context.fillStyle = 'red';
this.context.fillRect(x, y, 2, 2);
La línea this.context.fillText('right', 0, lineHeight/2);
es básicamente 0, 0
, salvo que nos movemos un poco para el texto que se va centrada cerca del punto
¿Ha reflexionado sobre mirar en soluciones gráficas existentes en lugar de tratar de construir su propia ? flot (http://code.google.com/p/flot/) es un ejemplo que usa lienzo. – Bartek