如何使用 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(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) );
是不正确的,因为x和y 轴有不同的单位和角度 总是 无量纲。
需要的附加信息是图形区域的大小(以像素为单位)以及值的范围。或者,两个轴的 pixels/unit 中的缩放 gx
、gy
。
例如,如果 x 轴需要 45 个像素来跨越 1 hour
(60 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);
最后一部分计算角度 φ
并将其从弧度转换为度数。
我们有一个监控应用程序,可以按 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(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) );
是不正确的,因为x和y 轴有不同的单位和角度 总是 无量纲。
需要的附加信息是图形区域的大小(以像素为单位)以及值的范围。或者,两个轴的 pixels/unit 中的缩放 gx
、gy
。
例如,如果 x 轴需要 45 个像素来跨越 1 hour
(60 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);
最后一部分计算角度 φ
并将其从弧度转换为度数。