Java 两个形状之间的碰撞

Java 两个形状之间的碰撞,java,processing,Java,Processing,我正在制作一个关于处理的动画。 但是,我对下面的代码有一个问题: 所以,你可以在输出上看到,球在窗户上到处移动。我想为球设置一个障碍物。球可以从中间传球,但是如果它击中了线,它会以(int)random(1,3)的速度去某处 怎么做? 下面是我想要实现的一张图片:一种方法是在球穿过中间时检查碰撞,特别是当球的速度将y从height/2时 大概是这样的: if (((y < height/2 && y+dirY > height/2) || (y > height

我正在制作一个关于处理的动画。
但是,我对下面的代码有一个问题:

所以,你可以在输出上看到,球在窗户上到处移动。我想为球设置一个障碍物。球可以从
中间传球
,但是如果它击中了线,它会以
(int)random(1,3)
的速度去某处

怎么做?

下面是我想要实现的一张图片:

一种方法是在球穿过中间时检查碰撞,特别是当球的速度将y从height/2时

大概是这样的:

if (((y < height/2 && y+dirY > height/2) || (y > height/2 && y+dirY < height/2)) && (x < width/2-middle || x > width/2+middle)){
   dirY = (int) random (1,3);
   dirX = (int) random (1,3);
}
if((yheight/2)| |(y>height/2&&y+dirYwidth/2+middle)){
dirY=(int)随机(1,3);
dirX=(int)随机(1,3);
}

(一个更合适的解决方案是在球的边缘通过障碍物时创建碰撞,但我将由您决定)

这样做的一种方法是在球穿过中间时检查碰撞,特别是当球的速度将y从height/2时

大概是这样的:

if (((y < height/2 && y+dirY > height/2) || (y > height/2 && y+dirY < height/2)) && (x < width/2-middle || x > width/2+middle)){
   dirY = (int) random (1,3);
   dirX = (int) random (1,3);
}
if((yheight/2)| |(y>height/2&&y+dirYwidth/2+middle)){
dirY=(int)随机(1,3);
dirX=(int)随机(1,3);
}

(一个更合适的解决方案是在球的边缘通过障碍物时创建碰撞,但我将由您决定)

我不打算编写代码,但我会告诉您如何计算,这并不难

画一个圆,我们知道圆心和半径

我们知道起点和终点

  • 如果从
    中心到
    起点或
    终点的距离小于
    半径,则该线与圆相交(例如点在圆内)
  • 如果
    起点
    X在中心的左侧(sX终点X在右侧(eX>cX),且其Y与
    中心
    Y之间的距离小于
    半径
    (cY-sY
    请注意,这只适用于水平线的简单情况。例如,通常更好的方法是使用矢量计算来确定从中心到直线的距离。这将允许您处理对角线等问题。

    我不打算编写代码,但我会告诉您如何计算它,这并不难

    画一个圆,我们知道圆心和半径

    我们知道起点和终点

  • 如果从
    中心到
    起点或
    终点的距离小于
    半径,则该线与圆相交(例如点在圆内)
  • 如果
    起点
    X在中心的左侧(sX终点X在右侧(eX>cX),且其Y与
    中心
    Y之间的距离小于
    半径
    (cY-sY
    请注意,这只适用于水平线的简单情况。例如,通常更好的方法是使用矢量计算来确定从中心到直线的距离。这将允许您使用对角线等。对于您的玩具模型,处理碰撞的最简单方法是考虑碰撞区域。所以

  • 建立碰撞区域限制x1、x2、y1、y2。当球的中心进入该区域时,碰撞规则适用
  • 考虑弹性碰撞:您的球只与水平线碰撞,因此只有速度的垂直分量会受到影响,并且它永远不会失去速度
  • 考虑使用一组良好的初始条件测试玩具模型,这样您就可以发现由于模型小、使用的值等原因而产生的任何瑕疵。(我已将球的初始位置修改为随机初始位置,运行模型数次以查看它在不同初始条件下的行为)
  • intdirx=(int)随机(1,3);
    int-dirY=(int)随机(1,3);
    //int x=20,y=20;
    int-middle=20;
    intx=(int)随机(20180);
    int y=(int)随机(20,80);
    int-x1,x2,y1,y2;
    无效设置(){
    规模(200200);
    //碰撞区界限
    x1=(宽度/2-中间)+20/2-1;//89
    x2=(宽度/2+中间)-20/2+1;//111
    y1=高度/2-20/2+1;//91
    y2=高度/2+20/2-1;//109
    }
    作废提款(){
    背景(255);
    椭圆(x,y,20,20);
    线(0,高度/2,宽度/2-中间,高度/2);/(0,100,80,100)
    线条(宽度/2+中间,高度/2,宽度,高度/2);/(120100200100)
    x+=dirX;
    y+=dirY;
    如果(x>宽度| | x<0)
    dirX*=-1;
    如果(y>高度| | y<0)
    dirY*=-1;
    if((xy1&&y0)| |//左上角向下
    (x高度/2&&yx2&&y>y1&&y0)|///右上角向下
    (x>x2&&y>height/2&&y

    对于一个更复杂的模型,你可以考虑更复杂的情况,例如,由于线的末端、球的轮廓与线的碰撞等等。对于你的玩具模型来说,处理碰撞的最简单的方法是考虑碰撞区域。所以

  • 建立碰撞区域限制x1、x2、y1、y2。当球的中心进入该区域时,碰撞规则适用
  • 考虑弹性碰撞:您的球只与水平线碰撞,因此只有速度的垂直分量会受到影响,并且它永远不会失去速度
  • 考虑用一系列好的初始条件来测试你的玩具模型,这样你就可以