Возможно, это - излишество для Вашего случая, но я испытал бы желание создать класс "Задания", который берет кортеж в качестве его аргумента конструктора и имеет соответствующие свойства на нем. Я тогда раздал бы экземпляры этого класса вместо этого.
У меня есть решение!
Ну, вроде того.
Если ваш оконный менеджер использует подсказки расширенного оконного менеджера (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 )
По сути, у вас есть два вектора: один из P1 в P2, а другой из P1 в P3. Все, что вам нужно, это формула для вычисления угла между двумя векторами.
Посмотрите здесь , чтобы найти хорошее объяснение и формулу.
Если вы думаете о 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)
Вы упомянули угол со знаком (-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, во многом зависит от того, как определяются углы.
Это становится очень просто, если вы так думаете как два вектора, один из точки P1 в P2 и один из P1 в P3
так:
a = (p1.x - p2.x, p1.y - p2.y)
b = (p1.x - p3.x, p1.y - p3.y)
Затем вы можете инвертировать формулу скалярного произведения:
, чтобы получить угол:
Помните, что просто означает: a1 * b1 + a2 * b2 (здесь всего 2 измерения ...)
Недавно я столкнулся с похожей проблемой, только мне нужно было различают положительный и отрицательный углы. Если это кому-то пригодится, я рекомендую фрагмент кода, который я взял из этого списка рассылки об обнаружении вращения по событию касания для 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;
}
В Objective-C вы можете сделать это с помощью
float xpoint = (((atan2((newPoint.x - oldPoint.x) , (newPoint.y - oldPoint.y)))*180)/M_PI);
Или прочитайте больше здесь