【发布时间】:2017-05-15 09:40:15
【问题描述】:
我正在尝试使用 d3 转换 - 我需要同时进行平移和旋转。 我有原始坐标:
let data = [
{x: 100, y: 100, rotation: 45},
];
和 2 个矩形。一个是先平移,第二个是旋转 首先。
这是绘制矩形后产生的变换:
transform="rotate(45 115 105) translate(100, 100)"
transform="translate(100, 100) rotate(45 115 105)"
它们具有相同的平移和旋转变换,唯一不同的是它们的顺序。
然后我更改数据:
data[0].x += 30;
data[0].y += 20;
data[0].rotation += 45;
而且我希望通过这种转变得到一些转变:
transform="rotate(90 145 125) translate(130, 120)"
transform="translate(130, 120) rotate(90 145 125)"
但我真正得到的是:
transform="translate(150, 110) rotate(90)"
transform="translate(400, 100) rotate(90)"
- 注意它改变了第一个矩形的平移旋转顺序。
- 它还会从旋转变换中移除旋转中心(它是否在过渡期间以某种方式计算它?)
- 它如何得到结果数字?
d3 过渡如何工作?我需要得到一些预期的结果,因为我正在尝试使用一些更高级的转换。
这是一个简单的例子:https://jsfiddle.net/pp6npw4g/2 (点击移动开始过渡)
【问题讨论】:
-
与您的实际问题无关,但只是为了简洁、清晰和排除任何可能的错误来源:在您的 JSFiddle 中,您正在执行
.attr('transform', (d) => transformFunction(d));,它只是将调用包装到transformFunction()进入另一个匿名函数。这基本上相当于.attr('transform', transformFunction);只是传入了对函数的引用。 -
我知道,这只是一个例子。在实际应用程序中,我在那里做更多的事情,而不仅仅是一个函数调用。但你是对的,在这个例子中它可以被简化。
-
没关系!只是很多人对此感到困惑。感谢它保持简单并提供一个精简的示例,而不是仅仅转储你的整个代码!
-
由于你是围绕一个中心而不是原点旋转,你需要实现一个自定义补间函数。看看我的answer 到"D3 SVG transform rotation transition behaving weirdly" 了解更多详情。
标签: javascript d3.js svg transition