【问题标题】:Combining translate and rotate with D3与 D3 结合平移和旋转
【发布时间】:2017-03-30 19:56:13
【问题描述】:

这很可能重复了this SO question 的一些内容,但是代码过于复杂,并且 OP 没有添加解决方案代码。而且这个related question 不再是可复制的。

我试图弄清楚如何以正确的顺序组合旋转和平移。可以围绕原点as in this example 旋转。但是当我们跟随这个平移原始旋转is undone

是否可以为正确的顺序应用构建此结构?

jsfile 代码:

HTML:

<script src="http://d3.geotheory.co.uk/d3-transform.js"></script>

SVG:

var svg = d3.select("body").append("svg")
    .attr("width", 400)
    .attr("height", 300);

//Draw the Rectangle
var rect = svg.append("rect")
    .attr("x", 0).attr("y", 0)
    .attr("width", 50).attr("height", 100)
    .style("fill", "purple");

var rotate = d3.svg.transform().rotate(-45);
var translate = d3.svg.transform().translate(200, 100);

rect.attr('transform', rotate);

var rect2 = rect.attr('transform', rotate);
rect2.attr('transform', translate);

【问题讨论】:

    标签: d3.js


    【解决方案1】:

    如果您希望在 D3 版本 4.x+ 中执行此操作,您可以这样做:

    .attr('transform', 'translate(200,100)rotate(-45)')
    

    https://bl.ocks.org/mbostock/1345853

    【讨论】:

      【解决方案2】:

      您正在创建两个不同的转换。分配一个不会增加另一个。也就是在做

      rect2.attr('transform', translate);
      

      您正在撤消第一个,因为它已被覆盖。

      要同时拥有两者,请将它们都添加到一个转换中,例如

      var rotateTranslate = d3.svg.transform().rotate(-45).translate(200, 100);
      rect2.attr('transform', rotateTranslate);
      

      要动态执行此操作,您需要执行以下操作。

      .attr("transform", function() {
          return d3.svg.transform()
              .translate(200, 100)
              .rotate(-45)
              .translate(-d3.select(this).attr("width")/2, -d3.select(this).attr("height")/2)();
      }
      

      完整的 jsfiddle here.

      【讨论】:

      • 干杯。我之前尝试过链接方法,但它在旋转之前实现了翻译。现在我意识到 d3 正在以相反的顺序(从右到左)应用它们 - 所以它实际上应该是 .translate(200, 100).rotate(-45)
      • 当然旋转是围绕原点,所以需要另一个操作来围绕物体的质心旋转。但是var rotateTranslate = d3.svg.transform().translate(200, 100).rotate(-45).translate(-this.width/2, -this.height/2); 失败(Unexpected value translate(200,100) rotate(-45) translate(NaN,NaN) 解析转换属性。)我认为是因为“this”没有正确引用我们的对象想翻译。你会推荐什么?
      • 您可以在函数中使用它来设置属性,就像其他任何东西一样,例如d3.selectAll("..").attr("transform", function() { return d3.svg.transform().translate(200, 100).rotate(-45).translate(-this.width/2, -this.height/2); });
      • 好的,在小提琴中你没有选择任何东西,所以代码没有运行,但我的例子也不正确。 this.width 不起作用,除非您将宽度显式设置为属性,并且您需要调用 transform 返回的函数。我会更新答案。
      • 感谢 Lars,这很有用
      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多