Java - Wahadło

0

Witam. Piszę program z programowania w Javie. Napisałem kod, który wyświetla mi wahadło matematyczne, jednak nie wprawia go w ruch. Prosiłbym o pomoc z tym problemem.

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class Wahadlo extends JPanel implements Runnable, KeyListener {

	private static final long serialVersionUID = 1L;

	private Thread animThreat;

	private double t, dt; // t - czas, dt - przyrost czasu
	private int d; // długość wahadła

	private int x0 = 500;
	private int y0 = 500;

	private double alfa; // bieżacy kąt wychylenia
	private double alfa0; // początkowy kąt wychylenia
	boolean ruch = false;

	public Wahadlo(double alfa0, int x0, int y0) {
		setBackground(Color.WHITE);
		setDoubleBuffered(true);

		d = 200;
		t = 0; 
		dt = 0.004;
		x0 = 100;
		y0 = 100;
	
		
		animThreat = new Thread(this);
		animThreat.start();

	}

	public void paint(Graphics g) {

		int x = x0 + (int) (d * Math.sin(alfa));
		int y = y0 + (int) (d * Math.cos(alfa));
		g.drawLine(x0, y0, x, y);
		g.fillOval(x - 10, y - 10, 20, 20);

	}

	public void movement() {

		t += dt; // czas zwiekszony o wartosc przyrostu
		alfa = alfa0 * Math.cos(Math.sqrt(981 / d / 0.0375) * t);// rownanie
			alfa0 = alfa0 + 10;														// wahadla

	}

	public void run() {
		movement();
		while (Thread.currentThread().isAlive()) {
			if (ruch) {
				try {
					Thread.sleep(5);
				} catch (InterruptedException e) {

				}
			}
		}
		repaint();
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}
}
0

Są dwie przyczyny:

  • zmienna logiczna ruch ma wartość false
  • metody movement() i repaint() są wykonywane tylko jeden raz, wrzuć je do pętli
                while (Thread.currentThread().isAlive()) {
                        if (ruch) {
                                try {
                                        Thread.sleep(5);
                                        movement();
                                        repaint();
                                } catch (InterruptedException e) {

                                }
                        }
                }
0

Wprowadziłem uwagi, ale
niestety wahadło jak stało tak stoi.

Teraz to wygląda tak:

import java.awt.Color;
import java.awt.Graphics2D;

import java.awt.Graphics;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class Wahadlo extends JPanel implements Runnable, KeyListener {

private static final long serialVersionUID = 1L;

private Thread animThreat;

private double t, dt; // t - czas, dt - przyrost czasu
private int d; // długość wahadła

private int x0 = 500;
private int y0 = 500;

private double alfa; // bieżacy kąt wychylenia
private double alfa0; // początkowy kąt wychylenia
private boolean ruch = true;

public Wahadlo(double alfa0, int x0, int y0) {
setBackground(Color.WHITE);
setDoubleBuffered(true);

  d = 200;
  t = 0;
  dt = 0.004;

  animThreat = new Thread(this);
  animThreat.start();

}

public void paint(Graphics g) {

  int x = x0 + (int) (d * Math.sin(alfa));
  int y = y0 + (int) (d * Math.cos(alfa));
  g.drawLine(x0, y0, x, y);
  g.fillOval(x - 10, y - 10, 20, 20);

}

public void movement() {

  t += dt; // czas zwiekszony o wartosc przyrostu
  alfa = alfa0 * Math.cos(Math.sqrt(981 / d / 0.0375) * t);// rownanie
  															// wahadla

}

public void run() {

   while (Thread.currentThread().isAlive()) {
         if (ruch) {
                 try {
                         Thread.sleep(5);
                         movement();
                         repaint();
                 } catch (InterruptedException e) {

                 }
         }
 }

}

@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub

}
}

0

U mnie się obraca, ja jeszcze w konstruktorze klasy Wahadlo ustalam rozmiar.

setPreferredSize(new Dimension(800,600));

Jeżeli u Ciebie się nie obraca, to błąd jest poza klasą Wahadlo.

0

W pakiecie mam jeszcze dwie inne klasy Runner i Frame, jednak ja błędu nie widzę :)
Także wklejam te dwie klasy:

Klasa Frame




import javax.swing.JFrame;


public class Frame extends JFrame {
	
	private static final long serialVersionUID = 1L;

	public Frame() {
		setTitle("Wahadło");
		setSize(1000, 1000);
		setResizable(false);
		setLocationRelativeTo(null);
		
		initGUI();
	}
	
	public void initGUI() {
		Wahadlo wahadlo = new Wahadlo(0.005, 500, 500);
		add(wahadlo);
		this.addKeyListener(wahadlo);
	}
}




 

Klasa Runner


public class Runner {

	public static void main(String[] args) {
		Frame f = new Frame();
		f.setVisible(true);
	}

}



 
0

W nowej wersji klasy Wahadlo popsułeś funkcję movement().

0

Zgadza się, ale jeśli dodam do movementu:
" alfa0 = alfa0 + 10; "

To wychodzi mi takie coś jak w załączniku, a mi chodzi o wahadło :) Muszę mieć gdzieś błąd w obliczeniach w tym równaniu wahadła... Niestety nie widzę tego błędu.

0

Zgadzam się, masz źle.
Napisałem

W metodzie paint() brakuje Ci (w pierwszym wierszu) super.paint(g).
Uzupełniłeś?
Reszta to fizyka.

0

Działa super :) Dzięki za pomoc :)

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