相对于线的点方向

时间:2014-05-17 18:42:07

标签: java android geometry

我正在尝试在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的“计算几何的快速稳健预测”,但我无法理解。提前致谢!

0 个答案:

没有答案