1

这个问题的含义示意图。

我已经给出了我当前需要帮助的小问题的图表。我的主要目的是防止该点超出圈子。没有其他的。

圆的中心位于 (x, y)。

我只解决了一点问题,这就是我的问题的碰撞检测部分,如下所示:

public void bound(Point p, Circle c){
    double distance = Math.hypot(p.x - c.x, p.y - c.y);
    if (distance >= c.radius){
        //Clueless from here on out.
    }
}

我留下评论的部分是我无法弄清楚的地方。我确实尝试将点的velocityX和设置velocityY为 0,但我意识到只要它触及圆,该点就会保持原样。

所以,我有点卡住了。

4

1 回答 1

0

我已经解决了这个问题。

public void reflect(Hole h){
    //R = -2*(V dot N)*N + V
    //N is normalized.
    double nx = (this.position[0]+this.diameter/2) - (h.x+16);
    double ny = (this.position[1]+this.diameter/2) - (h.y+16);
    double nd = Math.hypot(nx, ny);
    if (nd == 0)
        nd = 1;
    nx /= nd;
    ny /= nd;
    double dotProduct = this.speed[0]*nx+this.speed[1]*ny;
    this.speed[0] += (float)(-2*dotProduct*nx);
    this.speed[1] += (float)(-2*dotProduct*ny);
}

public void reflectResponse() {
    for (int i = 0; i <= 1; i++) {
        position[i] -= speed[i];
        speed[i] *= 0.992f;
    }
}

我从评论中尝试了 Oli Charlesworth 的方法,但它让事情变得更加……“复杂”,超出了我的预期。其他人提到我使用了完全 100% 基于矢量的算法,因为我非常依赖基于矢量的动作。

给读过这篇文章的人的提示:

  1. 如果您正在处理对象移动和与矢量的碰撞,请寻求基于矢量的算法。
  2. 如果您使用角度(度或弧度),请使用 Oli Charlesworth 的方法。
于 2012-07-31T11:26:34.387 回答