2017-01-20 66 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)是駐點

回答

1

一般你會通過翻譯要做到這一點(0,0),左右旋轉(0,0) ,並翻譯回來。所以這是一個3步過程:

  1. 從你的觀點中減去(xOne,yOne)。
  2. 使用三角法圍繞(0,0)進行旋轉。 (我假設你已經知道如何做到這一點,或者你可以查看它。)
  3. 將(xOne,yOne)添加回你的點。

就你而言,我認爲你的代碼已經基本正確了。你缺少的是一個乘以該行的長度。使用距離公式找出(xOne,yOne)和(xTwo,yTwo)之間的距離,並在添加xOne和yOne之前將該距離乘以正弦和餘弦值。

+0

對不起,我沒有得到 – kimchiboy03

+0

@ kimchiboy03這不是很豐富。如果你想獲得幫助,告訴我們你不明白的是什麼。 – HolyBlackCat

+0

@ kimchiboy03我回答了你的問題,但回頭看起來好像你會更喜歡我修正你的代碼。我已經修改了我的答案,也給了你一個建議。 –

0

瞭解轉換是在OpenGL中有效工作的要求。

轉換處理如何以兩種不同方式表示一個系統。所以在(3,4)處的一個點可以轉化爲在(0,0)處的一個點,在一個「替代宇宙」中,原點位於(3,4)。

點周圍旋轉是很容易的,這是基本的公式

(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',用於圍繞原點旋轉一個弧度的點ñ。

因此,要在OpenGL中進行旋轉,首先要將所有點轉換爲具有新原點(旋轉的起點)。然後你圍繞該原點旋轉。然後,將所有點從新原點轉換回舊原點。

這就像詹姆斯上面說的,我只是用了更多的單詞。

+0

謝謝你的建議 – kimchiboy03