Вычисление угла между тремя точками в андроиде

Мне трудно понять, что не так с моим кодом.

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. Почему это ?


person roiberg    schedule 20.04.2012    source источник


Ответы (2)


Вы не знаете, когда делать перевод из радиана в градусы, вам нужно рассчитать отношение, а затем выполнить arccos (который вернет угол в радианах), затем преобразуйте в градусы следующим образом:

double float ratio = (AB * AB + AC * AC - BC * BC) /( 2 * AC * AB);
degre = Math.acos(ratio)*(180/Math.PI);
person Elemental    schedule 20.04.2012
comment
первая строка серо... (AB * AB - AC * AC - BC * BC) /( 2 * AC * AB) я использую неправильное уравнение? - person roiberg; 20.04.2012
comment
Я не проверял вашу тригонометрию, но считаю, что вы правильно используете правило косинуса. - person Elemental; 20.04.2012

Я знаю, что это старый вопрос, но он помог мне при просмотре этого, поэтому я делюсь рабочим примером 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