X-Git-Url: http://git.kpe.io/?p=cl-photo.git;a=blobdiff_plain;f=dof.lisp;h=d8677d307ad3b40d873f6f4180e66c023f8456a4;hp=917a20df3e34f76c46971343ff97b56f220f978f;hb=HEAD;hpb=532f6e063ec6c9932d02b524473fea4c27043883 diff --git a/dof.lisp b/dof.lisp index 917a20d..d8677d3 100644 --- a/dof.lisp +++ b/dof.lisp @@ -86,43 +86,60 @@ Default resolving power is 5 lpm at 25cm." (defun dof-mm (focal-length f-stop distance coc &key (pupil-factor 1)) "Returns depth of field based on focal-length, f-stop, distance, and coc. Six values are returned: -near dof, far dof, total dof, magnification, blur size at infinity (mm). +near point, far point, total dof, magnification, blur size at infinity (mm). Circle of confusion can either be a number or keyword designating format. Reference: http://www.vanwalree.com/optics/dofderivation.html" (let* ((aperture (/ focal-length f-stop)) - (pd (* aperture pupil-factor)) - (numerator (* coc (- distance focal-length) (+ focal-length (* pupil-factor (- distance focal-length))))) - (d1 (* pupil-factor coc (- distance focal-length))) - (d2 (* pd focal-length)) - (front-dof (/ numerator (+ d1 d2))) - (rear-dof (/ numerator (- d1 d2))) + (hyperfocal (hyperfocal focal-length f-stop coc)) + (numerator-1 (* (- pupil-factor 1) (- distance focal-length) + coc focal-length)) + (numerator-2 (* pupil-factor aperture focal-length distance)) + (denominator-1 (* pupil-factor coc (- distance focal-length))) + (denominator-2 (* pupil-factor aperture focal-length)) + (near (/ (+ numerator-1 numerator-2) + (+ denominator-1 denominator-2))) + (far (when (/= denominator-1 denominator-2) + (/ (- numerator-1 numerator-2) + (- denominator-1 denominator-2)))) (mag (float (/ focal-length (- distance focal-length)))) (infinity-blur-diameter (/ (* mag focal-length) f-stop)) - (depth (+ front-dof rear-dof))) - (values front-dof rear-dof depth mag infinity-blur-diameter))) + (depth (when far (- far near)))) + (when (or (>= distance hyperfocal) + (and (null far) (>= distance (* hyperfocal 0.99)))) + (setq near (/ hyperfocal 2) + far most-positive-short-float + depth most-positive-short-float)) + (values near far depth mag infinity-blur-diameter))) ;; Simplified calculation for symmetric lens (defun dof-symmetric-mm (focal-length f-stop distance coc) "Returns depth of field based on focal-length, f-stop, distance, and coc. Six values are returned: -near dof, far dof, total dof, near point, far point, magnification, +near point, far point, total dof, near point, far point, magnification, blur size at infinity (mm). Circle of confusion can either be a number or keyword designating format." (let* ((aperture (/ focal-length f-stop)) - (numerator (* coc (- distance focal-length) (+ focal-length (* (- distance focal-length))))) - (d1 (* coc (- distance focal-length))) - (d2 (* aperture focal-length)) - (front-dof (/ numerator (+ d1 d2))) - (rear-dof (/ numerator (- d1 d2))) + (hyperfocal (hyperfocal focal-length f-stop coc)) + (numerator (* distance coc (- distance focal-length))) + (factor-1 (* focal-length aperture)) + (factor-2 (* coc (- distance focal-length))) + (near (- distance (/ numerator (+ factor-1 factor-2)))) + (far (when (/= factor-1 factor-2) + (+ distance (/ numerator (- factor-1 factor-2))))) (mag (magnification :focal-length focal-length :object-distance distance :units :mm)) (infinity-blur-diameter (/ (* mag focal-length) f-stop)) - (depth (+ front-dof rear-dof))) - (values front-dof rear-dof depth mag infinity-blur-diameter))) + (depth (when far (- far near)))) + (when (or (>= distance hyperfocal) + (and (null far) (>= distance (* hyperfocal 0.99)))) + (setq near (/ hyperfocal 2) + far most-positive-short-float + depth most-positive-short-float)) + (values near far depth mag infinity-blur-diameter))) (defun dof (focal-length f-stop distance coc &key (units :mm) (pupil-factor 1)) "Returns the Depth of Field. Input: FOCAL-LENGTH, F-STOP, DISTANCE, CIRCLE-OF-CONFUSION. -Output: NEAR-DOF, FAR-DOF, TOTAL-DOF, MAGNIFICATION, BLUR-SIZE-OF-INFINITY-POINT-IN-MM." +Output: NEAR-POINT, FAR-POINT, TOTAL-DOF, MAGNIFICATION, BLUR-SIZE-OF-INFINITY-POINT-IN-MM." (multiple-value-bind (near-point far-point total-dof mag blur) (dof-mm focal-length f-stop (length->mm distance units) coc :pupil-factor pupil-factor)