回転
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,004
コード
public class Applet3DSakura extends Applet implements Runnable{
int AppletX = 500; //アプレットサイズ(x方向)
int AppletY = 500; //アプレットサイズ(y方向)
double Vertex_data[][] = {{-1, 1, 0}, //点P0
{ 0, -1, 0}, //点P1
{ 1, 1, 0} };//点P2
double Screen_data[][] = new double[3][3];//表示頂点
int scale = 100; //描画倍数
double phi; //x軸周りの回転角
double theta; //y軸周りの回転角
double rx, ry, rz; //回転後の頂点座標
Thread thread;
Point point; //表示したい点の座標
/*初期メソッド*/
public void init(){
setSize(AppletX, AppletY);
phi = 0;
theta = 0;
point = new Point(AppletX / 2, AppletY / 2);
}
/*runメソッド呼び出し*/
public void start(){
thread = new Thread(this);
thread.start();
}
/*runメソッド*/
public void run(){
for(int i = 0; i < 100; i++){
try{
Thread.sleep(100);
}
catch(InterruptedException e){
}
phi += Math.PI / 10;
//theta += Math.PI / 10;
setVertexPosition();
repaint();
}
}
/*頂点の座標を更新するメソッド*/
public void setVertexPosition(){
for(int i = 0; i < Vertex_data.length; i++){
//点を回転させる
rx = Vertex_data[i][0] * Math.cos(theta) +
Vertex_data[i][2] * Math.sin(theta);
ry = Vertex_data[i][0] * Math.sin(phi) * Math.sin(theta) +
Vertex_data[i][1] * Math.cos(phi) -
Vertex_data[i][2] * Math.cos(phi) * Math.cos(theta);
rz = - Vertex_data[i][0] * Math.cos(phi) * Math.sin(theta) +
Vertex_data[i][1] * Math.sin(phi) +
Vertex_data[i][2] * Math.cos(phi) * Math.cos(theta);
Screen_data[i][0] = point.x + (rx * scale);
Screen_data[i][1] = point.y - (ry * scale);
Screen_data[i][2] = rz;
}
}
/*描画メソッド*/
public void paint(Graphics g1){
Graphics2D g2 = (Graphics2D)g1;
QuadCurve2D.Double curve1 =
new QuadCurve2D.Double( Screen_data[0][0], Screen_data[0][1],
Screen_data[1][0], Screen_data[1][1],
Screen_data[2][0], Screen_data[2][1]);
g2.setColor(Color.pink);
g2.fill(curve1);
}
}
上のプログラムはある図形(ここでは半円のようなもの)をその場で回転させるプログラムです。
runメソッドの
phi += Math.PI / 10;
theta += Math.PI / 10;
で回転角を決めています
y軸方向の回転はうまくいったのですが、x軸方向の回転がうまくいかず、半円の直線の部分を軸にして回転しています。
x軸方向の回転その場で行うようにするにはどこを変更すればいいのでしょうか?
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/30 11:04
そうですね!
やってみたいと思います!