【问题标题】:Canvas rotate image which depicts an angled ellipse画布旋转图像,描绘有角度的椭圆
【发布时间】:2015-12-16 06:48:18
【问题描述】:

我的画布中有一张图片,我正在尝试以一种不寻常的方式旋转它。我的图像旋转但在错误的原点。

我想以这样一种方式旋转图像,即椭圆显示为从其原点旋转,而不是图像本身旋转。在那里,椭圆最终会在画布中保持静止并简单地旋转。

这是我当前的代码:

var canvas      = document.getElementById('canvas'),
    ctx         = canvas.getContext('2d');

var angle;
var toRads      = Math.PI/180;  
var start       = new Date().getTime();
var rotation    = 15;


function draw(){
    var x         = canvas.width/2 - img.width/2;
    var y         = canvas.height/2 - img.height/2;
    var deltaTime = new Date().getTime() - start;

        start     = new Date().getTime();
        angle     = (angle || 0) + (deltaTime/1000 * rotation);

    if(angle > 360){angle = 0;}

    ctx.clearRect(0,0,canvas.width,canvas.height);

        ctx.save();
        ctx.translate(x,y);
        ctx.rotate(angle * toRads);
        ctx.drawImage(img,20,20);
        ctx.restore();    

    setTimeout(draw,1);
}

我想知道这是否可以在 2D 中完成,还是只能通过 3D(例如 webGL 的东西)完成?

我创建了一个 jsfiddle 我到目前为止: http://jsfiddle.net/hc0p5e06/

【问题讨论】:

    标签: javascript html canvas rotation


    【解决方案1】:

    转换的顺序很重要。您缺少将圆的原点放置在正确点的翻译(假设您想要中心)

       var w = img.width;  // get the image width and height
       var h = img.height;
       ctx.translate(x,y);
       ctx.rotate(angle * toRads);
       ctx.drawImage(img,0,0,w,h,-w/2,-h/2,w,h); // draw the image translated half
                                                 // its size up and left in the new
                                                 // coordinate space
    

    【讨论】:

    • 中心是指图像还是圆形?
    • 你可以在任何你想要的地方制作中心。 drawImage 的第 6 和第 7 个参数应该是您想要旋转的图像上(或关闭)位置的负数。
    • 但问题是,椭圆不是一个完美的圆,所以如果我只想让它旋转,原点会有所不同。如果你把椭圆想象成一个有角度的圆,并且你想让它像轮子一样旋转,我不完全明白该怎么做。
    • 如果您在滚动椭圆之后,您将不得不更改与角度相关的原点。像var yOff = (Math.cos(angle*2)*((w-h)/2))/2; 这样的东西,然后将其添加到第一个翻译 y 坐标中。但是滚动椭圆的轴偏离地面接触点,在移动的汽车上,车轮(椭圆)的旋转速度必须变化,以使汽车保持恒定速度。尝试搜索“滚动椭圆”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多