1

我很难理解我的代码有什么问题。

Point A = new Point((int)CENTER_X, (int)CENTER_Y);
Point B = new Point((int)me.getX(), (int)me.getY());
Point C = new Point((int)CENTER_X, (int)B.y);
double AB;
double AC;
double BC;
AB = Math.sqrt(Math.pow(B.x - A.x, 2) + Math.pow(B.y - A.y, 2));
AC = Math.sqrt(Math.pow(C.x - A.x, 2) + Math.pow(C.y - A.y, 2));
BC = Math.sqrt(Math.pow(C.x - B.x, 2) + Math.pow(C.y - B.y, 2));
degre = (AB * AB - AC * AC - BC * BC) /( 2 * AC * AB);
degre = Math.acos(degre*(180/Math.PI));

我总是得到degre = 0NaN。这是为什么 ?

4

2 回答 2

2

您对何时进行弧度到度数的转换感到困惑,您需要计算比率,然后执行arccos(它将以弧度返回角度),然后转换为度数,如下所示:

double float ratio = (AB * AB + AC * AC - BC * BC) /( 2 * AC * AB);
degre = Math.acos(ratio)*(180/Math.PI);
于 2012-04-20T09:54:15.887 回答
0

我知道这是一个老问题,但在查看这个问题时它对我有帮助,所以我分享了一个有效的 Kotlin 示例,并且还明确显示了正在计算的角度,因为我发现这可能会导致混淆。

如果您认为这三个点构成一个三角形,那么您可以使用此处问题和答案中讨论的方法获得三角形的“内部”角度,但您需要注意您正在关注角度的正确方程你要。

我发现您所指的确切角度在查看时可能会令人困惑,因此能够根据一些已知或工作示例检查您的代码很有用,这些示例可以让您可视化您想要的角度。

在撰写本文时,下面的链接是一个出色的在线工具,可让您在三角形中输入三个点并计算内角等。它还包括对如何完成计算的解释,以及插入的示例值,这在调试代码时非常有用:

下面是经过测试的 Kotlin 代码,用于计算像这样的三角形中顶点“b”处的角度(不必等边):

在此处输入图像描述

Kotlin 代码如下 - 显然不需要日志记录,但在使用上述站点之类的工具测试结果时很有用:

    private fun angleBetweenThreePoints(a: CirclePoint, b: CirclePoint, c:CirclePoint): Double {
        var ab:Double = Math.sqrt(Math.pow((a.x - b.x).toDouble(), 2.0) + Math.pow((a.y - b.y).toDouble(), 2.0))
        var ac:Double = Math.sqrt(Math.pow((a.x - c.x).toDouble(), 2.0) + Math.pow((a.y - c.y).toDouble(), 2.0))
        var bc:Double = Math.sqrt(Math.pow((b.x - c.x).toDouble(), 2.0) + Math.pow((b.y - c.y).toDouble(), 2.0))

        var cosValue = (ab * ab + bc * bc - ac * ac) /( 2 * bc * ab)
        val angle = acos(cosValue) *(180/Math.PI)

        //Optional logging to help test and debug
        Log.d(TAG,"ab: " + ab)
        Log.d(TAG,"ac: " + ac)
        Log.d(TAG,"bc: " + bc)
        Log.d(TAG,"a: " + a.x +"," + a.y)
        Log.d(TAG,"b: " + b.x +"," + b.y)
        Log.d(TAG,"c: " + c.x +"," + c.y)
        Log.d(TAG,"angle: " + angle)

        return angle
    }

请注意,这不会测试非相交线等边缘情况。

于 2020-09-17T11:38:36.473 回答