revert back to using near/far point. Check for hyperfocal distance and set rear-point...
authorKevin Rosenberg <kevin@rosenberg.net>
Sun, 9 Sep 2007 22:02:21 +0000 (16:02 -0600)
committerKevin Rosenberg <kevin@rosenberg.net>
Sun, 9 Sep 2007 22:02:21 +0000 (16:02 -0600)
debian/changelog
dof.lisp

index 0ec61ac1b0fb958f758d274a7342edbb5dc08131..77e4854d43a29352696636e930b72890427be780 100644 (file)
@@ -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 <kmr@debian.org>  Sun,  9 Sep 2007 15:03:53 -0600
+ -- Kevin M. Rosenberg <kmr@debian.org>  Sun,  9 Sep 2007 15:54:51 -0600
 
 cl-photo (0.12-1) unstable; urgency=low
 
index 917a20df3e34f76c46971343ff97b56f220f978f..55b7b2a3696db4595a03c82a5046d97bc9addf6e 100644 (file)
--- 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)