当前位置: 首页 > 面试题库 >

在D3 v4中替换d3.transform

齐意致
2023-03-14
问题内容

在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每定义保存值,在其属性翻译ef

使用此功能,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 如果您想用一件事替换哈希值,而用另一件事替换下划线,则只需要链接即可。但是,您可以添加一个原型: 但是为什么不连锁呢?我