From: Kevin Rosenberg Date: Sun, 9 Sep 2007 22:02:21 +0000 (-0600) Subject: revert back to using near/far point. Check for hyperfocal distance and set rear-point... X-Git-Tag: v0.13~1 X-Git-Url: http://git.kpe.io/?p=cl-photo.git;a=commitdiff_plain;h=f765fcf71a5f509eb81cf7d4afc58318cd925862 revert back to using near/far point. Check for hyperfocal distance and set rear-point @ infinity if object is beyond hyperfocal --- diff --git a/debian/changelog b/debian/changelog index 0ec61ac..77e4854 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,8 @@ cl-photo (0.12-1) unstable; urgency=low - * New upstream (closes:438197) + * Check if object distance is beyond hyperfocal distance and report infinity for dof (closes:438197) - -- Kevin M. Rosenberg Sun, 9 Sep 2007 15:03:53 -0600 + -- Kevin M. Rosenberg Sun, 9 Sep 2007 15:54:51 -0600 cl-photo (0.12-1) unstable; urgency=low diff --git a/dof.lisp b/dof.lisp index 917a20d..55b7b2a 100644 --- a/dof.lisp +++ b/dof.lisp @@ -86,43 +86,52 @@ 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))) + (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 (/ (- 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 (- far near))) + (when (and (< far 0) (> distance focal-length)) + (setq far most-positive-short-float) + (setq 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))) + (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 (+ 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 (- far near))) + (when (and (< far 0) (> distance focal-length)) + (setq far most-positive-short-float) + (setq 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)