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.
    }
}

コメントを残した部分は、私が思いつかなかった箇所です。ポイントのvelocityXvelocityYを 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 に答える