Как вычислить угол от трех точек? [закрытый]

Возможно, это - излишество для Вашего случая, но я испытал бы желание создать класс "Задания", который берет кортеж в качестве его аргумента конструктора и имеет соответствующие свойства на нем. Я тогда раздал бы экземпляры этого класса вместо этого.

120
задан Lance Roberts 19 September 2013 в 19:26
поделиться

7 ответов

У меня есть решение!

Ну, вроде того.

Если ваш оконный менеджер использует подсказки расширенного оконного менеджера (EWMH), вы можете запросить корневое окно, используя " _NET_CLIENT_LIST "атом. Это возвращает список клиентских окон, которыми управляет оконный менеджер. Для получения дополнительной информации см. здесь .

Однако с этим есть некоторые проблемы. Для начала, используемый оконный менеджер должен поддерживать EWMH. KDE и GNOME делают, и я уверен, что некоторые другие тоже. Однако я уверен, что многие этого не делают. Кроме того, я заметил несколько проблем с KDE. Как правило, некоторые приложения, не относящиеся к KDE, не попадают в список. Например, если вы запустите xcalc под KDE, он не будет отображаться в этом списке.

Если кто-нибудь может предложить какие-либо улучшения этого метода, я был бы рад их услышать. + P 13 2 - P 23 2 ) / (2 * P 12 * P 13 ))

где P 12 - длина сегмента от P1 до P2, рассчитанная с помощью

sqrt (( P1 x - P2 x ) 2 + (P1 y - P2 y ) 2 )

87
ответ дан 24 November 2019 в 01:38
поделиться

По сути, у вас есть два вектора: один из P1 в P2, а другой из P1 в P3. Все, что вам нужно, это формула для вычисления угла между двумя векторами.

Посмотрите здесь , чтобы найти хорошее объяснение и формулу.

alt text

15
ответ дан 24 November 2019 в 01:38
поделиться

Если вы думаете о P1 как о центре круга, вы думаете слишком сложно. У вас простой треугольник, поэтому ваша проблема решается с помощью закона косинусов . Нет необходимости в преобразовании полярных координат или в чем-то подобном. Скажем, расстояния P1-P2 = A, P2-P3 = B и P3-P1 = C:

Угол = arccos ((B ^ 2-A ^ 2-C ^ 2) / 2AC)

Все, что вам нужно. необходимо рассчитать длину расстояний A, B и C. Их легко получить из координат x и y ваших точек и Теорема Пифагора

Длина = sqrt ((X2-X1) ^ 2 + (Y2-Y1) ^ 2)

12
ответ дан 24 November 2019 в 01:38
поделиться

Вы упомянули угол со знаком (-90). Во многих приложениях углы могут иметь знаки (положительные и отрицательные, см. http://en.wikipedia.org/wiki/Angle ). Если точки (скажем) P2 (1,0), P1 (0,0), P3 (0,1), то угол P3-P1-P2 условно положителен (PI / 2), тогда как угол P2-P1- P3 отрицательный. Использование длин сторон не приведет к различию между + и -, поэтому, если это имеет значение, вам нужно будет использовать векторы или функцию, такую ​​как Math.atan2 (a, b).

Углы также могут выходить за пределы 2 * PI и в то время как это не имеет отношения к текущему вопросу, это было достаточно важно, чтобы я написал свой собственный класс Angle (также чтобы убедиться, что градусы и радианы не перепутались). Вопрос о том, меньше ли angle1, чем angle2, во многом зависит от того, как определяются углы.

4
ответ дан 24 November 2019 в 01:38
поделиться

Это становится очень просто, если вы так думаете как два вектора, один из точки P1 в P2 и один из P1 в P3

так:
a = (p1.x - p2.x, p1.y - p2.y)
b = (p1.x - p3.x, p1.y - p3.y)

Затем вы можете инвертировать формулу скалярного произведения:
dot product
, чтобы получить угол:
angle between two vectors

Помните, что dot product просто означает: a1 * b1 + a2 * b2 (здесь всего 2 измерения ...)

47
ответ дан 24 November 2019 в 01:38
поделиться

Недавно я столкнулся с похожей проблемой, только мне нужно было различают положительный и отрицательный углы. Если это кому-то пригодится, я рекомендую фрагмент кода, который я взял из этого списка рассылки об обнаружении вращения по событию касания для Android:

 @Override
 public boolean onTouchEvent(MotionEvent e) {
    float x = e.getX();
    float y = e.getY();
    switch (e.getAction()) {
    case MotionEvent.ACTION_MOVE:
       //find an approximate angle between them.

       float dx = x-cx;
       float dy = y-cy;
       double a=Math.atan2(dy,dx);

       float dpx= mPreviousX-cx;
       float dpy= mPreviousY-cy;
       double b=Math.atan2(dpy, dpx);

       double diff  = a-b;
       this.bearing -= Math.toDegrees(diff);
       this.invalidate();
    }
    mPreviousX = x;
    mPreviousY = y;
    return true;
 }
8
ответ дан 24 November 2019 в 01:38
поделиться

В Objective-C вы можете сделать это с помощью

float xpoint = (((atan2((newPoint.x - oldPoint.x) , (newPoint.y - oldPoint.y)))*180)/M_PI);

Или прочитайте больше здесь

6
ответ дан 24 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: