webForumDet fria alternativet

Problem med min java applet

4 svar · 597 visningar · startad av Storkatt

StorkattMedlem sedan mars 20073 inlägg
#1

Hej

Det är så att jag försöker skapa en digital katapult (med fysik formler) som en applet, men jag har ett problem jag inte förstår mig riktigt på hur jag ska lösa.

 När programmet ska rita min linje på den tomma vita ytan så får den för sig att

mina variabler x0 är densamma som x1 och y0 är densamma som y1 hela vägen ända tills tråden stannar. Fast jag sätter in x1 gamla värde i x0 och det samma med dem andra. Problemet uppkommer i själva paintfunktionen och jag har kontrollerat det med den kommenterade koden. Är det någon som vet hur man löser detta?

Alltså det är: g.drawLine((int)x0,(int)(this.ritYtaHeight-this.y0),(int)x1,(int)(this.ritYtaHeight-this.y1));
som uppfattar x0 och x1 som samma osv.

// KastRörelse med katapult v. 1
// Av Joel

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.text.*;

public class katapult extends JApplet implements ActionListener,Runnable
{

JPanel ritYta=new JPanel();

JPanel inVarde=new JPanel(new FlowLayout());
JPanel utVarde=new JPanel(new FlowLayout());

JButton skjut=new JButton("Skjut");
JButton rensa=new JButton("Rensa");

JTextField utFart=new JTextField("10 ");
JTextField utVinkel=new JTextField("10 ");
JTextField utHojd=new JTextField("10 ");

JLabel tidPres=new JLabel("Tid: 0 s");
JLabel xyPres=new JLabel("(X,Y): X , Y ");
JLabel fart=new JLabel("Utgångshastighet v0:");
JLabel vinkel=new JLabel("Utgångsvinkel a0:");
JLabel hojd=new JLabel("Utgångshöjd y0:");

// private Timer tim = new Timer(10, this);

Thread tim=new Thread(this);

boolean kor=false;

NumberFormat nf=NumberFormat.getInstance();

Dimension ritYtaSize=ritYta.getSize();

public static double tid=0, a=0, v=0, y0=0, x0, y1=0, x1=0, vX0=0, vY0=0, vX1=0, vY1=0;
public static double g=9.82, dt=0.01;

int ritYtaHeight, ritYtaWidth, kollavit=1;

public void init()
{

  ritYta.setIgnoreRepaint(true);
  
  ritYta.setBackground(Color.white);
  
  getContentPane().setLayout(null);
  
  nf.setMaximumFractionDigits(2);

  skjut.addActionListener(this);
  rensa.addActionListener(this);
  
  utVarde.setSize(600,50);
  ritYta.setSize(600,500);
  inVarde.setSize(600,50);

  utVarde.setLocation(0,0);
  ritYta.setLocation(0,50);
  inVarde.setLocation(0,550);
  
  add(utVarde);
  add(ritYta);
  add(inVarde);
  
  inVarde.add(fart);
  inVarde.add(utFart);
  inVarde.add(vinkel);
  inVarde.add(utVinkel);
  inVarde.add(hojd);
  inVarde.add(utHojd);
  inVarde.add(skjut);
  inVarde.add(rensa);
  
  utVarde.add(tidPres);
  utVarde.add(xyPres);
  
  ritYtaHeight = 500;
  ritYtaWidth = 600;

}

public void run()
{

  while (true)
  {

  	if (kor==true)
  	
  	{
  		
  			
  		innanPaint();
  		
  		repaint();
  		
  		efterPaint();
  		
  		try
  		{
  			tim.sleep(10);
  		}
  		catch(InterruptedException ie)
  		{
  		}
  		
  		
  		if(x0\>= ritYtaWidth \|\| y0\<=0)
  		{
  			if(x0\>=ritYtaWidth)
  			xyPres.setText("(X,Y): "+nf.format(x1)+" , "+nf.format(y0));
  			else
  			xyPres.setText("(X,Y): "+nf.format(x1)+" , "+nf.format(0));
  			
  			kor=false;
  
  		}
  			
  		
  	}	
  }

}

public void actionPerformed(ActionEvent ae)
{

  if(ae.getSource()==rensa)
  {
  	
  	ritYta.setBackground(Color.blue);
  	ritYta.setBackground(Color.white);
  	
  	kor=false;
  	x0=0;
  	tid=0;
  	tidPres.setText("Tid: "+tid+" s");
  	xyPres.setText("(X,Y): ( X , Y )");
  	
  	inVarde.setBackground(Color.gray);
  		utVarde.setBackground(Color.gray);

  	
  }
  
  if(ae.getSource()==skjut)
  {
  	
  	this.a=((Double.parseDouble(utVinkel.getText())) /180.0)\*Math.PI;
  	this.v=Double.parseDouble(utFart.getText());
  	this.y0=Double.parseDouble(utHojd.getText());
  	this.tid=0;

  	this.vX0=v\*Math.cos(this.a);
  	this.vY0=v\*Math.sin(this.a);
  	
  	this.x0=0;

  	kor=true;
  	
  	tim.start();
  	
  }
}

public void paint(Graphics g)
{
	//super.paintComponents(g);
	inVarde.setBackground(Color.gray);
  	utVarde.setBackground(Color.gray);
	g=ritYta.getGraphics();
  g.setColor(Color.black);
  /\*
  if(x0!=0)
  JOptionPane.showMessageDialog(null,(int)x0+" "+(int)(this.ritYtaHeight-this.y0)+" "+(int)this.x1+" "+(int)(this.ritYtaHeight-this.y1));
  \*/
  g.drawLine((int)x0,(int)(this.ritYtaHeight-this.y0),(int)x1,(int)(this.ritYtaHeight-this.y1));

}

public void innanPaint()
{
this.tid=this.tid+this.dt;
tidPres.setText("Tid: "+nf.format(tid)+" s");

  		this.v=Math.sqrt((this.vX0\*this.vX0)+(this.vY0\*this.vY0)) ;
  		this.a=Math.atan(this.vY0/this.vX0);
  		
  		this.vX1=this.vX0;
  		this.vY1=this.vY0-this.g\*this.dt;
  		
  		this.x1=this.x0+this.vX0\*dt;
  		this.y1=this.y0+this.vY0\*dt;
  		
  		xyPres.setText("(X,Y): "+nf.format(this.x1)+" , "+nf.format(this.y1));

}

public void efterPaint()
{

  	this.vX0=this.vX1;
  this.vY0=this.vY1;
  this.x0=this.x1;
  this.y0=this.y1;

}

}

