我无法理解代码的错误。
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 = 0
或NaN
。那是为什么?
答案 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”处的角度(不必等边):
下面是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
}
请注意,这不能测试非相交线等边缘情况。