(in-package #:photo)
+(defun sort-size (size)
+ "Returns a cons pair with the smaller size first."
+ (if (>= (car size) (cdr size))
+ (cons (cdr size) (car size))
+ (cons (car size) (cdr size))))
+
+(defun print-magnification (imager-size print-size)
+ "Returns the magnification required between an imager and print sizes
+while taking crop into consideration."
+ (setf imager-size (sort-size imager-size))
+ (setf print-size (sort-size print-size))
+ (float (max (/ (car print-size) (car imager-size))
+ (/ (cdr print-size) (cdr print-size)))))
+
(defun coc (imager-size &key (lpm 5) (minimum-distance 250)
(viewing-distance 250)
(print-size (output-dimensions :8x10in)))
"Returns circle of confusion in mm and print magnification for a format.
Default resolving power is 5 lpm at 25cm."
-
- (let* ((imager-diagonal (diagonal (car imager-size) (cdr imager-size)))
- (print-diagonal (diagonal (car print-size) (cdr print-size)))
- (resolution-factor (/ (* lpm print-diagonal minimum-distance)
- (* imager-diagonal viewing-distance)))
- (coc (/ 1.0d0 resolution-factor))
- (print-magnification (/ print-diagonal imager-diagonal)))
- (values coc print-magnification)))
+ (let* ((magnification (print-magnification imager-size print-size))
+ (resolution-factor (/ (* magnification lpm minimum-distance) viewing-distance))
+ (coc (/ 1.0d0 resolution-factor)))
+ (values coc magnification)))
(defun coc-format (format &key (lpm 5) (minimum-distance 250)
(viewing-distance 250)
(defun mtf-scanner (freq dscan-freq &optional (order 3))
(abs (expt (kmrcl:sinc (* pi (/ freq dscan-freq))) order)))
-(defun freq-mtf-scanner (dscan-freq mtf &optional (order 3))
- (* dscan-freq (/ (asin (* x (exp (/ (log mtf) order)))) pi)))