0

円に内接する三角形 ABC があります。点 B は円の中心にあり、A と C は円上の 2 点です。

三角形が内接する円

与えられた

所与の AB (長さ)

A と B の与えられた座標

与えられた角度 B (角度 ABC)

必要

C の座標を求める

私が知っていること

AB = BC、どちらも半径

私がこれを使っているのは

Android用の基本的な3D Javaゲームを作成しています。これは左右を見るために使用されるため、画面の右側をクリックすると、オブジェクトは角度 B に 1 度を加えてあなたの周りを移動します。

Cの座標を見つけるために試したコード

rect.get(index)[5] = (int) ((di * Math.cos(Math.toRadians(angle-90)))+.5);
rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5);
rect.get(index)[5] = shapes x coord 
rect.get(index)[6] = shapes y coord 

di = radius length 
angle = angle B

を追加して.5、座標が切り捨てられたときに丸められるようにしました。

私の完全なコード

    double di = distance(playerx, playery, rect.get(index)[5], rect.get(index)[6]);
    double side1 = di;
    System.out.println("Side1: "+ side1);
    double side2 = side1;
    System.out.println("Side2: "+ side2);
    double side3 = distance(rect.get(index)[5], rect.get(index)[6], playerx, playery+di);
    System.out.println("Side3: "+ side3);

    double angle = ((side1*side1)+(side2*side2)-(side3*side3));
    angle = angle/(2*side1*side2);
    angle = Math.acos(angle)*(180/Math.PI);
    System.out.println("Angle: "+angle);
    if(playerx > rect.get(index)[5]){
        if(lookdirection.equals("left")){
            angle += 5;
        }
        if(lookdirection.equals("right")){
            angle -= 5;
        }
    }
    else{
        if(lookdirection.equals("left")){
            angle -= 5;
        }
        if(lookdirection.equals("right")){
            angle += 5;
        }
    }
    System.out.println("Angle: "+angle);

    rect.get(index)[5] = -(di * Math.cos(Math.toRadians(angle-90)));
    rect.get(index)[6] = -(di * Math.sin(Math.toRadians(angle-90)));

    di = distance(playerx, playery, rect.get(index)[5], rect.get(index)[6]);
    side1 = di;
    System.out.println("Side1: "+ side1);
    side2 = side1;
    System.out.println("Side2: "+ side2);
    side3 = distance(rect.get(index)[5], rect.get(index)[6], playerx, playery+di);
    System.out.println("Side3: "+ side3);
    angle = ((side1*side1)+(side2*side2)-(side3*side3));
    angle = angle/(2*side1*side2);
    angle = Math.acos(angle)*(180/Math.PI);
    System.out.println("Angle: "+angle);

    repaint();
}

角度は機能するようになりましたが、X と Y の座標は

    rect.get(index)[5] = -(di * Math.cos(Math.toRadians(angle-90)));
rect.get(index)[6] = -(di * Math.sin(Math.toRadians(angle-90)));

非常に大きい/小さい値を取得しています。ポイント B から 'di' の距離を保つ必要があります。

4

1 に答える 1

0

更新しました

これは幾何学の問題のようです!私はあなたのコードをテストしていませんが、あなたが望むものはそうではないと思います

rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5);

しかし

rect.get(index)[6] = (int) (-(di * Math.sin(Math.toRadians(angle-90)))+.5);

あなたがしていることを視覚化し、ここで対称性、シフト、および周期性の下で恒等性を確認してみてください。あなたが今していることで、画像は x 軸に沿って回転し、反射しています。丸めの問題にも注意する必要があります。座標が 0 に近い場合、画像が動かないことがあります。

私の提案は、座標を double として保持し、値を上書きせずにピクセルにレンダリングする場合にのみ丸めることです。

于 2012-11-24T23:57:11.657 に答える