Examples/市松模様配置 (X方向指向)

Last-modified: 2021-09-21 (火) 00:12:46

レイアウトのインスタンスを市松模様に配置するスクリプトです。配置は X 方向を優先に行います。

; -----------------------------------------------------------------------------
; (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances columns basePoint pitches startsByCorner)
; -----------------------------------------------------------------------------
; 与えられたインスタンス列 instances の要素を市松模様に配置する。
; 配置の順番は「Z」の字の筆順の Y 方向を反転したもの。
; ※ インスタンスの向き(R0、MY 等)は変更しない。
;   instances : 配置させたいインスタンス群
;   columns : 市松模様の仮想格子の列数。
;   basePoint : 市松模様の仮想格子の基準点。
;   pitches : 市松模様の仮想格子の1列の幅、1行の高さを要素とするリスト。要素は負数でも良い。
;   startsByCorner : 開始点を格子の角とする場合は t、その右隣(左隣)の位置とする場合は nil。
;
; 《例1》 (1.5, 3.75) の位置を基準に X方向ピッチ 13.5、Y方向ピッチ 7.25、
;      列数 6 の格子に、角を開始点として 8 個のインスタンスを配置する。
;
;   (setq instances (list ~8個のインスタンス~))
;   (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances 6 '(1.5 3.75) '(13.5 7.25) nil)
;
;   |6|-|7|-|-|-|
;   |-|3|-|4|-|5|
;   |0|-|1|-|2|-|
;
;   ※「0」の位置が (1.5, 3.75) である。
;
; 《例2》 例1と同様だが、角の右隣を開始点とする。
;
;   (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances 6 '(1.5 3.75) '(13.5 7.25) t)
;
;   |-|6|-|7|-|-|
;   |5|-|3|-|4|-|
;   |-|0|-|1|-|2|
;
;   ※「0」の位置が (1.5+13.5, 3.75) である。
;
; 《例3》 例1と同様だが、Y方向ピッチを -7.25 とする。
;
;   (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances 6 '(1.5 3.75) '(13.5 -7.25) nil)
;
;   |0|-|1|-|2|-|
;   |-|3|-|4|-|5|
;   |6|-|7|-|-|-|
;
;   ※「0」の位置が (1.5, 3.75) である。
; -----------------------------------------------------------------------------
(define (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances columns basePoint pitches startsByCorner)
  (setq instances (setof o instances (equal "inst" o~>objType)))
  (mapcar
    (lambda (i p) (i~>xy = (mapcar 'plus basePoint (mapcar 'times pitches p))))
    instances
    (Points_generateUnitXIchimatsu columns (length instances) 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)
  )
)

関連項目