;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10; Package: photo -*- ;;;; ************************************************************************* ;;;; FILE IDENTIFICATION ;;;; ;;;; Name: fov.lisp ;;;; Purpose: Field of view functions for cl-photo ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: April 2005 ;;;; ;;;; $Id$ ;;;; ;;;; This file, part of cl-photo, is Copyright (c) 2005 by Kevin Rosenberg. ;;;; Rights of modification and redistribution are in the LICENSE file. ;;;; ;;;; ************************************************************************* (in-package #:photo) (defun fov-one-dim (focal-length frame-size &key (projection :rectilinear)) (ecase projection (:rectilinear (radians->degrees (* 2 (atan (/ frame-size 2 focal-length))))) (:equisolid (radians->degrees (* 4 (asin (/ frame-size 4 focal-length))))) (:equidistance (radians->degrees (/ (* 2 frame-size) focal-length))) (:orthogonal (radians->degrees (* 2 (asin (/ frame-size 2 focal-length))))) (:stereographic (radians->degrees (* 4 (atan (/ frame-size 4 focal-length))))) )) (defun fov (focal-length frame-width frame-height &key (projection :rectilinear)) "Returns the angle of field of view for a focal length and frame size at infinity" (values (fov-one-dim focal-length frame-width :projection projection) (fov-one-dim focal-length frame-height :projection projection) (fov-one-dim focal-length (diagonal frame-width frame-height) :projection projection))) (defun fov-distance (focal-length frame-width frame-height distance &key (projection :rectilinear)) "Returns the field of view and image magnificaion ratio at a given distance. NOTE: magnification assumes that distance is in the same units as frame size: mm" (multiple-value-bind (fov-width fov-height fov-diagonal) (fov focal-length frame-width frame-height :projection projection) (let* ((d-width (* distance (sin (degrees->radians fov-width)))) (d-height (* distance (sin (degrees->radians fov-height)))) (d-diagonal (* distance (sin (degrees->radians fov-diagonal)))) (mag (/ frame-width d-width))) (values d-width d-height d-diagonal mag)))) (defun fov-format (focal-length format &key (projection :rectilinear)) "Returns the angle of field of view for a focal length and frame size at infinity" (let ((dim (format-dimensions format))) (fov focal-length (car dim) (cdr dim) :projection projection)))