skill.geometry.Points_generateUnitYIchimatsu

Last-modified: 2021-09-21 (火) 00:12:46
; -----------------------------------------------------------------------------
; (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)
  )
)