Heim  >  Artikel  >  Java-Ball-Bewegung: Unerwartetes Verhalten der Grenzreflexion

Java-Ball-Bewegung: Unerwartetes Verhalten der Grenzreflexion

王林
王林nach vorne
2024-02-22 13:30:081103Durchsuche

PHP-Editor Xigua stellt Ihnen die Java-Q&A-Reihe vor. In dieser Ausgabe wird das unerwartete Verhalten der Grenzreflexion bei der Java-Ball-Bewegung erörtert. Während des Programmierprozesses stoßen wir oft auf verschiedene unerwartete Situationen, insbesondere auf komplexere physikalische Simulationsprobleme. Dieser Artikel analysiert für Sie das unerwartete Verhalten, das während der Grenzreflexion bei der Java-Ball-Bewegung auftreten kann, hilft Ihnen dabei, solche Probleme besser zu verstehen und zu bewältigen und Ihre Programmierkenntnisse zu verbessern.

Frageninhalt

`Frage:

Ich entwickle ein Java-Programm, in dem ich die Bewegung eines Balls in einer Box simuliere. Verwenden Sie die Vektorreflexionsformel, um zu erwarten, dass der Ball von den Grenzen der Box reflektiert wird. Allerdings ist mir ein unerwartetes Verhalten aufgefallen, der Ball ging nicht nur ins Aus, sondern veränderte auch seltsamerweise seine Position.

Problembeschreibung:

Ich habe grundlegende Geradengleichungen (x=x0+at, y=y0+bt, z=z0+ct) verwendet, um die Bewegung des Balls zu erreichen. Ich vermute, dass das Problem bei dem Teil des Codes liegt, der für die Erkennung von Kollisionen und die Aktualisierung der Ballbahn verantwortlich ist. `

import java.util.Scanner;
import java.lang.Math;

public class test {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Get initial positions for ball 1
        System.out.print("Enter ball 1's initial x-coordinate (x): ");
        double x1 = scanner.nextDouble();
        System.out.print("Enter ball 1's initial y-coordinate (y): ");
        double y1 = scanner.nextDouble();
        System.out.print("Enter ball 1's initial z-coordinate (z): ");
        double z1 = scanner.nextDouble();
        System.out.print("Enter ball 1's radius(r): ");
        double r1 = scanner.nextDouble();

        // Get direction vectorfor ball 1
        System.out.print("Enter direction in x-coordinate (a): ");
        double a = scanner.nextDouble();
        System.out.print("Enter direction in y-coordinate (b): ");
        double b = scanner.nextDouble();
        System.out.print("Enter direction in z-coordinate (c): ");
        double c = scanner.nextDouble();



        double rt = 0;
        double t1 = 0;
        double t2 = 0;
        while(true) {
            double X1 = x1 + a * t1;
            double Y1 = y1 + b * t1;
            double Z1 = z1 + c * t1;

//**collision**

//This is the part that detects the collision and makes a new path for the ball
            
            if (X1-r1 < -25){
                a = -a;
                x1 = -x1;
                System.out.printf("ball hit\n");

            }
            else if (X1+r1 > 25){
                a = -a;
                x1 = -x1;
                System.out.printf("ball hit\n");
                System.out.printf("%f%f%f\n", a, b, c);
            }
            else if (Y1-r1 < -25){
                b = -b;
                y1 = -y1;
                System.out.printf("ball hit\n");
                System.out.printf("%f%f%f\n", a, b, c);
            }
            else if (Y1+r1 > 25){
                b = -b;
                y1 = -y1;
                System.out.printf("ball hit\n");
                System.out.printf("%f%f%f\n", a, b, c);
            }
            else if (Z1-r1 < -25){
                c = -c;
                z1 = -z1;
                System.out.printf("ball hit\n");
                System.out.printf("%f%f%f\n", a, b, c);
            }
            else if (Z1+r1 > 25){
                c = -c;
                z1 = -z1;
                System.out.printf("ball hit\n");
                System.out.printf("%f%f%f\n", a, b, c);
            }
            else{
                System.out.printf("ball in boundary\n");
            }


            System.out.printf("Ball 1 at t=%.2f seconds: (%.2f, %.2f, %.2f)%n", rt, X1, Y1, Z1);

            rt += 1;
            t1 += s1;
            // t2 += s2;
            if (rt>10){
                break;
            }
        }

        // Close the scanner
        scanner.close();
    }


}

Erwartetes Verhalten:

Ich möchte, dass der Ball richtig von der Begrenzung reflektiert wird und im Strafraum bleibt.

Beobachtetes Verhalten:

Der Ball ging jedoch ins Aus und veränderte unerwartet seine Position.

Frage:

Könnten Sie bitte die Teile meines Codes zur Kollisionserkennung und -reflexion durchgehen und Korrekturen vorschlagen? Gibt es eine effizientere Möglichkeit, mit Ballreflexionen außerhalb der inneren Grenzen der Box umzugehen? Zusätzliche Informationen:

Java-Programmiersprache Berechnen Sie die Bewegung eines Balls mithilfe der Grundgleichungen einer geraden Linie Vektorreflexionsformel für die Kollisionsbehandlung

Problemumgehung

Ich glaube, ich habe den Code hier korrigiert, es handelt sich um einen festen Code

import java.util.Scanner;
import java.lang.Math;

public class BallExample{

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    // Get initial positions for ball 1
    System.out.print("Enter ball 1's initial x-coordinate (x): ");
    double x1 = scanner.nextDouble();
    System.out.print("Enter ball 1's initial y-coordinate (y): ");
    double y1 = scanner.nextDouble();
    System.out.print("Enter ball 1's initial z-coordinate (z): ");
    double z1 = scanner.nextDouble();
    System.out.print("Enter ball 1's radius(r): ");
    double r1 = scanner.nextDouble();

    // Get direction vectorfor ball 1
    System.out.print("Enter direction in x-coordinate (a): ");
    double a = scanner.nextDouble();
    System.out.print("Enter direction in y-coordinate (b): ");
    double b = scanner.nextDouble();
    System.out.print("Enter direction in z-coordinate (c): ");
    double c = scanner.nextDouble();



    // Get speed
    System.out.print("Enter speed for ball 1(units per second): ");
    double s1 = scanner.nextDouble();





    double rt = 0;
    double t1 = 0;
    while(true) {
        double X1 = x1 + a * t1;
        double Y1 = y1 + b * t1;
        double Z1 = z1 + c * t1;


        System.out.printf("Ball 1 at t=%.2f seconds: (%.2f, %.2f, %.2f)%n", rt, X1, Y1, Z1);

        if (X1+r1>=25||X1-r1<=-25){
            a=-a;
            System.out.printf("HIT\n");
            
        }
        
        
        if (Y1+r1>=25||Y1-r1<=-25){
            b=-b;
            System.out.printf("HIT\n");
            
        }
        
        
        if (Z1+r1>=25||Z1-r1<=-25){
            c=-c;
            System.out.printf("HIT\n");
            
        }

        x1=X1;
        y1=Y1;
        z1=Z1;

        t1 = s1;
        rt += 1;
        if(rt>10){
            break;
        }

    // Close the scanner
    scanner.close();
   }
}}

Das obige ist der detaillierte Inhalt vonJava-Ball-Bewegung: Unerwartetes Verhalten der Grenzreflexion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Ereignis nicht erstelltNächster Artikel:Ereignis nicht erstellt