Rumah  >  Artikel  >  Pergerakan bola Java: tingkah laku pantulan sempadan yang tidak dijangka

Pergerakan bola Java: tingkah laku pantulan sempadan yang tidak dijangka

王林
王林ke hadapan
2024-02-22 13:30:081103semak imbas

Editor PHP Xigua memperkenalkan anda kepada siri Soal Jawab Java Isu ini membincangkan tingkah laku pantulan sempadan yang tidak dijangka dalam pergerakan bola Java. Semasa proses pengaturcaraan, kita sering menghadapi pelbagai situasi yang tidak dijangka, terutamanya masalah yang melibatkan simulasi fizikal yang lebih kompleks. Artikel ini akan menganalisis untuk anda tingkah laku yang tidak dijangka yang mungkin berlaku semasa refleksi sempadan dalam pergerakan bola Java, membantu anda memahami dan menangani masalah sedemikian dengan lebih baik dan meningkatkan kemahiran pengaturcaraan anda.

Isi soalan

`Soalan:

Saya sedang membangunkan program java di mana saya mensimulasikan pergerakan bola di dalam kotak. Gunakan formula pantulan vektor untuk mengharapkan bola memantul dari sempadan kotak. Walau bagaimanapun, saya menghadapi tingkah laku yang tidak dijangka, bola bukan sahaja keluar dari sempadan, tetapi juga berubah kedudukan secara pelik.

Penerangan masalah:

Saya menggunakan persamaan garis lurus asas (x=x0+at, y=y0+bt, z=z0+ct) untuk mencapai pergerakan bola. Saya mengesyaki masalahnya terletak pada bahagian kod yang bertanggungjawab untuk mengesan perlanggaran dan mengemas kini laluan bola. `

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


}

Tingkah laku yang dijangka:

Saya mahu bola memantul dengan betul dari sempadan dan kekal di dalam kotak.

Tingkah laku yang diperhatikan:

Namun, bola terkeluar dari batas dan tanpa diduga bertukar kedudukan.

Soalan:

Bolehkah anda menyemak bahagian pengesanan perlanggaran dan pantulan kod saya dan cadangkan sebarang pembetulan? Adakah terdapat cara yang lebih cekap untuk mengendalikan pantulan bola di luar sempadan dalam kotak? Maklumat tambahan:

bahasa pengaturcaraan java Kira pergerakan bola menggunakan persamaan asas garis lurus Formula pantulan vektor untuk pengendalian perlanggaran`

Penyelesaian

Saya rasa saya membetulkan kod di sini ialah kod tetap

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

Atas ialah kandungan terperinci Pergerakan bola Java: tingkah laku pantulan sempadan yang tidak dijangka. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Acara tidak dibuatArtikel seterusnya:Acara tidak dibuat