如何使用 C# 计算 x-y 轴上的时钟角度?

How to I calculate clock-angle on x-y axis using C#?

我们有一个监控应用程序,可以按 5 分钟、15 分钟、1 小时等时间间隔进行监控。这表示在 x 轴上; y 轴也是可缩放的,具有 1.2345 - 1.5567 等值,或者可以切换为 26000 - 30000 等值。

在 x 轴和 y 轴上设置比例后,如果不进行完整的数据刷新,它们将不会动态更改。

话虽如此,我们只希望根据时钟角度通知某些人,例如,沿 y 轴的最后 5 个间隔。

时钟角度永远不会逆时针超过 0/12;同样,它们永远不会顺时针超过 6。

我知道当 x 轴值与 5 个间隔前完全相同时,3 点钟的角度很明显。

但是,如何开始为介于两者之间的所有内容编写代码呢?我可以很容易地得到 x 值的差异(在下面的示例图中,它是 0.3),并且在下图中的 y 轴上的差异是 4.

那么对于相邻的相反三角函数,我相信这意味着棕褐色运算?如果是这样,0.3/5 似乎不会产生任何看起来像时钟角度的值。

因为我不能再进一步了,除了计算差异之外,我不知道如何用 C# 编码它。

如有任何帮助,我们将不胜感激!

您应该使用 atan2 (wiki , docs)

来自维基:

atan2(y, x) returns the angle θ between the ray to the point (x, y) and the positive x axis, confined to (−π, π]

注意结果在radians,所以要度数需要转换

As stated, one radian is equal to 180/π degrees. Thus, to convert from radians to degrees, multiply by 180/π.

这里有几件事。首先,我认为您要的是下面的角度 φ,给定两个数据点 (x1,y1)(x2,y2).

这里的问题是角度测量指示的三角形 像素 而不是 x, y 个单位。

所以var φ = Math.Atan( (y2-y1)/(x2-x1) );是不正确的,因为xy 轴有不同的单位和角度 总是 无量纲。

需要的附加信息是图形区域的大小(以像素为单位)以及值的范围。或者,两个轴的 pixels/unit 中的缩放 gxgy

例如,如果 x 轴需要 45 个像素来跨越 1 hour60 minutes)的 1 个网格,则缩放比例为 double gx = 45/60.0,如果 y 轴也需要 45 个像素来跨越 0.1 值的 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);

最后一部分计算角度 φ 并将其从弧度转换为度数。