ページ 1 / 1
javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 13:58
by tg
時計を作るためにーーーーという文字を三つほど別々に回転させたいんですけど
一緒に回転してしまいます
これはどうやって解決すればいいでしょうか。
コードの一部分を載せます
コード:
Graphics2D g1 = (Graphics2D) g;
g1.rotate(( Math.PI * times) / 15, cx, cy); //timesは他の処理により毎秒増えていきます。cx,cyも他の場所で指定されています
String=str"--";
g1.drawString(str, cx, cy);
//↑で一部分の描画をしてます
これとは別に文字を描画したい場合
Graphics2D g2=(Graphics2D) g;
g2.rotate((Math.PI*times)/20,cx,cy);
String str1="---";
g2.drawString(str1,cx,cy);
コードはすべて載せるわけにはいかないので一部分だけの処理になってしまいました。
何かいい方法を教えてください
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 16:35
by ISLe
Graphics2D#rotateで回転させるとコンテキストは回転したままの状態になります。
次にGraphics2D#rotateで回転させるときは以前の状態から継続した変化になります。
ひとつずつ希望の角度で描画するには、描画した後に回転を元に戻してやる必要があります。
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 16:59
by tg
すみません
ちょっとよくわからなかったので
例のソースコードを挙げてもらってよろしいでしょうか?
戻してしまったら前のも戻ってしまうような気がするんですけど
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 17:43
by ISLe
一部分ですが。
コード:
double rad; // 回転角度
Graphics2D g2 = (Graphics2D)g;
for (int i=0; i<360; i+=90) {
String s = "--- " + i + "度";
rad = Math.PI * 2 * i / 360;
g2.rotate(rad, cx, cy); // 正回転
g2.drawString(s, cx, cy);
g2.rotate(-rad, cx, cy); // 逆回転
}
Graphics2D#rotateは、概念としては、キャンバスを回転させるのであって、描画する内容を回転させるのではありません。
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 17:47
by tg
そうですか
最終的にはこれを使ってアナログ時計を作ろうと思ってるんですけど
難しいでしょうか?
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 18:22
by ISLe
tg さんが書きました:難しいでしょうか?
どうしてそう思うのでしょう。
コード:
double rad; // 回転角度
Graphics2D g2 = (Graphics2D)g;
rad = (短針の角度);
g2.rotate(rad, cx, cy); // 正回転
(短針を(cx,cy)中心に12時の向きに描画)
g2.rotate(-rad, cx, cy); // 逆回転
rad = (長針の角度);
g2.rotate(rad, cx, cy); // 正回転
(長針を(cx,cy)中心に12時の向きに描画)
g2.rotate(-rad, cx, cy); // 逆回転
rad = (秒針の角度);
g2.rotate(rad, cx, cy); // 正回転
(秒針を(cx,cy)中心に12時の向きに描画)
g2.rotate(-rad, cx, cy); // 逆回転
というふうにするだけですが。
逆変換を嫌うのであれば、変換対象をAffineTransformにして描画直前にGraphics2Dにセットすると良いでしょう。
AffineTransformを複製、複製したほうをさらに変換し描画前にGraphics2Dにセット、描画後に複製元をセット、という手順で逆変換は不要になります。
ただし、AffineTransformのスタックのようなコードを書くことになるのでコードは現在のものよりそうとう複雑になると思います。
針の描画コードはそのままで、時計全体を回転させたりすることもできるので、元に戻す手間はむしろ必要なのです。
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 19:00
by tg
逆回転の前に描画して
radに計算式を入れればいいってことですか
なんとなく理解しました
Re: javaのGrahics2Dのrotateメソッドについて
Posted: 2013年7月27日(土) 20:56
by tg
ありごとうございました