``프로그램으로 고사리 그리기''를 Emacs Lisp로 그리기
17587 단어 객체 지향emacs-lisplisp프로그래밍Emacs
"프로그램으로 고사리를 그리기"기사들에게 영감을 받아 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))))
Reference
이 문제에 관하여(``프로그램으로 고사리 그리기''를 Emacs Lisp로 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akmiyoshi/items/ff4df934a5a89aaafbcb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)