计算android中三点之间的角度

时间:2012-04-20 09:35:44

标签: android math angle

我无法理解代码的错误。

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。那是为什么?

2 个答案:

答案 0 :(得分:2)

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

double float ratio = (AB * AB + AC * AC - BC * BC) /( 2 * AC * AB);
degre = Math.acos(ratio)*(180/Math.PI);

答案 1 :(得分:0)

我知道这是一个老问题,但是当我看这个问题时,它对我有帮助,因此我分享了一个有效的Kotlin示例,并明确显示正在计算的角度,因为我发现这会引起混淆。

如果您将这三个点视为一个三角形,则可以使用此处的问题和解答中讨论的方法来获得三角形的“内部”角度,但是您需要注意正确的方程式为您想要的角度。

我发现您所指的确切角度可能会使您感到困惑,因此它能够根据一些已知的或有效的示例检查您的代码,从而使您可视化所需的角度。

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

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

enter image description here

下面是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
    }

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