【问题标题】:Truly rotate center of equilateral triangle in Fabric.js在 Fabric.js 中真正旋转等边三角形的中心
【发布时间】:2014-01-24 12:58:12
【问题描述】:

使用 Fabric.js,我无法真正围绕其中心点旋转三角形,或者至少我认为应该是中心点。我创建了一个 jsFiddle 来演示。三角形很简单,我使用originX: 'center' 和 originY 相同,但是随着三角形旋转,x 和 y 方向仍有轻微移动。如何确保三角形永远不会移动?

我找到了这个答案,想知道这是否是正确的选择? how to rotate around one specified point in fabric.js?

编辑:新的努力包括实施上述链接问题的答案。代码如下:

function createTriangle(x, y, angle)
{

    var t = new fabric.Triangle(
    {
        width: 350,
        height: 300,
        selectable: false,
        fill: 'rgba(0,0,0,0)',
        stroke: 'white',
        strokeWidth: 2,
        left: x,
        top: y,
        angle: angle
    });


    var rotation_origin = new fabric.Point(t.getCenterPoint().x, t.getCenterPoint().y);
    var angle_randians = fabric.util.degreesToRadians(angle);
    var rotatePoint = fabric.util.rotatePoint(new fabric.Point(rotation_origin.x, rotation_origin.y), rotation_origin, angle_randians);

    t.originX = rotatePoint.x;
    t.originY = rotatePoint.y;  
    return t;`
}

但是,这对我不起作用。三角形在旋转时仍然会移动一点。

编辑:我尝试从上面的链接问题中设置指定的旋转点。它对我没有用。三角形旋转完全相同。

EDIT2:随着我深入研究,我开始相信这不仅仅是一个 Fabric.js 问题。看起来更像是 webGL,但不是问题,只是形状转换的方式。我可以看到旋转矩形和三角形之间存在差异。使用中心原点,矩形永远不会出现移动。我还没有找到答案,但我将 webGL 作为标签包含在内,希望能在这方面得到一些帮助。有没有人遇到过这种情况?

【问题讨论】:

    标签: javascript webgl fabricjs


    【解决方案1】:

    fabric.js calculates the centre point 的形状由translating a point in the top left corner 到形状的边界框的中心。边界框的中心不是三角形的中心。

    对于底边位于底部的等腰三角形(两条边的长度相同)——我相信这是 fabric.js 的默认值——三角形的中心点位于三角形高度的三分之一处.

    您可以使用here 描述的方法,通过围绕三角形中心旋转原始左上角来找到形状的新左上角(xy 值)。

    function createTriangle(x, y, angle)
    {
        var width = 350;
        var height = 300;
        var pos = fabric.util.rotatePoint(
            new fabric.Point(x, y),
            new fabric.Point(x + width / 2, y + height / 3 * 2),
            fabric.util.degreesToRadians(angle)
        );
        return new fabric.Triangle(
        {
            width: width,
            height: height,
            selectable: false,
            fill: 'rgba(0,0,0,0)',
            stroke: 'white',
            strokeWidth: 2,
            left: pos.x,
            top: pos.y,
            angle: angle
        });
    }
    

    您需要最新版本的 fabric.js 才能使用。

    【讨论】:

    • 非常感谢您提供的详细信息!实际上,我刚刚发现了一些有趣的东西。似乎增加角度会导致三角形围绕该点旋转,而不是居中和旋转。我尝试了一个测试,在我的requestAnimationFrame 函数中,我决定删除三角形并使用增量角度再次创建它。这种方式使它保持在原地。知道为什么会这样吗?为什么triangle.angle -= 0.2 不等于angle += 1; canvas.remove(triangle); triangle = createTriangle(300, 300, angle); canvas.add(triangle);
    • 想要添加一个更新的fiddle 以向任何需要它的人展示更改以供参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2016-03-19
    • 2013-02-07
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多