簡體   English   中英

d3.js奇數旋轉行為

[英]d3.js Odd Rotation Behavior

我正處於JS項目的早期階段。 到目前為止,除了一個形狀的定位外,一切都很順利。 所討論的形狀是藍綠色鑽石(正方形旋轉45度)。 我可以讓屏幕上的方塊沒問題,但是當我添加:

    .attr("transform", "rotate(45)")

正方形旋轉正確,但向屏幕的左側部分移動,如下所示:

在此輸入圖像描述

我不確定是什么導致這種情況發生。 如果有幫助,這里有一些產生這個結果的代碼:

var svg = d3.select("body")
            .append("svg")
            .attr("width", w)
            .attr("height", h);
        svg
            .append("rect")
            .attr("transform", "rotate(45)")
            .attr("x", 250)
            .attr("height", w / 10)
            .attr("width", w / 10)
            .attr("fill", "teal")

注意:如果我輸入“y”屬性,則方塊完全消失。

是什么造成的? 我做錯了什么,我看不到?

旋轉矩形時,還可以旋轉其坐標系。 因此,當您稍后沿x軸移動250時,您實際上是沿着45度軸移動250個單位 - 旋轉的結果。

通常,當您為rotate引入transform屬性時,應該通過此屬性執行所有變換。 因此,您需要使用translate而不是使用"x"屬性。 然后它看起來像這樣:

svg
  .append("rect")
  .attr("transform", "translate(250, 0) rotate(45)")
  // remove this: .attr("x", 250)
  .attr("height", w / 10)
  ...

這可以為您提供我認為您正在尋找的結果。 現在請注意,轉換的順序在這里很重要:如果你的變換是"rotate(45) translate(250, 0)" (即先旋轉然后翻譯),你會得到與之前相同的錯誤結果。 那是因為當您首先旋轉時,您的平移將像以前一樣沿着旋轉的x軸發生。

在SVG中,您必須設置變換原點以使其從中心旋轉,例如......

.attr("transform", "rotate(45, 250, 100)");

其中250, 100是x,你的矩形的y坐標減去它的半徑。 把它們放在一起它看起來像......

var svg = d3.select("body")
            .append("svg")
            .attr("width", 400)
            .attr("height", 300);
        svg
            .append("rect")
            .attr("transform", "rotate(30,"+ (diamond.x+diamond.width/2) + ","+ (diamond.y+diamond.width/2) +")")
            .attr("x", diamond.x)
            .attr("y", diamond.y)
            .attr("height", diamond.width)
            .attr("width", diamond.width)
            .attr("fill", "teal")​

您可以在此處查看演示:

http://jsfiddle.net/uwM8u/

這是一種與Duopixel給出的答案略有不同的方法。 在這里,你不是要重復X和Y的計算。在Duopixel的例子中,由於他只是引用一個結構,所以它是一個微不足道的改進。 通常情況下X和Y是函數,我不想在兩個地方保持記錄。 此方法允許您將X和Y設置為節點,然后在所述節點的中心旋轉。

您可能會發現在旋轉之后,您仍然想要調整最終位置,這可以通過另一個變換完成,或者在TEXT的情況下,您可以使用dx,dy。

    svgNode.attr("transform", function (d) {

                    var w = +d3.select(this).attr("x") +  (this.getBBox().width / 2) ;
                    var h = +d3.select(this).attr("y") + (this.getBBox().height / 2);

                    return  "rotate(90," + w + "," + h + ")";

                })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM