У нас есть приложение для мониторинга, которое может осуществлять мониторинг с интервалом, например, 5 минут, 15 минут, 1 час и т. Д. Это представлено на оси x; Ось Y также масштабируется и может иметь значения типа 1,2345–1,5567 или может быть переключена на значения, например 26000–30000 и т. Д.

Как только масштаб установлен по осям x и y, они не изменяются динамически без полного обновления данных.

При этом мы хотим, чтобы уведомляли только определенных людей в зависимости от угла часов, скажем, последних 5 интервалов по оси y.

Углы по часовой стрелке никогда не превышают 0/12 против часовой стрелки; аналогично, они никогда не пройдут мимо 6 по часовой стрелке.

Я знаю, что угол 3 часа очевиден, когда значение оси x точно такое же, как было 5 интервалов назад.

Но как вообще начать кодировать все, что между ними? Я могу легко получить разницу в значениях x (в приведенном ниже примере это 0,3), а разница по оси Y на рисунке ниже равна 4.

Итак, с тригонометрией, противоположной соседней, что, как я считаю, означает операцию загара? Если это так, 0,3 / 5, похоже, не дает значений, которые выглядят как угол часов.

Поскольку я не могу пойти дальше этого, я понятия не имею, как это будет закодировано на C #, кроме расчета различий.

Любая помощь будет принята с благодарностью!

enter image description here

0
user11827463 20 Янв 2021 в 14:36

2 ответа

Лучший ответ

Вы должны использовать atan2 (wiki, docs)

Из вики:

atan2 (y, x) возвращает угол θ между лучом в точку (x, y) и положительной осью x, ограниченный (−π, π]

Обратите внимание, что результат находится в радианах, поэтому вам нужно преобразовать его, если вам нужны градусы

Как сказано, один радиан равен 180 / π градусов. Таким образом, чтобы преобразовать радианы в градусы, умножьте на 180 / π.

1
JonasH 20 Янв 2021 в 12:13

Вот пара вещей. Сначала я думаю, что вы просите угол φ ниже, учитывая две точки данных (x1,y1) и (x2,y2).

fig1

Проблема здесь в том, что угол измеряется в указанном треугольнике в пикселях , а не в единицах x , y .

Поэтому неправильно делать var φ = Math.Atan( (y2-y1)/(x2-x1) );, потому что оси x и y имеют разные единицы измерения, а углы всегда безразмерный.

Какая дополнительная информация необходима, так это размер области графика в пикселях, а также диапазон значений. В качестве альтернативы масштабирование gx, gy в пикселях / единицах для обеих осей.

fig2

Например, если для оси x требуется 45 пикселей, чтобы охватить 1 сетку из 1 hour (60 minutes), то масштабирование равно double gx = 45/60.0, а если y -axis также необходимо 45 пикселей, чтобы охватить 1 сетку со значением 0.1, а затем double gy = 45/0.1.

Затем вы можете использовать это для вычисления сторон треугольника в пикселях перед вычислением угла.

var adjacent = gx*(x2-x1);  // convert x-axis units to pixels
var opposing = gy*(y2-y1);  // convert y-axis units to pixels
var φ = Math.Atan(addjacent/opposing) * (180/Math.PI);

Последняя часть вычисляет угол φ и преобразует его из радиан в градусы.

0
John Alexiou 20 Янв 2021 в 13:48