Zawsze używaj lokalnych współrzędnych do definiowania kształtów.
Podczas renderowania treści, które mają zostać przekształcone, zawartość powinna znajdować się we własnym (lokalnym) układzie współrzędnych. Pomyśl o obrazie. górny lewy piksel ma zawsze 0,0 na obrazie bez względu na to, gdzie go renderujesz. Piksele znajdują się w ich lokalnych współrzędnych, gdy są renderowane, są przenoszone do współrzędnych (świat) płócien poprzez bieżącą transformację.
Więc jeśli uczynić swój kształt ze współrzędnymi ustawiony na swój lokalny, dzięki czemu punkt obrotu na swoim lokalnym pochodzenia (0,0) współrzędne wyświetlane są przechowywane oddzielnie jako świata współrzędne
var shape = {
top: -30, // local coordinates with rotation origin
left: -60, // at 0,0
width: 120,
height: 60,
world : {
x : canvas.width/2,
y : canvas.height/2,
rot : Math.PI/12, // 15deg clockwise
}
};
Teraz don” Trzeba zadzierać z tłumaczeniem do przodu i do tyłu ... blah blah całkowity ból.
Wystarczy
ctx.save();
ctx.translate(shape.world.x,shape.world.y);
ctx.rotate(shape.world.rot);
ctx.fillRect(shape.left, shape.top, shape.width, shape.height)
ctx.restore();
lub wydarzenie szybciej i eliminuje potrzebę stosowania zapisać i przywrócić
ctx.setTransform(1,0,0,1,shape.world.x,shape.world.y);
ctx.rotate(shape.world.rot);
ctx.fillRect(shape.left, shape.top, shape.width, shape.height);
Lokalne pochodzenie kształt (0,0), gdzie jest transformacja umieszcza tłumaczenie.
To znacznie upraszcza wiele prac, które ma być wykonane
var canvas = document.getElementById('canvas');
canvas.width = 300;
canvas.height= 150;
var ctx = canvas.getContext('2d');
ctx.fillStyle = "black";
ctx.strokeStyle = "red";
ctx.lineWidth = 2;
var shape = {
top: -30, // local coordinates with rotation origin
left: -60, // at 0,0
width: 120,
height: 60,
world : {
x : canvas.width/2,
y : canvas.height/2,
rot : Math.PI/12, // 15deg clockwise
}
};
function draw() {
ctx.setTransform(1,0,0,1,0,0); // to clear use default transform
ctx.clearRect(0, 0, canvas.width, canvas.height);
// you were scaling the shape, that can be done via a transform
// once you have moved the shape to the world coordinates.
ctx.setTransform(1,0,0,1,shape.world.x,shape.world.y);
ctx.rotate(shape.world.rot);
// after the transformations have moved the local to the world
// you can ignore the canvas coordinates and work within the objects
// local. In this case showing the unscaled box
ctx.strokeRect(shape.left, shape.top, shape.width, shape.height);
// and a line above the box
ctx.strokeRect(shape.left, shape.top - 5, shape.width, 1);
ctx.scale(0.5,0.5); // the scaling you were doing
ctx.fillRect(shape.left, shape.top, shape.width, shape.height);
}
canvas.addEventListener('click', function() {
shape.width += 15;
shape.left -= 15/2;
shape.world.rot += Math.PI/45; // rotate to illustrate location
// of local origin
var distToMove = 15/2;
shape.world.x += Math.cos(shape.world.rot) * distToMove;
shape.world.y += Math.sin(shape.world.rot) * distToMove;
draw();
});
// no need to use requestAnimationFrame (RAF) if you are not animation
// but its not wrong. Nor do you need to bind this (in this case
// this = window) to the callback RAF does not bind a context
// to the callback
/*window.requestAnimationFrame(draw.bind(this));*/
requestAnimationFrame(draw); // functionaly identical
// or just
/*draw()*/ //will work
body { font-family : Arial,"Helvetica Neue",Helvetica,sans-serif; font-size : 12px; color : #242729;} /* SO font currently being used */
canvas { border: 1px solid red; }
<canvas id="canvas"></canvas>
<p>Click to grow "and rotate" (I add that to illustrate the local origin)</p>
<p>I have added a red box and a line above the box, showing how using the local coordinates to define a shape makes it a lot easier to then manipulate that shape when rendering "see code comments".</p>
To płynął z powodu 'ctx.translate (x, y);' i 'ctx.translate (-x, -y); '. Spróbuj je skomentować! - https://jsfiddle.net/Pugazh/x5gxo1p7/3/ – Pugazh
Potrzebuję przekładów, aby obrócić kształt wokół jego środka. – Jomppe