【问题标题】:Calculate new width when skewing in canvas在画布中倾斜时计算新宽度
【发布时间】:2012-03-06 01:59:00
【问题描述】:

我正在为一个项目使用画布,并且我有一些我正在倾斜的元素。我只是在 y 值上倾斜,只是想知道倾斜后图像的新宽度是多少(所以我可以将它与另一个画布元素对齐)。查看下面的代码以了解我的意思

ctx.save();
//skew the context
ctx.transform(1,0,1.3,0,0,0);
//draw two images with different heights/widths
ctx.drawImage(image,0,0,42,60);
ctx.drawImage(image,0,0,32,25);

目标是知道 42 x 60 的图像现在是 X x 60 的图像,因此我可以在将其绘制为 0,0 之前进行一些翻译。单独测量每个图像很容易,但是我在整个项目中有不同的倾斜值和高度/宽度需要对齐。目前我使用此代码(适用于 25 到 42 宽度之间的图像):

var skewModifier = imageWidth*(8/6)+(19/3);
var skewAmount = 1.3; //this is dynamic in my app
var width = (skewModifier*skewAmount)+imageWidth;

随着图像变得更宽,尽管这个公式很快就崩溃了(我认为这是一个倾斜的公式,而不是像这样的直值)。关于画布对倾斜有什么想法?

【问题讨论】:

  • 我想我可以这样澄清。给定一个宽度和高度,你能知道图像倾斜到 X 时的新宽度吗?(看起来高度也有影响,即使它只是水平倾斜)。
  • 好吧,我越来越近了。我现在发现,如果我得到图像的对角线长度并将其乘以我的倾斜,我就非常接近正确的值。还没有完全到那里。有什么想法吗?
  • 你真的是指ctx.transform(1,0,1.3,0,0,0); 而不是ctx.transform(1,0,1.3,1,0,0);
  • 是的,我是从我的代码中复制的,实际上我使用 -1 来翻转画布。与这个问题无关,所以我删除了所有额外的位。

标签: javascript html canvas drawimage


【解决方案1】:

将 Simon 的小提琴示例更进一步,因此您可以简单地输入度数:

这是小提琴 http://jsfiddle.net/LBzUt/33/

【讨论】:

    【解决方案2】:

    您应该能够以数学方式推导出它。我相信:

    Math.atan(skewAmount) 是相对于原点倾斜的角度,以弧度表示。

    所以 1.3 会使对象倾斜 0.915 弧度或 52 度。

    所以这是一个红色的未倾斜对象,旁边是同一个倾斜的对象(涂成绿色)。所以你有一个直角三角形:

    我们知道原点角度(0.915 弧度),并且我们知道相邻边长,对于您的两张图像,边长分别为 60 和 25。 (红色的高度)。

    斜边是偏斜的长边。

    而对面是三角底——它被歪了多少!

    如果我记得,Tangent 让我们对面/相邻,所以对于第一个:

    tan(0.915) = opposite / 60,在我们的 JavaScript 代码中解决相反的问题:

    opposite = Math.tan(0.915)*60

    因此,倾斜对象的底部距离原点大约 77 像素。让我们检查一下我们在画布中的工作:

    http://jsfiddle.net/LBzUt/

    我觉得不错!

    有问题的三角形当然是画布原点,我画的那个黑点,以及红色矩形的左下角,这是我们在倾斜之前搜索的原始位置。

    这有点随意的解释。有什么问题吗?

    【讨论】:

    • 我也喜欢这个图表 :D 谢谢你的数学,看起来它对我有用!
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2017-05-18
    • 2012-07-18
    • 2023-03-23
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多