javaのGrahics2Dのrotateメソッドについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tg

javaのGrahics2Dのrotateメソッドについて

#1

投稿記事 by tg » 12年前

時計を作るためにーーーーという文字を三つほど別々に回転させたいんですけど
一緒に回転してしまいます
これはどうやって解決すればいいでしょうか。


コードの一部分を載せます

コード:

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);
コードはすべて載せるわけにはいかないので一部分だけの処理になってしまいました。
何かいい方法を教えてください

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: javaのGrahics2Dのrotateメソッドについて

#2

投稿記事 by ISLe » 12年前

Graphics2D#rotateで回転させるとコンテキストは回転したままの状態になります。
次にGraphics2D#rotateで回転させるときは以前の状態から継続した変化になります。

ひとつずつ希望の角度で描画するには、描画した後に回転を元に戻してやる必要があります。

tg

Re: javaのGrahics2Dのrotateメソッドについて

#3

投稿記事 by tg » 12年前

すみません
ちょっとよくわからなかったので
例のソースコードを挙げてもらってよろしいでしょうか?

戻してしまったら前のも戻ってしまうような気がするんですけど

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: javaのGrahics2Dのrotateメソッドについて

#4

投稿記事 by ISLe » 12年前

一部分ですが。

コード:

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は、概念としては、キャンバスを回転させるのであって、描画する内容を回転させるのではありません。

tg

Re: javaのGrahics2Dのrotateメソッドについて

#5

投稿記事 by tg » 12年前

そうですか
最終的にはこれを使ってアナログ時計を作ろうと思ってるんですけど
難しいでしょうか?

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: javaのGrahics2Dのrotateメソッドについて

#6

投稿記事 by ISLe » 12年前

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のスタックのようなコードを書くことになるのでコードは現在のものよりそうとう複雑になると思います。


針の描画コードはそのままで、時計全体を回転させたりすることもできるので、元に戻す手間はむしろ必要なのです。

tg

Re: javaのGrahics2Dのrotateメソッドについて

#7

投稿記事 by tg » 12年前

逆回転の前に描画して
radに計算式を入れればいいってことですか
なんとなく理解しました


閉鎖

“C言語何でも質問掲示板” へ戻る