2017-01-20 9 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) , и перевод обратно. Так что это трехэтапный процесс:

  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) 

Rotation преобразования выглядят как

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

который дает вам новые x 'и y' для точки, повернутой радианами вокруг origi п.

Итак, чтобы повернуть в OpenGL, вы сначала преобразуете все точки в новое происхождение, происхождение вращения. Затем вы вращаетесь вокруг этого источника. Затем вы переводите все точки от нового источника обратно к старому.

Как и Джеймс сказал выше, я просто использую больше слов.

+0

Спасибо за ваше предложение – kimchiboy03