Ваши x и y точки будут по-прежнему равны 0 и -70, поскольку они относятся к переводу (вращению). Это в основном означает, что вам нужно будет «перестроить» матрицу, чтобы получить полученную позицию, которую вы видите на холсте.
Если вы хотите рассчитать линию, которая составляет 70 пикселей при -10 градусов, вы можете использовать простую тригонометрию, чтобы вычислить ее самостоятельно (что проще, чем идти в обратном направлении в матрице).
Вы можете использовать такую функцию, которая принимает ваш контекст, начальную позицию линии (x, y) длины (в пикселях) и угла (в градусах) линии, которую вы хотите нарисовать. Это нарисовать линию и возвращает объект с x
и y
для конечной точки этой линии:
function lineToAngle(ctx, x1, y1, length, angle) {
angle *= Math.PI/180;
var x2 = x1 + length * Math.cos(angle),
y2 = y1 + length * Math.sin(angle);
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
return {x: x2, y: y2};
}
Тогда просто называют его:
var pos = lineToAngle(ctx, 0, 0, 70, -10);
//show result of end point
console.log('x:', pos.x.toFixed(2), 'y:', pos.y.toFixed(2));
Результат:
x: 68.94 y: -12.16
Or вы можете вместо этого расширить контекст canvas, выполнив следующие действия:
if (typeof CanvasRenderingContext2D !== 'undefined') {
CanvasRenderingContext2D.prototype.lineToAngle =
function(x1, y1, length, angle) {
angle *= Math.PI/180;
var x2 = x1 + length * Math.cos(angle),
y2 = y1 + length * Math.sin(angle);
this.moveTo(x1, y1);
this.lineTo(x2, y2);
return {x: x2, y: y2};
}
}
И затем использовать его непосредственно на вашем контексте, как это:
var pos = ctx.lineToAngle(100, 100, 70, -10);
ctx.stroke(); //we stroke separately to allow this being used in a path
console.log('x:', pos.x.toFixed(2), 'y:', pos.y.toFixed(2));
(0 градусов укажут вправо).
Yea, thaks, я сделал это несколько дней назад :) –