二维空间中点和线的碰撞

时间:2012-10-08 14:31:25

标签: java android line collision

所以我想在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]是球的坐标

理论上它应该可以工作,但实际上球大部分时间只是直接穿过线或在不应该的地方反弹

3 个答案:

答案 0 :(得分:0)

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

去这里试试Shortest distance between a point and a line segment然后如果距离== 0(或者等于球的半径更小)你就会发生碰撞

答案 1 :(得分:0)

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

假设你的点位于[1,1],你的线从[0,0]到[5,0],你的点的速度是每秒1个单位,方向是[-1,0] ]。我假设你根据每帧的时间来计算增量,以便让动画更流畅。

发生的事情如下:

  1. 点在[1,1]
  2. 每帧时间= 0,7
  3. 点移动到[0.3,0]
  4. 测试交集= false
  5. ---下一帧---
  6. 点在[0.3,0]
  7. 每帧时间= 0.5(这通常每帧不同)
  8. 点移动到[0.2,0]
  9. 测试交集= false
  10. 所以测试表明没有交叉点,因为你测试点的离散位置。

    Aki Suihkonen建议您要测试由最后位置+当前位置形成的直线与您希望点碰撞的直线之间的直线交点。

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

答案 2 :(得分: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;
祝你好运。

相关问题