所以我想在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]是球的坐标
理论上它应该可以工作,但实际上球大部分时间只是直接穿过线或在不应该的地方反弹
答案 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] ]。我假设你根据每帧的时间来计算增量,以便让动画更流畅。
发生的事情如下:
所以测试表明没有交叉点,因为你测试点的离散位置。
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;
祝你好运。