Основная проблема в том, что вы определяете стол и текст как абсолютные координаты.
Определить объекты в локальной системе координат.Например, у стола есть высота и ширина, но нет позиции.Его ничья относительно себя (около 0,0)
const desk = {
w : 10, h : 10,
color : "blue",
draw() {
ctx.fillStyle = this.color;
ctx.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);
}
};
Затем вы можете расположить стол в мировой системе координат (холст), указав, где будет находиться его центр.
function drawObj(obj, x, y) { // what to draw and where
ctx.setTransform(1,0,0,1,x,y); // Same as ctx.translate if 2D API is in default context
// The means you do not have to use ctx.save and
// ctx.restore in this function
obj.draw(); // draw desk
}
Для полного преобразования это почти то же самое
function drawObj(obj, x, y, scale, rotate) { // rotate is in radians
ctx.setTransform(scale, 0, 0, scale, x, y);
ctx.rotate(rotate);
obj.draw();
}
Чтобы добавить текст, вы можете добавить его в качестве объекта на стол и нарисовать его в собственной локальной системе координат
desk.name = {
text : "Desk",
color : "black",
font : "bold " + 20 + "px Calibri",
draw() {
ctx.font = this.font;
ctx.textAlign = "center";
ctx.fillStyle = this.color;
ctx.fillText(this.text, 0,0);
}
};
Теперь вы можете нарисовать стол и имя, используя функцию рисования объекта
drawObj(desk,200, 200, 1, Math.PI / 2); // Draw at 200,200 rotated 90deg CW
drawObj(desk.name, 200, 200, 1, Math.PI / 2); // draw the text rotated same and centered over desk
// Or if the text should be above and not rotated
drawObj(desk.name, 200, 200 - 30, 1, 0);
Поскольку в вышеприведенных функциях используется setTransform
, вам может понадобиться восстановить преобразование.Есть два способа сделать это.
ctx.resetTransform(); // Check browser support for this call
ctx.setTransform(1,0,0,1,0,0); // same as above just does it manaly