home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / lib / site-packages / cgkit / hammersley.py < prev    next >
Encoding:
Python Source  |  2007-01-11  |  7.4 KB  |  215 lines

  1. # ***** BEGIN LICENSE BLOCK *****
  2. # Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3. #
  4. # The contents of this file are subject to the Mozilla Public License Version
  5. # 1.1 (the "License"); you may not use this file except in compliance with
  6. # the License. You may obtain a copy of the License at
  7. # http://www.mozilla.org/MPL/
  8. #
  9. # Software distributed under the License is distributed on an "AS IS" basis,
  10. # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. # for the specific language governing rights and limitations under the
  12. # License.
  13. #
  14. # The Original Code is the Python Computer Graphics Kit.
  15. #
  16. # The Initial Developer of the Original Code is Matthias Baas.
  17. # Portions created by the Initial Developer are Copyright (C) 2004
  18. # the Initial Developer. All Rights Reserved.
  19. #
  20. # Contributor(s):
  21. #
  22. # Alternatively, the contents of this file may be used under the terms of
  23. # either the GNU General Public License Version 2 or later (the "GPL"), or
  24. # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  25. # in which case the provisions of the GPL or the LGPL are applicable instead
  26. # of those above. If you wish to allow use of your version of this file only
  27. # under the terms of either the GPL or the LGPL, and not to allow others to
  28. # use your version of this file under the terms of the MPL, indicate your
  29. # decision by deleting the provisions above and replace them with the notice
  30. # and other provisions required by the GPL or the LGPL. If you do not delete
  31. # the provisions above, a recipient may use your version of this file under
  32. # the terms of any one of the MPL, the GPL or the LGPL.
  33. #
  34. # ***** END LICENSE BLOCK *****
  35. # $Id: hammersley.py,v 1.1 2006/02/17 18:56:09 mbaas Exp $
  36.  
  37. """
  38.   Hammersley & Halton point generation
  39.  
  40.   This module contains functions to generate points that are uniformly
  41.   distributed and stochastic-looking on either a unit square or a unit
  42.   sphere. The Hammersley point set is more uniform but is
  43.   non-hierarchical, i.e.  for different n arguments you get an
  44.   entirely new sequence. If you need hierarchical behavior you can use
  45.   the Halton point set.
  46.  
  47.   This is a Python version of the implementation provided in:
  48.  
  49.   Tien-Tsin Wong, Wai-Shing Luk, Pheng-Ann Heng
  50.   "Sampling with Hammersley and Halton points"
  51.   Journal of Graphics Tools, Vol. 2, No. 2, 1997, pp. 9-24
  52.   http://www.acm.org/jgt/papers/WongLukHeng97/
  53.   http://www.cse.cuhk.edu.hk/~ttwong/papers/udpoint/udpoints.html
  54.  
  55.   The original C versions of these functions are distributed under
  56.   the following license:
  57.   
  58.   (c) Copyright 1997, Tien-Tsin Wong
  59.   ALL RIGHTS RESERVED
  60.   Permission to use, copy, modify, and distribute this software for
  61.   any purpose and without fee is hereby granted, provided that the above
  62.   copyright notice appear in all copies and that both the copyright notice
  63.   and this permission notice appear in supporting documentation,
  64.  
  65.   THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  66.   AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  67.   INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  68.   FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL THE AUTHOR
  69.   BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  70.   SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  71.   KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  72.   LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  73.   THIRD PARTIES, WHETHER OR NOT THE AUTHOR HAS BEEN
  74.   ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  75.   ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  76.   POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  77. """
  78.  
  79. from math import pi, sqrt, cos, sin
  80. from cgtypes import *
  81.  
  82. # planeHammersley
  83. def planeHammersley(n):
  84.     """Yields n Hammersley points on the unit square in the xy plane.
  85.  
  86.     This function yields a sequence of n tuples (x,y) which
  87.     represent a point on the unit square. The sequence of points for
  88.     a particular n is always the same.  When n changes an entirely new
  89.     sequence will be generated.
  90.     
  91.     This function uses a base of 2.
  92.     """
  93.     for k in range(n):
  94.         u = 0
  95.         p=0.5
  96.         kk = k
  97.         while kk>0:
  98.             if kk & 1:
  99.                 u += p
  100.             p *= 0.5
  101.             kk >>= 1
  102.         v = (k+0.5)/n
  103.         yield (u, v)
  104.  
  105. # sphereHammersley
  106. def sphereHammersley(n):
  107.     """Yields n Hammersley points on the unit sphere.
  108.  
  109.     This function yields n vec3 objects representing points on the
  110.     unit sphere. The sequence of points for a particular n is always
  111.     the same.  When n changes an entirely new sequence will be
  112.     generated.
  113.  
  114.     This function uses a base of 2.    
  115.     """
  116.     for k in range(n):
  117.         t = 0
  118.         
  119.         p = 0.5
  120.         kk = k
  121.         while kk>0:
  122.             if kk & 1:
  123.                 t += p
  124.             p *= 0.5
  125.             kk >>= 1
  126.             
  127.         t = 2.0*t - 1.0
  128.         phi = (k+0.5)/n
  129.         phirad = phi*2.0*pi
  130.         st = sqrt(1.0-t*t)
  131.         yield vec3(st*cos(phirad), st*sin(phirad), t)
  132.  
  133. # planeHalton
  134. def planeHalton(n=None, p2=3):
  135.     """Yields a sequence of Halton points on the unit square in the xy plane.
  136.  
  137.     This function yields a sequence of two floats (x,y) which
  138.     represent a point on the unit square. The number of points to
  139.     generate is given by n. If n is set to None, an infinite number of
  140.     points is generated and the caller has to make sure the loop stops
  141.     by checking some other critera.  The sequence of generated points
  142.     is always the same, no matter what n is (i.e. the first n elements
  143.     generated by the sequence planeHalton(n+1) is identical to the
  144.     sequence planeHalton(n)).
  145.  
  146.     This function uses 2 as its first prime base whereas the second
  147.     prime p2 (which must be a prime number) can be provided by the user.
  148.     """
  149.     
  150.     k = 0
  151.     while k+1!=n:
  152.         u = 0
  153.         p = 0.5
  154.         kk = k
  155.         while kk>0:
  156.             if kk & 1:
  157.                 u += p
  158.             p *= 0.5
  159.             kk >>= 1
  160.         v = 0
  161.         ip = 1.0/p2
  162.         p = ip
  163.         kk = k
  164.         while kk>0:
  165.             a = kk % p2
  166.             if a!=0:
  167.                 v += a*p
  168.             p *= ip
  169.             kk = int(kk/p2)
  170.         yield (u,v)
  171.         k += 1
  172.  
  173. # sphereHalton
  174. def sphereHalton(n=None, p2=3):
  175.     """Yields a sequence of Halton points on the unit sphere.
  176.  
  177.     This function yields a sequence of vec3 objects representing
  178.     points on the unit sphere. The number of points to generate is
  179.     given by n. If n is set to None, an infinite number of points is
  180.     generated and the caller has to make sure the loop stops by
  181.     checking some other critera. The sequence of generated points is
  182.     always the same, no matter what n is (i.e. the first n elements
  183.     generated by the sequence sphereHalton(n+1) is identical to the
  184.     sequence sphereHalton(n)).
  185.  
  186.     This function uses 2 as its first prime base whereas the second
  187.     base p2 (which must be a prime number) can be provided by the user.
  188.     """
  189.     k = 0
  190.     while k+1!=n:
  191.         t = 0
  192.         p = 0.5
  193.         kk = k
  194.         while kk>0:
  195.             if kk & 1:
  196.                 t += p
  197.             p *= 0.5
  198.             kk >>= 1
  199.         t = 2.0*t - 1.0
  200.         st = sqrt(1.0-t*t)
  201.         phi = 0
  202.         ip = 1.0/p2
  203.         p = ip
  204.         kk = k
  205.         while kk>0:
  206.             a = kk % p2
  207.             if a!=0:
  208.                 phi += a*p
  209.             p *= ip
  210.             kk = int(kk/p2)
  211.         phirad = phi*4.0*pi
  212.         yield vec3(st*cos(phirad), st*sin(phirad), t)
  213.         k += 1
  214.     
  215.