Set near-point correctly when at or above hyperfocal. Avoid divide by 0 errors at... debian-0.14-1 v0.14
authorKevin Rosenberg <kevin@rosenberg.net>
Sun, 9 Sep 2007 22:30:22 +0000 (16:30 -0600)
committerKevin Rosenberg <kevin@rosenberg.net>
Sun, 9 Sep 2007 22:30:22 +0000 (16:30 -0600)
debian/changelog
dof.lisp

index 9cfcf33f52077d0d6da93cb0dceb5e0469078591..38c21368072a737495035d1c86806a0d408debe8 100644 (file)
@@ -1,3 +1,9 @@
+cl-photo (0.14-1) unstable; urgency=low
+
+  * Set near-point correctly when at or above hyperfocal
+
+ -- Kevin M. Rosenberg <kmr@debian.org>  Sun,  9 Sep 2007 16:28:58 -0600
+
 cl-photo (0.13-1) unstable; urgency=low
 
   * Check if object distance is beyond hyperfocal distance and report infinity for dof (closes:438197)
index 55b7b2a3696db4595a03c82a5046d97bc9addf6e..d8677d307ad3b40d873f6f4180e66c023f8456a4 100644 (file)
--- a/dof.lisp
+++ b/dof.lisp
@@ -90,6 +90,7 @@ 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))
+         (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))
@@ -97,14 +98,17 @@ Reference: http://www.vanwalree.com/optics/dofderivation.html"
          (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)))
+         (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 (- far near)))
-    (when (and (< far 0) (> distance focal-length))
-      (setq far most-positive-short-float)
-      (setq depth most-positive-short-float))
+         (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
@@ -115,17 +119,21 @@ 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))
+         (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 (+ 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 (- far near)))
-    (when (and (< far 0) (> distance focal-length))
-      (setq far most-positive-short-float)
-      (setq depth most-positive-short-float))
+         (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))