我想知道如何制作一个JavaScript函数来返回给定分钟的坐标。中心坐标是时钟的中心,所以它们可以是负数。
在 Microsiervos 中,我找到了一个链接,它与我要问的内容相似,它是一个时钟,可以为您提供坐标时间。
我正在尝试除法或减法,但它不起作用。
function(minutos)
{
var x=0,y=0
x=minutos*60
y=x-12
return [x,y]
}
编辑:
看着一些答案,我看到了一些奇怪的东西:为什么使用cosine,如果可以使用sine提取价值?
根据这个游戏开发页面和这个数学页面,一个点的坐标可以通过知道来计算
假设时钟的中心有坐标
[0,0]
,那么新点坐标的公式将是这样的:对于正弦和余弦,我们可以使用JavaScript
sin()
和函数cos()
,它们都以弧度作为参数。这将我们带到第二点:以弧度表示的角度。我们知道圆周有 2π 弧度,一小时有 60 分钟,所以每分钟,角度将是这样的:对于 π 的值,我们可以使用属性
PI
。但它有一点技巧,因为方向是向右的,这意味着我们在前 15 分钟,所以角度必须稍微调整一下:把所有这些放在一起,我们会得到这样的东西:
这是一个示例(使用秒而不是分钟,但想法相似):
为了能够回答这个问题,假设时钟是一个圆,要知道坐标需要正弦函数,而正弦函数需要数字 pi,而计算pi的一种方法是通过反正弦函数。
这是Wikipedia 上 Number pi的文章,里面给出了如何用反正弦计算pi的公式。
正弦函数的公式是这样的。
想了想,考虑到一个完整的圆有360 度,一个小时有60 分钟,我能够解决这个问题,我也是这样做的,因为我不相信标准的javascript函数,由于不知道它的源代码,它必须在V8 引擎(维基百科)的某个地方,我想确保给出正确的值。
最终的代码是这样的。
在 Node.js 上测试:
编辑
事情的核心详细解释:
var rad = 2 * Math.PI * ( min / 60 ) - ( ( 2 * Math.PI ) / 4 );
我们将分钟转换为弧度。
( min / 60 )
它导致的度数等于指示的分钟数。要将其转换为弧度(所涉及的数学函数Math.sin
和Math.cos
,使用弧度,而不是度数),乘以 2Pi。函数
seno
和coseno
是周期函数,结果介于 -1 和 1 之间,包括 ( [-1, 1] )。该表达式准备了先前的结果(我们正在处理的弧度角度),以便 和 的输出对Math.sin()
我们Math.cos()
有用。假设它缩放弧度,使Math.sin()
y的结果Math.cos()
适合我们的整个圆空间。编辑 1以适应新版本的问题。
解释为什么这种替代是可能的
正如我之前所说,
seno( )
和coseno( )
是周期函数,即它们的值会随着时间的推移而重复。我们没有说的是它的周期,重复它的价值需要多长时间。在这两种情况下,它的周期都是 PI / 2。让我们仔细考虑一下......结果值的相同范围......相同的周期......这表明两个函数必须非常相似,只是改变 X 轴上的位移结果。在这张取自维基百科的酷图中,一切都可以很好地看到。X 轴以弧度表示角度,而 Y 轴表示函数的输出(它返回的值)。
资料来源:维基百科、三角学
如果我们查看图表,我们可以清楚地看到所有内容:
接下来,由于该图几乎没有任何值,因此我显示了一些值来检查它:
编辑 2
为什么值不匹配?根据上面的段落,它们应该匹配,对吧?
我建议看看为什么我的程序不能正确进行算术计算?
在这个示例表中,除了上述情况外,正如我们将在代码中看到的那样,部分错误在于函数的使用,该函数
Number.toFixed( )
丢弃了小数。在这种特定情况下,什么都没有发生,但是……如果我们必须缩放结果(将其乘以某个数字),则不准确性可能大到足以产生不需要的伪影,尤其是在图形问题上。结束编辑 2
Node.js 中的代码,非常简单,如果有人想检查一下:
值得赞赏的是
cos( 90º ) == 0
,这与 ; 完全相同sen( 0 ) == 0
。如前所述,角的余弦是 的正弦angulo - PI/2
;或者,换句话说,余弦var 45º后面。我们已经知道为什么这种替代是可能的。
回答新问题。
我为自己说话,别人会有自己的理由。我使用余弦是因为它是我在 Internet 上看到的所有示例中的内容。在没有余弦的情况下,我没有想到会这样做;-)
编辑 2
考虑到上面讨论的数值精度问题,事实证明使用 cosine 是有原因的。
让我们想想:
因此,它将比
coseno( X )
具有更高的精度seno( X - ( PI / 2 ) )
,原因很简单,后者使用 2 个不精确的数字来执行计算,这会增加输出的不精确性。什么东西 !
简单:三角圆
假设您的时钟在笛卡尔坐标平面上的半径为 1,那么您可以使用以下函数:
如果时钟的半径较大,只需将结果乘以半径即可。
这个想法是基于三角圆,我们知道圆周总是有两个 pi 弧度。
显然,我们必须在分钟和三角圆之间建立关系,默认情况下它是 pi 弧度,所以我们必须将分钟转换为弧度。
如果您想在另一个坐标系中使用,只需进行转换即可。