; -----------------------------------------------------------------------------
; (Points_generateUnitYIchimatsu rows points_length startsByCorner)
; -----------------------------------------------------------------------------
; 仮想格子幅・高さが 1 の 市松模様 点列 を生成する汎用の関数。
; 点の順番は「N」字の筆順の。
; rows : 市松模様の仮想格子の行数。
; points_length : 生成する点の個数。
; startsByCorner : 開始点を角にする場合は t、その右隣(左隣)にする場合は nil。
;
; (現在の実装は generateUnitXIchimatsu の結果を X/Y 転置したものです。)
; -----------------------------------------------------------------------------
(define (Points_generateUnitYIchimatsu rows points_length startsByCorner)
(mapcar 'reverse (Points_generateUnitXIchimatsu rows points_length startsByCorner))
)
; -----------------------------------------------------------------------------
; (Points_generateUnitXIchimatsu columns points_length startsByCorner)
; -----------------------------------------------------------------------------
; 仮想格子幅・高さが 1 の 市松模様 点列 を生成する汎用の関数。
; 点の順番は「Z」字の筆順の Y 方向反転。
; columns : 市松模様の仮想格子の列数。
; points_length : 生成する点の個数。
; startsByCorner : 開始点を角にする場合は t、その右隣(左隣)にする場合は nil。
; -----------------------------------------------------------------------------
(define (Points_generateUnitXIchimatsu columns points_length startsByCorner)
(let
(
(offset (if startsByCorner 0 1))
(buffer nil)
)
(if (evenp columns)
(let
((halfColumns (xquotient columns 2)))
(for n 0 (sub1 points_length)
(letseq
(
(y (xquotient n halfColumns))
(x (xplus (modulo (xtimes 2 n) columns) (modulo (xplus y offset) 2)))
)
(setq buffer (cons (list x y) buffer))
)
)
)
; else
(for n 0 (sub1 points_length)
(letseq
(
(_2n_plus_offset (plus (xtimes 2 n) offset))
(x (modulo _2n_plus_offset columns))
(y (xquotient _2n_plus_offset columns))
)
(setq buffer (cons (list x y) buffer))
)
)
)
(reverse buffer)
)
)