Mercurial > lbo > hg > lispplay
view intensity.lisp @ 3:83743e601985 default tip
Add new lisp files
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 13 Oct 2019 14:00:24 +0200 |
parents | |
children |
line wrap: on
line source
#!/usr/bin/env -S sbcl --script ;; Calculate intensity of polarized light (defun norm (v) (sqrt (reduce (lambda (a e) (+ a (expt e 2))) v :initial-value 0))) (defun make-ray (x y) (vector x y)) (defun deg-to-rad (deg) (* PI (/ deg 180))) (defun random-normed-ray (&optional (max 100)) (flet ((random-component () (/ (1+ (random (1- max))) max))) (let* ((a (random-component)) (b (random-component)) (n (norm (list a b)))) (vector (/ a n) (/ b n))))) (defun polarize-ray (ray angle) (vector (* (cos angle) (aref ray 0)) (* (sin angle) (aref ray 1)))) (defun polarize-rays (rays angle) (map 'vector #'(lambda (r) (polarize-ray r angle)) rays)) (defun many-normed-rays (n) (loop for i from 1 to n collect (random-normed-ray) into rays finally (return (make-array (length rays) :initial-contents rays)))) (defun average-intensity (rays) (/ (reduce #'+ (map 'vector #'(lambda (r) (expt (norm r) 2)) rays) :initial-value 0) (length rays))) (let* ((angle 45) (sample 1000) (result (average-intensity (polarize-rays (many-normed-rays sample) angle)))) (format t "The intensity after polarizing with 45 degree filter is: ~a~%" result))