2015-11-16 1 views
0

Я рисую круг в JPanel и используя Swing Timer для обновления x, y координат круга.Перемещение круга по круговой траектории

Как перемещать круг по круговой траектории.

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g.create(); 
    g2d.setColor(Color.RED); 
    Shape planet = new Ellipse2D.Double(x, y, 20, 20); 
    g2d.fill(planet); 
    g2d.dispose(); 
} 



public void actionPerformed(ActionEvent evt) { 
    double R = 200; 
    for (double t = 0; t < 2 * Math.PI; t += 0.01) { 
     x = R * Math.cos(t) + 0; 
     y = R * Math.sin(t) + 0; 
     revalidate(); 
     repaint(); 
    } 
} 
+1

Используйте таймер качания, а не петлю. Например, проверьте [эту ссылку] (http://stackoverflow.com/questions/19476685/java-keyevent-square-movement). –

+0

@HovercraftFullOfEels Из внешнего вида этой функции эта функция рисует круг, а не устанавливает положение на орбите этого кадра. –

+0

@ AimanAl-Eryani: Код имеет гораздо больше ошибок. Во-первых, он не будет компилироваться, так как он использует необъявленную переменную g2d, и поскольку он использует цикл for без заботы о потоке событий Swing. Согласно моему комментарию, нет абсолютно никакого места для цикла for, вызванного потоком событий Swing, в этом коде (или в вашем решении), поскольку из-за правил потоковой передачи Swing это не приведет к какой-либо анимации вообще. Опять же, ему нужно использовать таймер Swing и рассказать нам о проблемах с компиляцией. По внешнему виду он пытался заимствовать код, но не очень хорошо. Он также распоряжается графикой obj –

ответ

1

У вас действительно есть его там.

x = R * Math.cos(t) + 0; 
y = R * Math.sin(t) + 0; 

0s, которые у вас есть, представляют собой центр (x, y соответственно) круга. Поэтому вращать круг вокруг на траектории другой окружной орбиты центра 0,0 и радиуса R2. Значение орбитальной тета (oTheta) будет увеличиваться один раз за кадр.

double R = 200; 
double R2 = 1000; 
oTheta += 0.1; // depending on your framerate, the more you add, the faster it will orbit 
for (double t = 0; t < 2 * Math.PI; t += 0.01) { 
    x = R * Math.cos(t) + 0 + R2 * Math.cos(oTheta); 
    y = R * Math.sin(t) + 0 + R2 * Math.sin(oTheta); 
    revalidate(); 
    repaint(); 
} 
+0

Это дало мне идею. Благодарю. – Sorter

0

Петля не нужна. Таймер вызовет это через определенный интервал и обновит oTheta.

public void actionPerformed(ActionEvent evt) { 
    oTheta += 0.01; 
    x = radius * Math.cos(oTheta) + centerX; 
    y = radius * Math.sin(oTheta) + centerY; 
    revalidate(); 
    repaint(); 
}