在D3.js v4中,删除了d3.transform方法,但没有有关如何替换它的任何提示。有谁知道如何替换以下D3.js v3指令?
d3.transform(String).translate;
编辑2016-10-07: 有关更一般的方法,请参见下面的附录。
根据变更日志,它已消失。transform/decompose.js
不过,中有一个函数,供内部使用进行计算。可悲的是,它没有暴露于外部使用。
也就是说,即使不使用任何D3,也很容易做到:
function getTranslation(transform) {
// Create a dummy g for calculation purposes only. This will never
// be appended to the DOM and will be discarded once this function
// returns.
var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
// Set the transform attribute to the provided string value.
g.setAttributeNS(null, "transform", transform);
// consolidate the SVGTransformList containing all transformations
// to a single SVGTransform of type SVG_TRANSFORM_MATRIX and get
// its SVGMatrix.
var matrix = g.transform.baseVal.consolidate().matrix;
// As per definition values e and f are the ones for the translation.
return [matrix.e, matrix.f];
}
console.log(getTranslation("translate(20,30)")) // simple case: should return [20,30]
console.log(getTranslation("rotate(45) skewX(20) translate(20,30) translate(-5,40)"))
这将g
使用标准DOM方法创建一个用于计算目的的虚拟元素,并将其transform
属性设置为包含转换的字符串。然后.consolidate()
,它调用SVGTransformList
接口以将可能很长的转换列表合并为一个SVGTransform
类型SVG_TRANSFORM_MATRIX
,该类型在其matrix
属性中包含所有转换的简化版本。这种SVGMatrix
每定义保存值,在其属性翻译e
和f
。
使用此功能,getTranslation()
您可以重写D3 v3语句
d3.transform(transformString).translate;
如
getTranslation(transformString);
因为随着时间的推移,这个答案已经引起了人们的兴趣,所以我决定组合一个更通用的方法,该方法不仅可以返回转换,还可以返回转换字符串的所有转换定义的值。基本方法与我上面原始帖子中列出的方法相同,加上从中得到的计算transform/decompose.js
。该函数将返回一个具有所有转换定义属性的对象,就像前一个d3.transform()
一样。
function getTransformation(transform) {
// Create a dummy g for calculation purposes only. This will never
// be appended to the DOM and will be discarded once this function
// returns.
var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
// Set the transform attribute to the provided string value.
g.setAttributeNS(null, "transform", transform);
// consolidate the SVGTransformList containing all transformations
// to a single SVGTransform of type SVG_TRANSFORM_MATRIX and get
// its SVGMatrix.
var matrix = g.transform.baseVal.consolidate().matrix;
// Below calculations are taken and adapted from the private function
// transform/decompose.js of D3's module d3-interpolate.
var {a, b, c, d, e, f} = matrix; // ES6, if this doesn't work, use below assignment
// var a=matrix.a, b=matrix.b, c=matrix.c, d=matrix.d, e=matrix.e, f=matrix.f; // ES5
var scaleX, scaleY, skewX;
if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
return {
translateX: e,
translateY: f,
rotate: Math.atan2(b, a) * 180 / Math.PI,
skewX: Math.atan(skewX) * 180 / Math.PI,
scaleX: scaleX,
scaleY: scaleY
};
}
console.log(getTransformation("translate(20,30)"));
console.log(getTransformation("rotate(45) skewX(20) translate(20,30) translate(-5,40)"));
我正在使用一个具有许多不同库依赖关系的gradle项目,并使用新的清单合并。在我的
我正在使用此Composer包进行需要此包提供的功能的开发。寻找替代方案,我发现这是我最好的选择,因为可用的替代方案太简单了,无法在我处理的时间限制下实现。 现在,我已经在运行PHP 5.5的本地机器(在LinuxWindows 10的子系统上)和运行PHP 5.6的个人服务器上测试了它,但是正式服运行PHP 5.4,由于原因无法升级。 首先我犯了这个错误: 在寻找解决方案时,我遇到了这个问题,因
问题内容: 我在Python中有一个SymPy表达式,我想将其复制并粘贴到Java源代码中。问题在于,对幂有不同的表示法: Java用途; Python使用。 所以我的问题是:有没有办法以“ Java格式”打印SymPy表达式? 问题答案: SymPy有几个专门用于此目的的代码打印机。虽然没有Java代码打印机,但是有一种Javascript打印机。我不能说Java和Javascript是否在每种
问题内容: 我正在从hibernate4.2.17迁移到5.0.7,到目前为止效果还不错,但是似乎该方法已被弃用。我就是不能使用它了。 这是我的代码: 我替换了所有其他方法,但找不到完全替代的方法… 错误消息:该方法是未定义的交易类型 问题答案: 按照5.0 Javadoc :
问题内容: 我需要在contenteditablediv中实现数字的突出显示(将来我会添加更复杂的规则)。问题是当我用JavaScript替换插入新内容时,DOM更改和contenteditablediv失去了焦点。我需要的是将div放在当前位置上,以使注意力集中在div上,这样用户就可以键入而不会出现任何问题,而我的功能只需突出显示数字即可。谷歌搜索我认为Rangy库是最好的解决方案。我有以下代
问题内容: 一个非常简单的小问题,但是我不太明白该怎么做。 我需要将’_’的每个实例替换为空格,并将’#’的每个实例替换为空/空。 我已经试过了: 我真的不喜欢这样的链接命令。还有另一种方法可以做到这一点吗? 问题答案: 使用OR运算符(): 您还可以使用字符类: Fiddle 如果您想用一件事替换哈希值,而用另一件事替换下划线,则只需要链接即可。但是,您可以添加一个原型: 但是为什么不连锁呢?我