HTML5 вращение изображения с помощью canvas - PullRequest
5 голосов
/ 19 августа 2011

Как повернуть изображение с помощью функции «Поворот» холста вокруг центра изображения вместо вращения вокруг исходной точки.

Рассмотрим следующий пример:

<html>
    <head></head>
    <body>
        <canvas id="tmp" style="width: 300px; height: 300px; border: 1px red solid" />
        <script type="text/javascript">
            var deg = 0;

            function Draw() {
                var ctx = document.getElementById('tmp').getContext('2d');

                ctx.save();
                ctx.fillStyle = "white";
                ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
                ctx.fillStyle = "red";

                ctx.rotate(deg * 0.0174532925199432957); //Convert to rad's
                ctx.fillRect(50, 50, 20, 20);
                ctx.restore();

                deg+=5;

                setTimeout("Draw()", 50);
            }

            Draw();
        </script>
    </body>
</html>

в этом примере красный квадрат вращается вокруг оргина на 0,0. Скажем, я хотел повернуть квадрат вокруг его центра. Я пытался использовать translate, чтобы переместить его в начало координат, затем повернуть, а затем снова использовать translate, чтобы переместить его обратно, вот так:

        ctx.translate(-(50 + 10), -(50 + 10));    //Move to origin
        ctx.rotate(deg * 0.0174532925199432957); //rotate
        ctx.translate(50, 50);    //move back to original location
        ctx.fillRect(50, 50, 20, 20);
        ctx.restore();

Но похоже, что вызовы функции перевода переопределяют предыдущий перевод и не объединяют преобразования. Как же тогда достичь желаемого эффекта?

1 Ответ

8 голосов
/ 19 августа 2011

Это то, что вы ищете: jsFiddle ?

//Move to center of rectangle
ctx.translate(60, 60);
ctx.rotate(deg * 0.0174532925199432957); //rotate
//Draw rectangle
ctx.fillRect(-10, -10, 20, 20);
ctx.restore();

Обратите внимание, что вы должны использовать Math.PI/180 вместо этого большого десятичного знака.
Я также установил вашwidth и height правильно на холсте, и изменили свой setTimeout, чтобы не использовать eval().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...