2017-01-20 18 views
1

(0,0)以外の点を中心に線を回転しようとしています。OpenGLの点を中心に線を回す

このプログラムでは、glRotatef()を使用せず、三角法を使用しようとしています。しかし、行の長さは常に変化します。

提案がありますか?

これは私のコードです:

public class World implements GLEventListener, KeyListener 
{ 
    double xOne = 0.1; 
    double yOne = 0.1; 
    double xTwo = 0; 
    double yTwo = 0.01; 

    double i = 220.987; 

    public World() 
    { 

    } 

    public void init(GLAutoDrawable gld) 
    { 
     Animator theAnimator = new Animator(gld); 
     theAnimator.start(); 
    } 

    public void display(GLAutoDrawable gld) 
    { 
     GL gl = gld.getGL(); 
     gl.glEnable(gl.GL_BLEND); 
     gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

     gl.glBegin(gl.GL_LINES); 
     gl.glColor3d(1,0,0); 
     gl.glVertex2d(xOne ,yOne); 
     gl.glColor3d(0,0,1); 
     gl.glVertex2d(xTwo, yTwo); 
     gl.glEnd(); 

     gl.glFlush(); 
     //UPDATE 
    } 

    public void reshape(GLAutoDrawable gLAutoDrawable, int _int, int _int2, int _int3, int _int4) 
    { 

    } 

    public void displayChanged(GLAutoDrawable gLAutoDrawable, boolean _boolean, boolean _boolean2) 
    { 

    } 

    public void keyTyped(KeyEvent ke) 
    { 

    } 

    public void keyPressed(KeyEvent ke) 
    { 
     if(ke.getKeyCode() == KeyEvent.VK_SPACE) 
     { 
      xTwo = (Math.cos(Math.toRadians(i))+xOne); 
      yTwo = (Math.sin(Math.toRadians(i))+yOne); 
      i++; 
     } 
    } 

    public void keyReleased(KeyEvent ke) 
    { 

    } 
} 

ところで、(xOne, yOne)通常あなたが(0,0)に変換することによってこれを行うだろう停留点

答えて

1

で、周りに(0,0)を回転させます、翻訳し直します。したがって、それは3段階のプロセスです:

  1. あなたのポイントから(xOne、yOne)を引きます。
  2. 三角法を使用して(0,0)回りに回転を行います。 (私はあなたがすでにこれを行う方法を知っていると仮定しているか、あなたはそれを見ることができます)
  3. あなたのポイントにもう一度追加してください(xOne、yOne)。

あなたの場合、あなたのコードはすでにほぼ正しいと思います。あなたが欠けているのは、行の長さによる乗算です。 xOneとyOneを追加する前に、(xOne、yOne)と(xTwo、yTwo)の間の距離を求め、その距離に正弦値と余弦値を乗算する距離式を使用します。

+0

申し訳ありませんが、私はそれを得ていません – kimchiboy03

+0

@ kimchiboy03それはあまり有益ではありません。助けを求めたい場合は、あなたが理解していないことを教えてください。 – HolyBlackCat

+0

@ kimchiboy03私はあなたの質問に答えましたが、私はあなたのコードを修正するほうが好きだったように思います。私はあなたにもそれのための提案を与えるために私の答えを修正しました。 –

0

変換を理解することは、OpenGLで効果的に作業するための要件です。

変換は、1つのシステムを2つの異なる方法で表現する方法を扱います。したがって、(3,4)にある点は、(3,4)にある「代替宇宙」の(0,0)にある点に変換することができます。ポイントの周りを回転

は非常に簡単です、それは基本的に式

(x', y') = (x-a, y-a) (where x's is the "new x" and x is the "old" x) 

は同様に、これは

(x, y) = (x'+a, y'+a) 

回転変換は

(x', y') = ((x*cos(a) + y*sin(a)), (-x*sin(a)+y*cos(a))) 

ようになり、容易本当に反転させることができますオリジナルの周りのラジアンで回転された点のための新しいx 'とy'を与えますn。

OpenGLで回転するには、最初にすべての点を新しい原点、つまり回転の起点に変換します。その後、その原点を中心に回転します。その後、すべての点を新しい原点から元の原点に戻します。

これはJamesが上記のように、私はちょうどより多くの単語を使用しています。

+0

あなたの提案をありがとう – kimchiboy03

関連する問題