``프로그램으로 고사리 그리기''를 Emacs Lisp로 그리기

  • 프로그램으로 고사리 그리기 - 강한 불로 진행
  • "프로그램으로 고사리 그리기"를 Dart로 그리기 - Qiita
  • "프로그램으로 고사리 그리기"를 Go로 그리기 - Qiita
  • Clojure - 프로그래밍 방식으로 고사리 그리기 - Qiita
  • ``프로그램으로 고사리 그리기''를 Python으로 그리기 - Qiita
  • ``프로그램으로 고사리 그리기''를 JavaScript+Canvas로 그리기 - Qiita
  • ``프로그램으로 고사리 그리기''를 PHP로 그리기 - Qiita

  • "프로그램으로 고사리를 그리기"기사들에게 영감을 받아 Emacs Lisp에서 써 보았습니다.
    sida.el을로드하고 M-x sida로 그립니다.
    (버그라든지 의견 있으시면 htps : // 라고 해서 r. 코 m / 아 k 미요시 까지 부탁합니다)



    sida.el
    (require 'cl)
    (require 'eieio)
    
    (defconst *sida-inverted-xbm-image*
      (or (eq system-type 'windows-nt)
          (and (eq system-type 'cygwin) (string= (getenv "DISPLAY") "w32"))))
    (defconst *sida-foreground-color* "green")
    (defconst *sida-background-color* "white")
    
    (defun W1x ($x $y) (+ (* 0.836 $x) (* 0.044 $y)))
    (defun W1y ($x $y) (+ (* -0.044 $x) (* 0.836 $y) 0.169))
    (defun W2x ($x $y) (+ (* -0.141 $x) (* 0.302 $y)))
    (defun W2y ($x $y) (+ (* 0.302 $x) (* 0.141 $y) 0.127))
    (defun W3x ($x $y) (- (* 0.141 $x) (* 0.302 $y)))
    (defun W3y ($x $y) (+ (* 0.302 $x) (* 0.141 $y) 0.169))
    (defun W4x ($x $y) 0)
    (defun W4y ($x $y) (* 0.175337 $y))
    
    (defclass <sida> ()
      ((width :initarg :width)
       (height :initarg :height)
       (bitmap :initarg :bitmap)
       (image :initarg :image)))
    
    (defmethod initialize-instance :after ((this <sida>) &rest $slots)
      (assert (slot-boundp this 'width))
      (assert (slot-boundp this 'height))
      (with-slots (width height bitmap image) this
        (assert (zerop (% width 8)))
        (setf bitmap (make-bool-vector (* width height) nil))
        (setf image
              (apply
               #'create-image
               bitmap 'xbm t
               :width width
               :height height
               :relief 2
               :pointer 'arrow
               (if *sida-inverted-xbm-image*
                   (list :foreground *sida-background-color*
                         :background *sida-foreground-color*)
                 (list :foreground *sida-foreground-color*
                       :background *sida-background-color*))))))
    
    (defmethod !f ((this <sida>) $k $x $y)
      (with-slots (width height) this
        (if (> $k 0)
            (loop for $i from 1 to 4 do
                  (when (or (= $i 1) (< (random 10) 3))
                    (!f this
                        (1- $k)
                        (funcall (intern (format "W%dx" $i)) $x $y)
                        (funcall (intern (format "W%dy" $i)) $x $y))))
          (!plot this
                 (+ (* $x 490) (* width 0.5))
                 (- height (* $y 490))))))
    
    (defmethod !plot ((this <sida>) $x $y)
      (with-slots (width height bitmap) this
        (let (($x (truncate $x))
              ($y (truncate $y)))
          (cond
           ((< $x 0) nil)
           ((>= $x width) nil)
           ((< $y 0) nil)
           ((>= $y height) nil)
           (t (let (($index (+ (* width $y) $x)))
                (when (and (>= $index 0) (< $index (length bitmap)))
                  (aset bitmap $index t))))))))
    
    (defun sida ()
      (interactive)
      (let (($sida (make-instance <sida> :width 520 :height 500)))
        (with-slots (image) $sida
          (switch-to-buffer "<sida>")
          (remove-images (point-min) (point-max))
          (put-image image (point-min))
          (!f $sida 20 0 0))))
    

    좋은 웹페이지 즐겨찾기