球拍 - 切割 din Ax 的算法

racket - algorithm to cut din Ax

我正在开发一个迷你游戏,我需要找出如果我将 DIN-Ax 作为输入,我可以在一张 DIN-A0 纸上画多少行。例如:

;car horizontal and cdr vertical lines
(define A1 (list 0 1))
(define A2 (list 1 1))
(define A3 (list 1 3))
(define A4 (list 3 3))
(define A5 (list 3 7))
(define A6 (list 7 7))
(define A7 (list 7 15))
(define A8 (list 15 15))
(define A9 (list 15 31))
(define A10(list 31 31))  

如果我输入 A1,我可以绘制 0 条水平线和 1 条垂直线,依此类推。我手工计算了它们,但我想知道是否有更优雅的算法来自动获取它,因为我无法开发一个。以下是有关 DIn 的更多信息: http://en.wikipedia.org/wiki/ISO_216

谢谢

编辑:这说明了我的意思。

http://www.prepressure.com/library/paper-size/din-a4

使用 A1,您可以绘制 (0 1) 表示 1 条垂直线。 使用 A2,您可以绘制 (1 1) 表示 1 条水平线和 1 条垂直线,因为 A0 sheet 中有四个 A2。依此类推 A3 (1 3)...

编辑:几乎完成,我只需要弄清楚如何处理第一次迭代,因为如果我写 (get-cuts 1 0 0 0) 我得到 DIN Ax-1 削减。当我有更多时间时,我会解决它。

(define (get-cuts DIN-A count vl hl)
  (cond 
    ((= DIN-A count) (list vl hl))
    ((not(= (modulo count 2) 0)) (get-cuts DIN-A (+ count 1) hl (+(* hl 2) 1))) ; DIN-A impares
    ((= (modulo count 2) 0) (get-cuts DIN-A (+ count 1) hl hl )) ; DIN-A pares
  )
)

你要的是算法,我做了一个:

假设对于 A0,您可以绘制 0 水平线(我们称之为 A0.hl)和 0 垂直线(我们称之为 A0.vl)。

然后A1可以分别画A0.vl(A0.vl*2)+1条横线和竖线。

与 A2 类似,您可以绘制 A1.vl(A1 的垂直线数)条水平线和完全相同数量的垂直线(这是因为我们正在检查一对数字 [2])。

因此,对于任何 x>1x%2 != 0:对于 Ax 你可以绘制 Ax-1.vl 水平线和 (A*x-2.vl* * 2) + 1 垂直线。

AND 对于任何 x>1,使用 x%2 == 0:对于 Ax 你可以绘制 Ax-1.vl 水平线和 Ax-1.vl 垂直线.

你可以用尾递归来做到这一点;也许保留对数和奇数(4 个变量)的水平和垂直线的数量,但也许有一种简单的方法不必保留所有这些变量。我会再考虑一下,但我现在得走了。

希望这可以帮助您获得更好的主意!

如有任何疑问,请告诉我们 ;)