#!/usr/bin/python
import numpy as np
from mayavi import mlab

R=1
r=0.25

def rotacija_x((x,y,z),kut):
	return (x,y*np.cos(kut)-z*np.sin(kut),y*np.sin(kut)+z*np.cos(kut))
	
def rotacija_y((x,y,z),kut):
	return (x*np.cos(kut)-z*np.sin(kut),y,x*np.sin(kut)+z*np.cos(kut))

def rotacija_z((x,y,z),kut):
	return (x*np.cos(kut)-y*np.sin(kut),x*np.sin(kut)+y*np.cos(kut),z)

def dvostruki_torus((x,y,z),R,r,A):
	d1=((x-1.25)**2+y**2+z**2+R**2-r**2)**2-4*(R**2)*((x-1.25)**2+y**2)
	d2=((x+1.25)**2+y**2+z**2+R**2-r**2)**2-4*(R**2)*((x+1.25)**2+y**2)
	d=d1*d2-A
	return d
	

def trostruki_torus((x,y,z),R,r,A):
	t1=((x-1.5)**2+y**2+z**2+R**2-r**2)**2-4*(R**2)*((x-1.5)**2+y**2)
	t2=((x-1.5*np.cos(2*np.pi/3.0))**2+(y-1.5*np.sin(2*np.pi/3.0))**2+z**2+R**2-r**2)**2-4*(R**2)*((x-1.5*np.cos(2*np.pi/3.0))**2+
	       (y-1.5*np.sin(2*np.pi/3.0))**2)
	t3=((x-1.5*np.cos(4*np.pi/3.0))**2+(y-1.5*np.sin(4*np.pi/3.0))**2+z**2+R**2-r**2)**2-4*(R**2)*((x-1.5*np.cos(4*np.pi/3.0))**2+
	       (y-1.5*np.sin(4*np.pi/3.0))**2)
	t=t1*t2*t3-A
	return t

x,y,z=np.ogrid[-6:6:150j,-6:6:150j,-6:6:150j]

#prvo (igranje s dvostrukim torusom)
#dv=dvostruki_torus((x,y,z),R,r,2) #stavi umjesto 2 neki drugi broj
#mlab.contour3d(dv,contours=[0],colormap='Set2')

#drugo (igranje s trostrukim torusom)
#tr=trostruki_torus((x,y,z),R,r,10)
#mlab.contour3d(tr,contours=[0], colormap='YlGnBu') 

##############################################################################

#dva trostruka torusa
t1=trostruki_torus((x,y,z),R,r,10)
t2=trostruki_torus((x,y,z+3),R,r,10)
mlab.contour3d(t1,contours=[0],colormap='YlGnBu')
mlab.contour3d(t2,contours=[0],colormap='YlGnBu')

#prvi dvostruki torus	(torus koji je iza)
#podaci=rotacija_y((x,y,z),np.radians(90))
podaci=rotacija_x(rotacija_y((x,y,z),np.radians(90)),-np.radians(30))
podaci=(podaci[0]-1.5,podaci[1]+2.5,podaci[2]) #konacni podaci
d1=dvostruki_torus(podaci,R,r,2)
mlab.contour3d(d1,contours=[0],colormap='YlGnBu')

#drugi dvostruki torus (torus lijevo)	
podaci2=rotacija_x(rotacija_y((x,y,z),np.radians(90)),np.radians(90))
podaci2=(podaci2[0]-1.5,podaci2[1]+2.5,podaci2[2])
d2=dvostruki_torus(podaci2,R,r,2)
mlab.contour3d(d2,contours=[0],colormap='YlGnBu')

#treci torus (torus desno)	
podaci3=rotacija_x(rotacija_y((x,y,z),np.radians(90)),np.radians(210))
podaci3=(podaci3[0]-1.5,podaci3[1]+2.5,podaci3[2])
d3=dvostruki_torus(podaci3,R,r,2)
mlab.contour3d(d3,contours=[0],colormap='YlGnBu')

mlab.show()
