Javascript – la rotación del lienzo provoca estiramiento.
Por alguna razón, si establece la relación de aspecto del lienzo en 2:1, todo parece normal; cualquier otra relación de aspecto lo hará estirarse.
const canvas = document.getElementById('canvas');
canvas.style.width = '400px';
canvas.style.height = '400px';
canvas.style.border = '2px solid black';
const ctx = canvas.getContext('2d');
const w = canvas.width/4;
const h = canvas.height/4;
var relativeAngle = 0;
//(Target is the position I want it; in this case, right in the middle)
const targetX = canvas.width/2;
const targetY = canvas.height/2;
const targetDist = Math.sqrt(targetX ** 2 + targetY ** 2);
const targetAngle = Math.atan(targetY / targetX) * 180 / Math.PI;
ctx.fillStyle = 'red';
function draw(){
relativeAngle += 3;
let targetRelativeAngle = targetAngle - relativeAngle;
let targetRelativeX = targetDist * Math.cos(targetRelativeAngle * Math.PI / 180);
let targetRelativeY = targetDist * Math.sin(targetRelativeAngle * Math.PI / 180);
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.save();
ctx.rotate(relativeAngle * Math.PI / 180);
ctx.translate(targetRelativeX,targetRelativeY);
ctx.fillRect(-w/2,-h/2,w,h);
ctx.restore();
window.requestAnimationFrame(draw);
}
draw();
¿Cuál es el problema aquí y/o cuál es la mejor manera de hacerlo?
https://jsfiddle.net/1gx7bv3m/
davy.ai
El problema es que cuando la relación de aspecto del lienzo no está establecida en 2:1, el lienzo se estira, lo que distorsiona las formas dibujadas en él. La mejor manera de hacer esto es calcular la relación de aspecto del lienzo y establecer su ancho y alto en función de una relación fija, en lugar de definir un ancho y alto específicos. Esto se puede hacer utilizando el siguiente código:
Este código calcula el ancho y alto del lienzo en función de una relación de aspecto fija y lo establece en el elemento de lienzo. También establece el ancho y alto del lienzo para admitir pantallas de alta resolución, escalándolo utilizando la propiedad
window.devicePixelRatio
. Esto asegura que el lienzo se vea nítido tanto en pantallas regulares como de alta resolución.