LimeMedlem sedan sep. 2001961 inlägg
#2

Jag ser inte riktigt vad felet är... Den ritar ju korrekt ballistiskt bana.

StorkattMedlem sedan mars 20073 inlägg
#3

Jo jag vet att den gör det. Men saken är att den drar ett litet stäck till säg själv eftersom kordinaterna x0 och x1 tolkas som samma av en konstig anledning. Om man tex testar att sätta utgångshastigheten till 1000 så ser man att det uppkommer prickar istället för linjer och det är problemet

LimeMedlem sedan sep. 2001961 inlägg
#4

Refactoring

Okej... jag gjorde lite refactoring på din kod...

// KastRörelse med katapult v. 1
// Av Joel

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Katapult extends JApplet implements ActionListener{

	private static final long serialVersionUID = 1L;

	JPanel ritYta = new JPanel();

	JPanel inVarde = new JPanel(new FlowLayout());

	JPanel utVarde = new JPanel(new FlowLayout());

	JButton skjut = new JButton("Skjut");

	JButton rensa = new JButton("Rensa");

	JTextField utFart = new JTextField("10 ");

	JTextField utVinkel = new JTextField("10 ");

	JTextField utHojd = new JTextField("10 ");

	JLabel tidPres = new JLabel("Tid: 0 s");

	JLabel xyPres = new JLabel("(X,Y): X , Y ");

	JLabel fart = new JLabel("Utgångshastighet v0:");

	JLabel vinkel = new JLabel("Utgångsvinkel a0:");

	JLabel hojd = new JLabel("Utgångshöjd y0:");

	// private Timer tim = new Timer(10, this);

	boolean paint = false;

	NumberFormat nf = NumberFormat.getInstance();

	Dimension ritYtaSize = ritYta.getSize();

	private Data data = new Data();
					 
	public static double g = 9.82, dt = 0.01;

	int ritYtaHeight, ritYtaWidth, kollavit = 1;

	public void init() {

		ritYta.setIgnoreRepaint(true);

		ritYta.setBackground(Color.white);

		getContentPane().setLayout(null);

		nf.setMaximumFractionDigits(2);

		skjut.addActionListener(this);
		rensa.addActionListener(this);

		utVarde.setSize(600, 50);
		ritYta.setSize(600, 500);
		inVarde.setSize(600, 50);

		utVarde.setLocation(0, 0);
		ritYta.setLocation(0, 50);
		inVarde.setLocation(0, 550);

		add(utVarde);
		add(ritYta);
		add(inVarde);

		inVarde.add(fart);
		inVarde.add(utFart);
		inVarde.add(vinkel);
		inVarde.add(utVinkel);
		inVarde.add(hojd);
		inVarde.add(utHojd);
		inVarde.add(skjut);
		inVarde.add(rensa);

		utVarde.add(tidPres);
		utVarde.add(xyPres);

		ritYtaHeight = 500;
		ritYtaWidth = 600;
		// Det är bra om du sätter ytan på hela appleten även här...
		setSize(800, 600);

	}

	public void drawBalistics() {

		while (paint) {

				data.caculateNext();

				drawBalistic();
				repaint();

				data.stepCoordinates();

				try {
					Thread.sleep(10);
				} catch (InterruptedException ie) {
				}

				if (data.getX_start() >= ritYtaWidth || data.getY_start() <= 0) {
					if (data.getX_start() >= ritYtaWidth)
						xyPres.setText("(X,Y): " + nf.format(data.getX_end()) + " , "
								+ nf.format(data.getY_start()));
					else
						xyPres.setText("(X,Y): " + nf.format(data.getX_start()) + " , "
								+ nf.format(0));

					paint = false;

				}

			}
		}

	

	public void actionPerformed(ActionEvent ae) {

		if (ae.getSource() == rensa) {

			ritYta.setBackground(Color.blue);
			ritYta.setBackground(Color.white);

			paint = false;
			
			

			tidPres.setText("Tid: " + data.getTid() + " s");
			xyPres.setText("(X,Y): ( X , Y )");

			inVarde.setBackground(Color.gray);
			utVarde.setBackground(Color.gray);

		}

		if (ae.getSource() == skjut) {

			data.initiate(utVinkel.getText(),
					utFart.getText(),
					utHojd.getText())
			;
			paint = true;

			drawBalistics();

		}
	}

	public void paint(Graphics g) {
		// super.paintComponents(g);
		inVarde.setBackground(Color.gray);
		utVarde.setBackground(Color.gray);
		g = ritYta.getGraphics();
		g.setColor(Color.black);
		/*
		 * if(data.getX_start()!=0) JOptionPane.showMessageDialog(null,(int)data.getX_start()+"
		 * "+(int)(this.ritYtaHeight-this.y0)+" "+(int)this.x1+"
		 * "+(int)(this.ritYtaHeight-this.y1));
		 */

	}

	private void drawBalistic() {
		Graphics g = ritYta.getGraphics();
		g.drawLine((int) data.getX_start(), (int) (this.ritYtaHeight - data.getY_start()), 
				(int) data.getX_end(),(int) (this.ritYtaHeight - data.getY_end()));
	}

	private class Data {

		private double tid = 0.0;

		private double angle = 0.0;

		private double velocity = 0.0;

		private double y_start = 0.0;

		private double x_start = 0.0;

		private double y_end = 0.0;

		private double x_end = 0.0;

		private double vX0 = 0.0;

		private double vY0 = 0.0;

		private double vX1 = 0.0;

		private double vY1 = 0.0;

		public double getAngle() {
			return angle;
		}

		public void setAngle(double angle) {
			this.angle = angle;
		}

		public double getTid() {
			return tid;
		}

		public void setTid(double tid) {
			this.tid = tid;
		}

		public double getVelocity() {
			return velocity;
		}

		public void setVelocity(double velocity) {
			this.velocity = velocity;
		}

		public double getVX0() {
			return vX0;
		}

		public void setVX0(double vx0) {
			vX0 = vx0;
		}

		public double getVX1() {
			return vX1;
		}

		public void setVX1(double vx1) {
			vX1 = vx1;
		}

		public double getVY0() {
			return vY0;
		}

		public void setVY0(double vy0) {
			vY0 = vy0;
		}

		public double getVY1() {
			return vY1;
		}

		public void setVY1(double vy1) {
			vY1 = vy1;
		}

		public double getX_end() {
			return x_end;
		}

		public void setX_end(double x_end) {
			this.x_end = x_end;
		}

		public double getX_start() {
			return x_start;
		}

		public void setX_start(double x_start) {
			this.x_start = x_start;
		}

		public double getY_end() {
			return y_end;
		}

		public void setY_end(double y_end) {
			this.y_end = y_end;
		}

		public double getY_start() {
			return y_start;
		}

		public void setY_start(double y_start) {
			this.y_start = y_start;
		}
				
		public void initiate(String utVinkel, String utFart, String utHojd)
		{
			
			setAngle(((Double.parseDouble(utVinkel)) / 180.0) * Math.PI);
			setVelocity(Double.parseDouble(utFart));
			
			// Set the first startingpoint.
			setX_start(0);
			setY_start(Double.parseDouble(utHojd));
			setTid(0);

			// Set the vectors.
			setVX0(velocity * Math.cos(angle));
			setVY0(velocity * Math.sin(angle));

		}
		
		public void stepCoordinates() {

			vX0 = vX1;
			vY0 = vY1;
			x_start = x_end;
			y_start = y_end;

		}
		
		public void caculateNext() {
			// Stega tiden...
			tid = tid + Katapult.dt;
			tidPres.setText("Tid: " + nf.format(tid) + " s");

			// Räkna ut nästa fart.
			velocity = Math.sqrt((vX0 * vX0) + (vY0 * vY0));
			angle = Math.atan(vY0 / vX0);

			vX1 = vX0;
			vY1 = vY0 - Katapult.g * Katapult.dt;

			x_end = x_start + vX0 * Katapult.dt;
			y_end = y_start + vY0 * Katapult.dt;

			xyPres.setText("(X,Y): " + nf.format(x_end) + " , "
					+ nf.format(y_end));

		}

	}

}

Det som var det största felet var att paint inte alltid anropas så som du skulle vilja att den görs...

StorkattMedlem sedan mars 20073 inlägg
#5

tack så mycket

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)