我知道这是一个老问题,但在查看这个问题时它对我有帮助,所以我分享了一个有效的 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
}
请注意,这不会测试非相交线等边缘情况。