我正在尝试在java中编写一个方法来确定相对于一条线的位置方向。
一点背景:(答案没有必要但可能有帮助) 我正在对玩家身体部位上的球进行碰撞检测。该运动员的头部膝盖脚踝和脚趾都被定义为具有位置和系绳位置。例如,头部的系绳位置将是胸部,对于胸部,它将是球员(或臀部)的位置等等。
对于碰撞检测,我目前有一个函数,用于确定球与身体部位之间的距离,但是当身体部位被拖得太快而跳过球时,这个功能就无法捕捉到。
我在每个身体部位类中都有方法,用于确定相对于身体部位的位置方向。
我写的方法称之为getAngle方法: pivotPos和basePos是基线,使用
调用方法的位置public double getAngle(Position basePos, Position pivotPos) {
double baseAngle = Math.toDegrees(Math.atan2(
pivotPos.getY() - basePos.getY(),
pivotPos.getX() - basePos.getX())) + 180;
double otherAngle = Math.toDegrees(Math.atan2(
this.getY() - pivotPos.getY(), this.getX() - pivotPos.getX()));
return baseAngle - otherAngle;
}
这就是我为胸部和头部所写的内容。
@Override
public int isOnGoodSide(Position p, double radius) {
double angle1 = p.getAngle(tetherPosition, position);
double angle2 = p.getAngle(position, tetherPosition);
if (angle1 >= 270 && angle2 <= 90) {
if (p.distanceBetweenPointAndLine(tetherPosition, position) > radius) {
return 1;
}
return -1;
} else if (angle1 <= 90 && angle2 >= 270) {
return -1;
}
return 0;
}
这就是我为Knee Ankle和Toe所写的内容
@Override
public int isOnGoodSide(Position p, double radius) {
double angle1 = p.getAngle(position, tetherPosition);
double angle2 = p.getAngle(tetherPosition, position);
if (angle2 <= 90 && angle1 >= 270) {
if (p.distanceBetweenPointAndLine(tetherPosition, position) > radius){
return 1;
}
return -1;
} else if (angle2 >= 270 && angle1 <= 90) {
return -1;
}
return 0;
}
以下是测试用例的一部分。
public void test_isOnGoodSide() {
Position pos1 = new Position(10, 10);
Position pos2 = new Position(20, 10);
// Horizontal line
Position pos7 = new Position(15, 15);
Position pos8 = new Position(15, 5);
Position pos9 = new Position(5, 100);
Position pos10 = new Position(25, 20);
Knee knee1 = new Knee(pos1, pos2);
assertEquals(1, knee1.isOnGoodSide(pos7, 0));
assertEquals(-1, knee1.isOnGoodSide(pos8, 0));
assertEquals(0, knee1.isOnGoodSide(pos9, 0));
assertEquals(0, knee1.isOnGoodSide(pos10, 0));
基本上这些方法完成了,我有很多测试用例但是无法弄清楚我的错误。如果你看到我的代码有什么问题,或者可以提供另一个有用的解决方案。我还尝试阅读Jon Shewchuk的“计算几何的快速稳健预测”,但我无法理解。提前致谢!