0

我有一个三角形 ABC 内接在一个圆圈中。B点位于圆心,A和C是圆上的两点。

带内接三角形的圆

给定

给定 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,图像可能不会移动。

我的建议是将您的坐标保持为双精度,并且仅在您将它们渲染为像素而不覆盖它们的值时将它们四舍五入

于 2012-11-24T23:57:11.657 回答