2017-11-18 7 views
1

Also schreibe ich einen Code, der es einem Benutzer erlaubt, ein imaginäres Objekt in einem anfänglichen Winkel und einer Geschwindigkeit zu werfen, um zu sehen, ob sie einen Ball (der positionsbasiert ist) erreichen kann auf Benutzereingabe).Notwendigkeit, Projektilbewegung eines geworfenen Balls zu zeichnen

Allerdings habe ich Probleme beim Zeichnen der Kurve des vom Benutzer eingegebenen Winkels und der Geschwindigkeit des imaginären Objekts.

Ich habe eine mathematische Formel verwendet, um die Gesamtzeit und die Reichweite des Objekts zu berechnen. Das heißt:

= 02sin⁡ (2/180) = 20sin⁡ (/ 180)

Ich habe bereits versucht, versucht Bereich zu setzen und die Gesamtzeit in einen Bogen und es auf diese Weise aufgetragen ist. Aber das schien nicht zu funktionieren.

Hier ist der Code:

import java.awt.AWTEvent; 
import java.awt.*; 
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import java.util.Scanner; 
import java.awt.geom.QuadCurve2D; 
public class BallGame extends JFrame { 

    public static void main (String[]args) 
    { 
     Scanner cool= new Scanner(System.in); 
     double angle, speed, range, totalTime; 

     { 
      JFrame frame = new JFrame (" Throwing Ball"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(700,700); 
     } 

     { 
      System.out.println("Please enter the location of the ball (0 < X < 1)"); 
      StdDraw.setPenRadius(0.06); 
      StdDraw.setPenColor(StdDraw.BLUE); 
      double x, y; 
      y = 0; 
      x = cool.nextDouble(); 
      StdDraw.point(x, y); 
     } 

     System.out.println("Please enter an angle of your choosing:"); 
     angle = cool.nextDouble(); 

     System.out.println("Please enter the speed at wish you which to throw the ball"); 
     speed = cool.nextDouble(); 

     double g; 
     g = 9.8; 
     range = Math.pow(speed, 2) * Math.sin(2 * angle * (Math.PI/180)/g); 
     totalTime = (2 * speed * Math.sin(angle * Math.PI/180))/g; 
+0

Warum platzierst du etwas in '{...}'? Normalerweise verwenden Sie solche Blöcke nicht, sie werden hier auch nicht benötigt. – Zabuza

+0

@Zabuza, habe ich bestimmte Teile meines Codes in Klammern gesetzt, um es besser zu machen + es machte den spezifischen Teil meines Codes, der nach Benutzereingaben fragt, um den stationären Ball zu erstellen, der für die Programmarbeit benötigt wird, ohne irgendeinen der vorherigen Fehler zu bekommen Ich hatte vorher, dass es nicht in einer Klammer war, da die X-Variable mir sagen würde, dass es für den Punkt nicht initialisiert wurde und die Benutzereingabe, die für den X-Wert benötigt wird, überhaupt nicht funktionieren würde. Deshalb habe ich Klammern gesetzt. – Yume

+0

siehe: https://stackoverflow.com/help/someone-answers – c0der

Antwort

0

Für eine Kurve zeichnen Sie horizontal (x) und vertikale (y) Position, als Funktion der Zeit berechnen müssen, Startpunkt, Geschwindigkeit und Winkel beginnen. Mit anderen Worten, berechnen Sie die horizontale Entfernung und die vertikale Entfernung. Die Gleichungen sind gut bekannt und widely available.

Sie verwenden diese Gleichungen, um x, y wiederholt zu berechnen und dann neu zu malen.
Siehe die folgende Demonstration. Nicht die Kommentare:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Point2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class BalisticCurve extends JFrame { 

    private static final double G = 9.8; //positive because Y axis is positive going down 
    private int animationSpeed = 5; //millis. The smaller the faster 
    private static int size = 900, ballDiameter = 10; 
    private double startX, startY, ballX, ballY; 
    private double xSpeed, ySpeed, lastPointX, lastPointY; 
    private double time, deltaTime = 0.01 ; //in seconds 
    private List<Point2D> curvePoints= new ArrayList<>(); 
    private Timer timer; 

    BalisticCurve(){ 

     super("Balistic Curve"); 
     DrawBoard board = new DrawBoard(); 
     add(board, BorderLayout.CENTER); 

     ballX= lastPointX = startX = 50; 
     ballY = lastPointY = startY = size - 100; 
     getUserInput(); 

     pack(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 

     timer = new Timer(animationSpeed, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 

       board.moveBall(); 
       board.repaint(); 
       if(! inBounds()) { 
        timer.stop(); 
       } 
      } 
     }); 
     timer.start(); 
    } 

    private void getUserInput() { 

     double angle = 45;//todo replace with user input + verification 
     double speed = 100; 
     xSpeed = speed * Math.cos(angle * (Math.PI/180)); 
     ySpeed = speed * Math.sin(angle * (Math.PI/180)); 
    } 

    private boolean inBounds() { 

     //ignore if ball exceeds height 
     if((ballX < 0) || (ballX > (getWidth())) 
       || (ballY > (getHeight() - ballDiameter))) { 
      return false; 
     } 

     return true; 
    } 

    class DrawBoard extends JPanel { 

     public DrawBoard() { 
      setPreferredSize(new Dimension(size, size)); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 

      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      g2d.setColor(Color.RED); 
      g2d.fillOval((int)ballX,(int)ballY,ballDiameter,ballDiameter); 

      if((Math.abs(lastPointX - ballX)>=1) && (Math.abs(lastPointY - ballY)>=1)) { 
       curvePoints.add(new Point2D.Double(ballX, ballY)); 
       lastPointX = ballX; lastPointY = ballY; 
      } 

      drawCurve(g2d); 
     } 

     private void drawCurve(Graphics2D g2d) { 

      g2d.setColor(Color.BLUE); 
      for(int i=0; i < (curvePoints.size()-1); i++) { 

       Point2D from = curvePoints.get(i); 
       Point2D to = curvePoints.get(i+1); 
       g2d.drawLine((int)from.getX(),(int)from.getY(), (int)to.getX(), (int)to.getY()); 
      } 
     } 

     private void moveBall() { 

      ballX = startX + (xSpeed * time); 
      ballY = startY - ((ySpeed *time)-(0.5 *G * Math.pow(time, 2))) ; 
      time += deltaTime; 
     } 
    } 

    public static void main(String[] args) { 

     new BalisticCurve(); 
    } 
} 

enter image description here

Zögern Sie nicht zu fragen, was nicht klar genug ist.