Maison >Java >Mouvement de la balle Java : comportement inattendu de la réflexion des limites

Mouvement de la balle Java : comportement inattendu de la réflexion des limites

王林
王林avant
2024-02-22 13:30:081195parcourir

L'éditeur PHP Xigua vous présente la série de questions-réponses Java. Ce numéro traite du comportement inattendu de la réflexion des limites dans le mouvement de la balle Java. Au cours du processus de programmation, nous sommes souvent confrontés à diverses situations inattendues, notamment des problèmes de simulation physique qui sont plus complexes. Cet article analysera pour vous le comportement inattendu qui peut se produire lors de la réflexion des limites dans le mouvement de la balle Java, vous aidera à mieux comprendre et gérer ces problèmes, et à améliorer vos compétences en programmation.

Contenu de la question

`Question :

Je développe un programme java dans lequel je simule le mouvement d'une balle à l'intérieur d'une boîte. Utilisez la formule de réflexion vectorielle pour vous attendre à ce que la balle se reflète depuis les limites de la boîte. Cependant, j'ai rencontré un comportement inattendu, le ballon non seulement est sorti des limites, mais a également changé de position étrangement.

Description du problème :

J'ai utilisé des équations de base en ligne droite (x=x0+at, y=y0+bt, z=z0+ct) pour réaliser le mouvement de la balle. Je soupçonne que le problème réside dans la partie du code chargée de détecter les collisions et de mettre à jour la trajectoire de la balle. `

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();
    }


}

Comportement attendu :

Je veux que le ballon réfléchisse correctement hors de la limite et reste à l'intérieur de la surface.

Comportement observé :

Cependant, le ballon est sorti des limites et a changé de position de manière inattendue.

Question :

Pourriez-vous s'il vous plaît passer en revue les parties de détection de collision et de réflexion de mon code et suggérer des corrections ? Existe-t-il un moyen plus efficace de gérer les réflexions de la balle en dehors des limites intérieures de la boîte ? Informations complémentaires :

langage de programmation Java Calculer le mouvement d'une balle à l'aide des équations de base d'une ligne droite Formule de réflexion vectorielle pour la gestion des collisions`

Solution de contournement

Je pense que j'ai corrigé le code ici, c'est un code fixe

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();
   }
}}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Événement non crééArticle suivant:Événement non créé