animacja w Javie - nie dziala tak jak bym chciał

0

Witam, chce napisać animacje w Javie prezentująca układ słoneczny i mam problem, na razie jest tylko "słońce" i jedna planeta która krązy wokół obracającego się slońca. Podczas całej pracy słońce zaczyna się deformować a planeta krążąca zmniejsza swoją odległośc od słońca. Problem jest chyba w tym, iż funkcje rysujące objekty przyjmują zmienne stałoprzecinkowe, a podczas obliczenia nowej pozycji muszę ją rzutować z zmiennaprzecinkowe i błędy zaokrągleń sie kumuluja. Pewny nie jestem i nie mam pomysłu jak by to poprawić. Może ktoś z was forumowicze miałby jakiś pomysł na poprawe tego i się ze mna nim podzielił było by miło :). kod:

 

package animacja;
import java.awt.*;
import javax.swing.*;
import java.lang.Math;
public class Main extends JPanel{
private int x;
private int y;
private int[] Px;
private int[] Py;
private double Sx;
private double Sy;
private double i;
public Main(){

////initialize();
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.YELLOW);
g.fillPolygon(Px,Py,16);
//g.fillOval(Sx,Sy,200,200);
g.setColor(Color.RED);
g.fillOval(x,y,10,10);

//g.drawPolygon(Px,Py,4);
}

class animator implements Runnable{
public void run(){
int i =1;
while(true){
x=(int)(Math.cos(2*Math.PI/180)*(x-400)-Math.sin(2*Math.PI/180)*(y-400) + 400);
y=(int)(Math.sin(2*Math.PI/180)*(x-400)+Math.cos(2*Math.PI/180)*(y-400) + 400);
for(i=0;i<16;++i){
Sx=Px[i];
Sy=Py[i];
Px[i]=(int)(Math.cos(2*Math.PI/180)*(Sx-400)-Math.sin(2*Math.PI/180)*(Sy-400) + 400);
Py[i]=(int)(Math.sin(2*Math.PI/180)*(Sx-400)+Math.cos(2*Math.PI/180)*(Sy-400) + 400);
}
repaint();
try{
Thread.sleep(40);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}

private void initialize(){
i=0;
Sy=getHeight()/2-100;
Sx=getWidth()/2-100;
x=150;
y=150;
Px=new int[16];
Py=new int[16];
Px[0]=400;
Px[1]=425;
Px[2]=450;
Px[3]=450;
Px[4]=500;
Px[5]=450;
Px[6]=450;
Px[7]=425;
Px[8]=400;
Px[9]=375;
Px[10]=350;
Px[11]=350;
Px[12]=300;
Px[13]=350;
Px[14]=350;
Px[15]=375;

Py[0]=300;
Py[1]=350;
Py[2]=350;
Py[3]=375;
Py[4]=400;
Py[5]=420;
Py[6]=450;
Py[7]=450;
Py[8]=500;
Py[9]=450;
Py[10]=450;
Py[11]=425;
Py[12]=400;
Py[13]=375;
Py[14]=350;
Py[15]=350;
}

public void start(){

initialize();
Thread t = new Thread(new animator());
t.start();
}

public static void main(String[] args){

JFrame frame = new JFrame("animacja");
Main a = new Main();
frame.add(a);
//frame.add(new animacja());
frame.setSize(800,800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
a.start();
}
}

0

Zamiast obracać poprzednio wygenerowaną scenę, obracaj oryginalną scenę, ale o coraz większy kąt. Poczytaj sobie o potoku renderowania w OpenGL, tam używa się mnóstwa macierzy, a obiekty które nie są deformowane mają stałe współrzędne punktów w swoim układzie współrzędnych. http://www.songho.ca/opengl/gl_transform.html

0

Witam

A wiesz co to jest podwójne buforowanie?
http://javaboutique.internet.com/tutorials/Java_Game_Programming/index.html
http://www.realapplets.com/tutorial/DoubleBuffering.html

Poczytaj to może pomóc lepiej wyglądać Twojej animacji. Odnosi się to do apletów ale zasada działania jest ta sama.

http://download.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html
a tu inny link
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1