要求可以展示任一月份月相,并单击日期实现绘图。本文浅析一下该题设计思路。
本题关键:
- 月历中每日对应星期
- 月相与日期对应关系
- turtle绘制月相
月历每日对应星期
日历相关问题可以直接用 calendar 标准库
月历里面有对应实现:
1 | import calendar |
看到该函数返回一个二维数组,表示月历中每一行(每一周)对应的日期,没有则为 0
应用到本题,只需要读取用户选择的年月,然后得到该函数对应的数据,用循环显示出控件即可
月相与日期对应关系
做了点研究,月相与农历大致能一一对应,可以从这里切入。
所以本题就可以转化为农历和公历的对应关系。
然而,农历和公历的关系是没有规律的,农历都是天文观测的结果,因此这里只需要下载农历公历对应关系的数据即可。
这里网上其实有很多实现,可以直接借鉴。
另外,这里推荐几个可用的库:sxtwl、zhdate
sxtwl库使用
1 | import sxtwl |
详情请参考https://pypi.org/project/sxtwl/
turtle绘制月相
思路是根据当前农历日与对应的农历月的总天数之比绘制月相。
月相可以通过类比球体投影的方式绘制。
把月亮想象成一个球体,则月相的变化可以看作是与其旋转轴与球面相交的两点所在的弧在旋转形成的一个投影。
绘制该图的关键在于绘制将月相分为明暗两面的弧。
想象球体的一个鸟瞰图,一半是明面,一半是暗面,明暗交界的线按农历作周期性旋转,然后月相展示的是一个正面的一个投影。
(此处应有图片配合,但是可惜没有…)
这里之前计算明暗交界线的代码有个错误,感谢qq1337361309纠正,我顺便把填充亮面的代码补全了,大家可以直接套用相关代码:
1 | import turtle |