2

所以我正在尝试在android上制作我的第一款游戏。问题是我有一个小的移动球,我希望它从我画的线反弹。为此,我需要确定球的 x,y 是否也是线中一个点的坐标。

我试图实现这些关于线条的方程

x=a1 + t*u1

y=a2 + t*u2 => (x-a1)/u1=(y-a2)/u2 (t=t 如果点在线,则必须为)

其中 x 和 y 是我正在测试的坐标,dot[a1,a2] 是线上的一个点,u(u1,u2) 是线的向量。

继承人的代码:

       public boolean Collided()
   {
       float u1 =Math.abs(Math.round(begin_X)-Math.round(end_X));
       float u2 =Math.abs(Math.round(begin_Y)-Math.round(end_Y));          
       float t_x =Math.round((elect_X - begin_X)/u1);
       float t_y =Math.round((elect_Y - begin_Y)/u2);
       if(t_x==t_y)
       {
           return true;
       }
       else
       {
           return false;
       }       
   }

点 [begin_X,end_X] 和 [begin_Y,end_Y] 是直线的两个点,[elect_X,elect_Y] 是球的坐标

理论上它应该有效,但实际上球大部分时间只是直接穿过线或弹到其他不应该的地方

4

3 回答 3

0

我不确定您的代码在做什么,但是看起来很奇怪,您对数据的 x 坐标进行了一些操作,然后在 y 上进行了一些操作,最后您希望它们相等;

去尝试这里点和线段之间的最短距离,然后如果距离== 0(或小于等于你的球的半径)你会发生碰撞

于 2012-10-08T14:42:38.577 回答
0

问题在于您正在测试点是否“击中”了您希望它反弹的线。我假设您每帧都会少量增加点的位置。

假设您的点位于 [1,1],您的线从 [0,0] 到 [5,0],您的点的速度为每秒 1 个单位,方向为 [-1,0]。我假设您根据每帧的时间计算增量以允许更平滑的动画。

发生的情况如下:

  1. 点在 [1,1]
  2. 每帧时间 = 0,7
  3. 点移动到 [0.3,0]
  4. 测试交集 = 假
  5. --- 下一帧 ---
  6. 点在 [0.3,0]
  7. 每帧时间 = 0.5(通常每帧不同)
  8. 点移动到 [0.2,0]
  9. 测试交集 = 假

所以测试说没有交叉点,因为你测试了你的点的离散位置。

正如 Aki Suihkonen 建议的那样,您要测试由最后一个位置 + 当前位置形成的线与您希望点碰撞的线之间的线交点。

java.awt.geom.Line2D.linesIntersect(double X1, double Y1, double X2, double Y2, double X3, double Y3, double X4, double Y4) 允许您轻松检查这些交叉点。

于 2012-10-08T15:12:14.000 回答
0

你的数学是好的,但你的代码不是。

使用一般线方程更简单,y = y1 + a(x - x1)其中a = (y2 - y1) / ( x2 - x1), 存在(x1,y1)(x2,y2)到线的点。

当球在点时,要让球与线的距离(bx,by)

double a = (y2 - y1) / (x2 - x1);
double distance = (by - y1 - a * (bx - x1)) * Math.cos(Math.atan(a));

现在您可以比较是否Math.abs(distance)低于特定值(即球直径)以确认碰撞。

注意:这只适用于非垂直线。如果您有一条垂直线,请使用:

double distance = bx - x1;

祝你好运。

于 2012-10-08T15:35:07.387 回答