Я знаю, что это старый вопрос, но он помог мне при просмотре этого, поэтому я делюсь рабочим примером 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
}
Обратите внимание, что это не проверяет крайние случаи, такие как непересекающиеся линии и т. д.
person
Mick
schedule
17.09.2020