2012-06-11 21 views
8

私はJSプロジェクトの初期段階です。 1つの形状の配置を除いて、これまではすべてがうまくいっています。問題の形状は、ティールダイヤモンド(正方形の45度回転)です。私は、画面上の正方形には問題を取得することはできませんが、私は追加するとき:d3.js奇数回転動作

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

正方形が適切に回転しますが、このように、画面の左部分に向けてシフト:

enter image description here

私はこれが起こる原因を確かめていません。それが助け場合は、ここでは、この結果を生成するコードの一部です:

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」属性を置く場合は、四角形が完全に消えます。

この原因は何ですか?私はちょうど私が見ることができない間違った何かをしましたか?

答えて

15

矩形を回転すると、その座標系も回転します。したがって、後でx軸に沿って250を移動すると、回転の結果として、実際には45度の軸に沿って250単位移動します。

rotateと同じようにtransform属性を導入する場合は、この属性を使用してすべての変換を行う必要があります。したがって、"x"属性を使用する代わりにtranslateを使用する必要があります。それで、次のようになります:

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で

+0

ああ、あなたは絶対に正しいです。どうもありがとう。だから今私は正確に中心になる形が必要です。Pythagorean Theormを使用して、断面の長さを見つけ、2で割った。その方程式の結果は、私の翻訳文のy座標として(キャンバスの高さ/もちろん2を引いたもの) 。私はここで変数を使用することができないように見えます。私はそれをどのようにすることができるか知っていますか? – 1080p

+2

正しい順序で変換を行っている限り、ピタゴラスを使用する必要はありません。 'w'と' h'がキャンバスサイズで 'rw'と' rh'がRectのサイズであると仮定すると、これはあなたが求めていることを行うはずです: '.attr(" transform "、" translate( "+(w/2)+」、「+(h/2)+」)は、「(+ r-2)+」)最初にrectの左上を中心に移動し、次に45を回転させて、45度の軸に沿って半分幅と半分の高さに戻します - キャンバスが300x300でrectが100x100の場合: "翻訳する(150,150)回転する(45)翻訳する(-50、-50)" – meetamit

+0

興味深い:私のコードに既にPythagoreanを設定していますが、方法が速ければ交換してもかまいません。ヘルプ。 – 1080p

11

あなたはそれが、このような

250, 100があなたの矩形のxとyの位置でマイナス、それは半径だ
.attr("transform", "rotate(45, 250, 100)"); 

...として、中心から回転して取得する変換の原点を設定する必要があります。一緒にすべてを置くことが

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/

+0

既に回転の答えが得られましたが、あなたのコードスニペットは、回転属性の構文で多くの助けになりました。ありがとうございました – 1080p

+0

ありがとう。 – greg

0

はここでのアプローチは、Duopixelが与えた答えとは少し異なっています。ここでは、XとYの計算を繰り返すわけではありません.Duopixelの例では、単に構造を参照しているだけなので、ささいな改善です。多くの場合、XとYは関数であり、2つの場所でそのログを維持したくない場合があります。 この方法では、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 + ")"; 

       })