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

如何使用C#计算x-y轴上的时钟角度?,c#,trigonometry,C#,Trigonometry,我们有一个监控应用程序,可以在x轴上显示的5分钟、15分钟、1小时等时间间隔进行监控;y轴也是可伸缩的,其值为1.2345-1.5567或可切换为26000-30000等值 在x轴和y轴上设置比例后,如果不进行完整的数据刷新,它们不会动态更改 也就是说,我们只希望根据时钟角度,即沿y轴的最后5个间隔,通知某些人 时钟角度绝对不会逆时针超过0/12;同样,它们永远不会顺时针超过6 我知道当x轴值与5次间隔前完全相同时,3点钟的角度是明显的 但是,人们如何开始为这两者之间的一切进行编码呢?我可以很容

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

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

也就是说,我们只希望根据时钟角度,即沿y轴的最后5个间隔,通知某些人

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

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

但是,人们如何开始为这两者之间的一切进行编码呢?我可以很容易地得到x值的差值(在下面的示例图中,它是0.3),在下面的图中,y轴的差值是4

所以用三角函数,它和相邻函数相反,这意味着一个tan运算,我相信?如果是这样,0.3/5似乎不会产生任何类似时钟角度的值

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

任何帮助都将不胜感激

您应该使用atan2(,)

从wiki:

atan2(y,x)返回射线到点(x,y)和正x轴之间的角度θ,限制为(−π、 π]

请注意,结果在中,因此如果需要度,则需要对其进行转换

如上所述,一弧度等于180/π度。因此,要将弧度转换为度,请乘以180/π


这里有两件事。首先,我想你需要的是下面的角度
φ
,给定两个数据点
(x1,y1)
(x2,y2)

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

因此,执行
varφ=Math.Atan((y2-y1)/(x2-x1));
是不正确的,因为x轴和y轴的单位不同,角度总是无量纲的

需要的额外信息是图形区域的大小(以像素为单位)以及值的范围。或者,两个轴的缩放比例(以像素/单位为单位)

例如,如果x轴需要45个像素来跨越
1小时
60分钟
)的1个网格,则te缩放是
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);

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

谢谢!如果我使用你在我的例子中发布的,它将是atan(0.3),等于16.699度,对吗?:-)那么如果我们真的想进一步,说它在时钟上的位置,因为它是正的0.3,我们就取90度-16.699,等于73.301度。因为时钟上每分钟是6度,所以我们做73.301/6==12.21分钟。这听起来对吗?@user11827463,只需使用atan2就可以了。可以翻转顺序并反转其中一个参数,以使用所需的任意轴作为基准轴。或者,在获得角度后可以变换结果,无论哪种方法都可以。我建议您进行一些单元测试,以确保您已经涵盖了各种边缘情况,并获得了预期的结果。常规的
数学。Atan(z)
就足以解决这个问题。@john Alexiou您是对的,我的思维法则是在做几何时总是使用atan2,以避免需要考虑atan是否适合特定情况。@Johnalexou,这就是我今晚编写的代码,因为我知道x的值总是正值。我必须考虑的一个边缘情况是“规范化”所有差异,使其保持在-10和10之间,因为这些是真实有效的值,并且与x轴上显示的比例无关。我的例子有0.3的差异,但是当刻度是5位数(例如,25k-30k),并且有2k的差异时,这对于atan来说是不够的,但是2似乎符合。