在Node.js中使用SVG图形显示月相

3
我正在寻找一种方法/ npm包,可以实现以下功能:
  1. 月相
  2. SVG或任何图形表示的月相
  3. 该日期的照明
我尝试过suncalc,但在该包中,SunCalc.getMoonIllumination()可以同时满足照明和相位,但判断是否是满月有些棘手,并且它没有图形表示。

您可能需要寻找/创建自己的月亮图形。 - coagmano
@FredStark 如果您采用该方法,0.6262591729500427 将会被转换为 0.75,这是上一季度,但它应该是残月。 - Dhaval Chaudhary
1
https://runkit.com/coagmano/runkit-npm-suncalc-moonillumination - coagmano
@FredStark非常感谢,这个方法很有效。但是你能解释一下为什么28有效吗?如果你能把它作为答案放上去就太好了 :) - Dhaval Chaudhary
1
不确定我的格式是否正确,但希望我回答了您的问题 :) - coagmano
显示剩余4条评论
1个回答

4
我认为没有带有SVG的包,所以您需要自己获取/生成这些内容。
至于如何使SunCalc给出真正位于0、0.25、0.5或0.75的相位的好数字,最简单的方法是进行一些四舍五入:
如果您想直接将它们舍入到这些数字,可以将其四舍五入为最近的四分之一数:
var date = new Date();
Math.round(SunCalc.getMoonIllumination(date).phase * 4) / 4;

如果您希望它仍然经过月相增减部分,并在大约一天内保持满月/新月/四分之一状态,可以将其舍入到最近的28日:

var date = new Date();
Math.round(SunCalc.getMoonIllumination(date).phase * 28) / 28;

为什么这个方法有效?为什么是28?

最简单的解释是看一下 quarters 的例子。我们希望四舍五入后的数字能够与选项之一(0、0.25、0.5、0.75)匹配。

由于 Math.round 是将数字四舍五入到最接近的整数,因此我们需要将结果转化为可进行四舍五入的整数。通过将它们乘以 4,我们得到:

0    * 4 = 0
0.25 * 4 = 1
0.5  * 4 = 2
0.75 * 4 = 3

在这两个端点之间的所有内容最终都会舍入到其中一个端点(除了一些舍入为5,我们需要自己处理)。

然后我们将结果除以相同的乘数,以使数字回到预期范围内。

现在28有效的原因有两个:

  1. 4是28的因子。因此,一些数字将返回为0.25的倍数
  2. 因为它接近月亮周期(约29.53天)的长度

这意味着我们最终结果舍入到每个值大约需要一天的时间。


谢谢,这基本上解释了我需要的一切。但是最后一个问题:getMoonIllumination函数需要日期和时间,那么我应该传递当前时间还是特定时间(为了更准确)? - Dhaval Chaudhary
你只需要测试哪种方法对你最有效。你可能还需要查看时区如何影响结果。 - coagmano
Np :D 非常感谢!你救了我的一天 :) - Dhaval Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接