跨越的岁月与线条
一些最早的数学是为了设计日历而发明的。由于地球绕其轴自转约365.25次围绕太阳公转,阳历中的某些年份需要365天长其他时间为366天,以保持日历与太阳同步。设计日历的关键挑战是找到一个达到预期近似值的长短年模式。儒略历使用简单的一跃模式每四年一次。与月亮同步的伊斯兰日历需要每年约354.37天。为此,它插入30年周期中的11个闰年。
Bresenham的算法选择要绘制线的位图表示时使用。基本思想是,对于一条大致水平的向上倾斜的线,是从左向右移动,一次移动一个像素,当实际y和像素近似y之间的距离变得太大了。
牵引线(dx,dy)/*主要是水平线,向上线*/x=0y=0错误=0while(x<dx | y<dy)牵引点(x,y);x++;如果(x*(dy/dx)-y>0.5)y++;牵引点(x,y);
例如,绘制一条30像素长、12像素高的线会产生
在他们2004年的论文中”线条绘制,闰年与欧几里得“(PDF),米切尔·哈里斯(Mitchell Harris)和爱德华·莱因戈尔德(Edward Reingold)表示,选择闰年的问题模式是Bresenham线描问题的一个推广版本。这是令人惊讶的,但当你意识到这两者时,这就有了直观的意义与计算有理分式的整数近似有关尽可能均匀。闰年的计算基本上与斜率1/365.25(或1/364.37):每个像素是一天,其y坐标决定它属于哪一年。
哈里斯和莱因戈尔德继续证明欧几里德的算法可以计算闰年模式!欧几里德算法通常计算两个数字的最大公约数:
gcd(u,v)而(u!=v)如果(u>v)u=u mod v;其他v=v mod u;返回u;
联系是如果你想画一条线dx公司通过第y天但是dx公司和第y天有一些公约数d日然后是Bresenham算法只会发出线条的图案dx/d通过年月日,d日次。上述示例可以视为两条15x6线、三条10x4线或六条5x2线:
欧几里德算法给出了最大可能d日,您可以调整算法以适应在计算时构建关联的重复模式d日.
在第2卷,Donald Knuth称之为“所有算法的鼻祖,因为它是最古老的非平凡算法,一直延续到今天。”它似乎也有一些著名的孩子。
进一步阅读:
Bresenham在1965年的论文中描述了他的算法“数字绘图仪的计算机控制算法”
Godfried Toussant 2005年的论文“欧几里德算法生成传统的音乐节奏”显示了另一种模式连接,这次是节奏。
公历是儒略历的演变版本不能被视为布雷森汉姆线。然而,杰弗里·沙利特1994年的论文“皮尔斯展开式和闰年的确定规则“显示如何计算闰年使用穿孔膨胀,该模型还可以生成公历。
Edward Reingold和Nashum Dershowitz是日历算法方面的专家。他们的文件1990日历计算和1993历法计算II:三种历史历法为您可能想要进行的任何与日期相关的计算提供了算法(和Lisp代码)。他们在书中详述了这些文件历法计算:千年版和历法表:1900-2200.