球拍 - 切割 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>1,x%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 个变量)的水平和垂直线的数量,但也许有一种简单的方法不必保留所有这些变量。我会再考虑一下,但我现在得走了。
希望这可以帮助您获得更好的主意!
如有任何疑问,请告诉我们 ;)
我正在开发一个迷你游戏,我需要找出如果我将 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>1,x%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 个变量)的水平和垂直线的数量,但也许有一种简单的方法不必保留所有这些变量。我会再考虑一下,但我现在得走了。
希望这可以帮助您获得更好的主意!
如有任何疑问,请告诉我们 ;)