Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个圆圈内弹起一个球_Java_Math_Geometry_Angle_Bounce - Fatal编程技术网

Java 在一个圆圈内弹起一个球

Java 在一个圆圈内弹起一个球,java,math,geometry,angle,bounce,Java,Math,Geometry,Angle,Bounce,我有一个Pong-360游戏,其中弧形挡板使球偏转,球应保持在圆形边界内。如果球在到达边界时没有碰到球拍,它将继续出界,最后一次击球的球员将得分。我遇到的问题是在用球拍撞击时将球返回到正确的方向。如果球接触到桨叶的某一半,则应朝该方向弹跳,但在任何情况下都应返回到边界的另一侧,而不会再次撞击边界的同一侧 现在,我已经完成了弹跳,将边界划分为16个层面,并在一个范围内给球一个随机角度,该范围取决于它在撞击时所处的层面。即使这样也没有达到预期效果,因为我的数学不正确,但无论如何都需要重做。我不知道如

我有一个Pong-360游戏,其中弧形挡板使球偏转,球应保持在圆形边界内。如果球在到达边界时没有碰到球拍,它将继续出界,最后一次击球的球员将得分。我遇到的问题是在用球拍撞击时将球返回到正确的方向。如果球接触到桨叶的某一半,则应朝该方向弹跳,但在任何情况下都应返回到边界的另一侧,而不会再次撞击边界的同一侧

现在,我已经完成了弹跳,将边界划分为16个层面,并在一个范围内给球一个随机角度,该范围取决于它在撞击时所处的层面。即使这样也没有达到预期效果,因为我的数学不正确,但无论如何都需要重做。我不知道如何获得一个角度,以确保球返回到边界的另一半,无论它在哪里被击中。我曾多次尝试从变量中获取角度,例如球的移动方向、边界内的当前位置以及接触的桨叶位置,但到目前为止,我遇到了失败。目前,更改球方向的代码如下:

    public void bounce(){

        boolean changeAngle = false;

        if( bluePaddle.intersects( ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter() ) ){

            lastHit = 1;
            changeAngle = true;
        }
        else if( redPaddle.intersects( ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter() ) ){

            lastHit = 2;
            changeAngle = true;
        }

        if ( changeAngle ){

            //  Right side of boundary
            if ( ball.getX() > center_x ) {

                //  Quadrant 4
                if ( ball.getY() > center_y ){

                    //  Slice 13
                    if ( ball.getY() - center_y > Math.sin(3 * Math.PI / 8) ){                      
                        angle = (double) ( randNum.nextInt(90) + 90 );
                    }
                    //  Code for other slices omitted
                }//end Quadrant 4
                // Code for other quadrants omitted
            }//end right side of boundary

            //  Code for Left side of boundary omitted

            ball.setDx( (int) (speed * Math.cos(Math.toRadians(angle))) );
            ball.setDy( (int) (speed * Math.sin(Math.toRadians(angle))) );
        }//end if (changeAngle)

        bouncing = false;       
    }//end bounce method
正如你所看到的,就像现在一样,角度只是在一个范围内随机生成的,我认为这对每个切片都是好的。要强调的是,我主要需要数学方面的帮助,用Java实现它是次要的。编译和运行的完整代码(所有.java和.class文件)可在此处找到:

主要方法在Pong.java文件中


任何帮助都将不胜感激。

首先,找到它击中的位置。在红色挡板的情况下,您可以这样做(蓝色挡板类似,但您可能需要交换ang0和ang1):

桨叶的边缘由圆上的两个角度定义,ang0和ang1,其中ang0是下边缘,ang1是上边缘

假设圆心是点(0,0),球在点pBall=(xBall,yBall)

球将在[ang0..ang1]范围内以一定角度压载=atan2(yBall,xBall)

现在将其在桨叶上的角度位置转换为[0..1]之间的参数。 您可以将其定义为

u = (ballAng - ang0) / (ang1 - ang0);
现在要将其映射到中心线,如下所示:

假设圆中心线的底部位置是点p0,中心线的顶部是点p1

现在将与中心线的交点定义为

p = p0 + u * (p1 - p0)
作为球的速度矢量,它需要是归一化差分矢量

velBall = normalize(p - pBall)
希望这有意义


[编辑:进行了更正]

您绘制的箭头似乎不可行。请注意,如果桨叶处于最右边的位置,该偏转将导致桨叶撞击自己的一侧。更重要的是,这似乎不可能以一种非常明智的方式解决。例如,如果红色球拍位于顶部,击打球拍右侧也会使球撞到红色球拍的墙上。你可以通过将向量映射到球拍,迫使它击中中心线,但你可能希望将篮板纳入策略,而不是将球分成四分之一,每个玩家将控制两个相距180度的桨(如果在正方形上,则控制两个相反的边)。如果这是一个愚蠢的想法,我的借口是,已经晚了。@dwn箭头并不是要准确地表示期望的结果,而是要说明我试图传达的概念。至于位于顶部的划桨,实际上有两种游戏模式,一种允许两名玩家在圆圈内一路移动,另一种限制他们在边界的左/右侧移动。我正在寻求帮助,使球朝向与击球位置相对的边界的另一侧,并(在左/右模式下)指向另一名球员的一侧,即使是在顶部或底部击球。关于你的评论,似乎不可能以合理的方式解决,我承认我可能没有以正确的方式看待这个问题,我愿意接受关于更好地定义这个问题的建议,或者为解决方案设置不同的设置,只要能够达到预期的结果。谢谢你的意见。谢谢你花时间回复。我将尝试实施您的解决方案,并在以后进行进一步更新。再次感谢。如果你真的想变得怪异,你可以将其视为从乒乓球矩形到乒乓球圆的直接映射,但球会随着它的移动而弯曲。最后一个概念是:你可以让弹跳正常发生,但向中心线添加一种磁力