Advertisement
fractaltom

Twins

Jan 17th, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.34 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Thurs Sept 07 2015
  4.  
  5. @author: Tom Babbitt
  6. """
  7. import random,math,cmath
  8. from PIL import Image
  9.  
  10. class Fd(object):
  11.     def __init__(self,*args):
  12.         if len(args) < 3:
  13.             if type(args[0]) == complex:
  14.                 real = args[0].real
  15.                 imag = args[0].imag
  16.                 if len(args) == 2:
  17.                     funk = args[1]
  18.             else:
  19.                 real = args[0]
  20.                 imag = 0.
  21.                 funk = 0.
  22.         else:
  23.             real = args[0]
  24.             imag = args[1]
  25.             funk = args[2]
  26.            
  27.         self.real = float(real)
  28.         self.imag = float(imag)
  29.         self.funk = float(funk)
  30.        
  31.     def distance_real(self):
  32.         if (-self.funk**2 - 2*self.imag*self.funk - self.imag**2) < 0.:
  33.             return Fd(math.sqrt(abs(-self.funk**2 - 2*self.imag*self.funk - self.imag**2)),.33333,.33333)
  34.         else:
  35.             return Fd(math.sqrt(-self.funk**2 - 2*self.imag*self.funk - self.imag**2),0.,0.)
  36.  
  37.     def distance_imag(self):
  38.         if (-self.funk**2 - 2*self.real*self.funk + self.real**2) < 0.:
  39.             return Fd(0.,math.sqrt(abs(-self.funk**2 - 2*self.real*self.funk + self.real**2)),.33333)
  40.         else:
  41.             return Fd(0.,math.sqrt(-self.funk**2 - 2*self.real*self.funk + self.real**2),0.)
  42.  
  43.     def distance_funk(self):
  44.         if (-self.imag**2 - 2*self.real*self.imag + self.real**2) < 0.:
  45.             return Fd(0.,.33333,math.sqrt(abs(-self.imag**2 - 2*self.real*self.imag + self.real**2)))
  46.         else:
  47.             return Fd(0.,0.,math.sqrt(-self.imag**2 - 2*self.real*self.imag + self.real**2))
  48.  
  49.     def distance(self):
  50.         a = self.distance_real()
  51.         b = a.Add(a,self.distance_imag())
  52.         c = b.Add(b,self.distance_funk())
  53.         return c
  54.  
  55.     def Add(self,Fd1,Fd2):
  56.         real = Fd1.real + Fd2.real
  57.         imag = Fd1.imag + Fd2.imag        
  58.         funk = Fd1.funk + Fd2.funk
  59.         return Fd(real,imag,funk)
  60.    
  61.     def Subtract(self,Fd1,Fd2):
  62.         real = Fd1.real - Fd2.real
  63.         imag = Fd1.imag - Fd2.imag        
  64.         funk = Fd1.funk - Fd2.funk
  65.         return Fd(real,imag,funk)
  66.    
  67.     def Multiply(self,Fd1,Fd2):
  68.         a,b,c = Fd1.real,Fd1.imag,Fd1.funk
  69.         d,e,f = Fd2.real,Fd2.imag,Fd2.funk
  70.         if (a,b,c) == (0.,0.,0.):
  71.             return Fd(0.,e+d,f+d)
  72.         elif (d,e,f) == (0.,0.,0.):
  73.             return Fd(0.,a+b,a+c)
  74.            
  75.         real = (a*d) - (b*e) - (c*f)
  76.         imag = (a*e) + (b*d)
  77.         funk = (a*f) + (c*d)
  78.         imunk= (b*f) + (c*e)        
  79.         if imunk < 0.:
  80.             real = real - imunk
  81.         else:
  82.             real = real + imunk    
  83.         return Fd(real,imag,funk)
  84.  
  85.     def Conjigate(self,Fd1):
  86.         real = Fd1.real
  87.         imag = -Fd1.imag
  88.         funk = -Fd1.funk
  89.         return Fd(real,imag,funk)
  90.    
  91.     def Reciprocal(self,Fd1):
  92.         Fdr = self.conjigate(Fd1)
  93.         divisor = Fd1.real**2 - Fd1.imag**2 - Fd1.funk**2
  94.         return Fd(Fdr.real/divisor , Fdr.imag/divisor , Fdr.funk/divisor)
  95.  
  96.     def Divide(self,Fd1,Fd2):
  97.         if (Fd1.real, Fd1.imag, Fd1.funk) == (0.,0.,0.):
  98.             return Fd(0.,Fd2.imag+(1./Fd2.real),Fd2.funk+(1./Fd2.real))
  99.         elif (Fd2.real, Fd2.imag, Fd2.funk) == (0.,0.,0.):
  100.             return Fd(0.,Fd1.imag+(1./Fd1.real),Fd1.funk+(1./Fd1.real))
  101.         divis = Reciprocal(Fd2)
  102.         return Multiply(Fd1,divis)
  103.                  
  104.     def Power(self,Fd1,n_pow):
  105.         Fd2 = self.Multiply(Fd1,Fd1)
  106.         if n_pow == 2:
  107.             return Fd2
  108.         else:
  109.             for i in range(n_pow-1):
  110.                 Fd2 = self.Multiply(Fd2,Fd1)
  111.             return Fd2
  112.  
  113.     def Absolute(self,Fd1):
  114.         return math.sgrt(Fd1.real**2 - Fd1.imag**2 - Fd1.funk**2)
  115. def mandle(a1):
  116.     j,c = a1[0],a1[1]
  117.     j = j.Power(j,4)
  118.     j = j.Add(j,c)
  119.     return ([j,c])
  120.  
  121. class IFS(object):
  122.     def __init__(self,Fn,Io):
  123.         self.Fn = Fn
  124.         self.Io = Io
  125.         self.Inext = Io
  126.     def __iter__(self):
  127.         return self
  128.     def next(self):
  129.         if self.Fn:
  130.             self.Inext = self.Fn(self.Inext)
  131.         return self.Inext
  132.  
  133. def checkval(Valu):  
  134.     vrl,vimg,vfnk = Valu.real,Valu.imag,Valu.funk
  135.     if math.isnan(vrl):
  136.         Valu = Fd(1.,vimg,vfnk)
  137.         vrl = 1.
  138.     if math.isnan(vimg):
  139.         Valu = Fd(vrl,1.,vfnk)
  140.         vimg = 1.
  141.     if math.isnan(vfnk):
  142.         Valu = Fd(vrl,vimg,1.)
  143.         vimg = 1.    
  144.     if vrl > 1.:
  145.         Valu = Fd(1.,vimg,vfnk)
  146.         vrl = 1.
  147.     elif vrl < -1.:
  148.         Valu = Fd(-1.,vimg,vfnk)
  149.         vrl = -1.
  150.     if vimg > 1.:
  151.         Valu = Fd(vrl,1.,vfnk)
  152.         vimg = 1.
  153.     elif vimg < -1.:
  154.         Valu = Fd(vrl,-1.,vfnk)
  155.         vimg = -1.
  156.     if vfnk > 1.:
  157.         Valu = Fd(vrl,vimg,1.)
  158.         vfnk = 1.
  159.     elif vfnk < -1.:
  160.         Valu = Fd(vrl,vimg,-1.)
  161.         vfnk = -1.
  162.     return Valu
  163.  
  164. superimg = [[0. for i in range(4098)] for j in range(4098)]
  165. superimg2 = [[0. for i in range(4098)] for j in range(4098)]
  166.  
  167. def imgux(gray,fname):
  168.     im = Image.new('L',(len(gray[int(len(gray)/2)]),len(gray)))
  169.     #for c,i in enumerate(gray):
  170.     #    for k,l in enumerate(i):
  171.     #        #print(c,k,l,)
  172.     #        im.putpixel((c,k),int(l))
  173.     [[im.putpixel((c,k),int(l)) for k,l in enumerate(i)] for c,i in enumerate(gray)]
  174.     im.save(fname)
  175.  
  176. for FD in (Fd(-.7,0.1333333333333333,.2),Fd(-.7,0.1666666666666667,.2),Fd(-.7,-0.1666666666666667,.2),Fd(-.7,-0.1333333333333333,.2)):
  177.     #((34-30)/30.,35,25,26)#(10,11,12,13,14,15,16,17,18,19,20,21,26)   #0.6333333333333333,.4 ,.2    
  178.     for extraitir in range(60):
  179.         rnum = Fd(random.uniform(-1.,1.),random.uniform(-1.,1.),random.uniform(-1.,1.))
  180.         #rnum = Fd(((extraitir-30.)/ 30.),((extraitir-30.)/ 30.),((extraitir-30.)/ 30.))
  181.         newIFS = IFS(mandle,[rnum,FD])
  182.         for itercount in range(2048):
  183.             nextnum = newIFS.next()            
  184.             nextnum[0] = checkval(nextnum[0])            
  185.             superimg[int(nextnum[0].imag * 2048.)+ 2047][int(nextnum[0].real * 2048.)+ 2047]  = 225#int((i+1) * 4.25)          
  186.             superimg2[int(nextnum[0].funk * 2048.)+ 2047][int(nextnum[0].real * 2048.)+ 2047] = 225#int((i+1) * 4.25)                        
  187.    
  188. imgux(superimg,'c:\\tom2\\twins\\realimag.png')
  189. imgux(superimg2,'c:\\tom2\\twins\\realfunk.png')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement