- Messaggi: 169
- Ringraziamenti ricevuti 8
import numpy as np
prodottoS=lambda a,b: np.sum(a*b,axis=0)
normalizza=lambda a: a/np.linalg.norm(a,axis=0)
class Camera:
def __init__(self,centro,risoluzione):
self.c=np.array(centro).reshape(3,1)
F=.61
mm=.55
xv,yv=np.meshgrid(np.linspace(-.5,.5,risoluzione),
np.linspace(-.5,.5,risoluzione))
zv=np.zeros((risoluzione,risoluzione))-F
o=np.stack((xv*mm,yv*mm,zv))
self.r=-normalizza(o).reshape(3,-1)
self.o=(o+self.c[:,np.newaxis]).reshape(3,-1)
risoluzione=128
cam=Camera([0,.35,-3],risoluzione)
Accedi al sito per partecipare alle discussioni.
class Sfera:
C=0
R=[]
n=1
def __init__(self,centro,raggio,colore):
if (self.n==1):
Sfera.C=np.array(centro).reshape(3,1)
self.c=np.array(centro).reshape(3,1)
self.r=raggio
Sfera.C=np.concatenate((Sfera.C,self.c))
Sfera.R.append(raggio)
self.r2=raggio*raggio
self.col=np.array(colore)
self.i=Sfera.n
Sfera.n+=1
def intercetta(self,origine,direzione,d0,ind):
L=self.c-origine
np.seterr(all='ignore')
tca=prodottoS(L,direzione)
d2= prodottoS(L,L)-tca*tca
thc=np.sqrt(self.r2-d2)
t0=tca-thc
t1=tca+thc
t0=np.where(t1<t0,t1,t0)
t0=np.where(t0<0,np.nan,t0)
m=np.where(t0<d0)
d0[m]=t0[m]
ind[m]=self.i
np.seterr(all='warn')
Accedi al sito per partecipare alle discussioni.
def distanze(o,r,scena):
t=np.zeros(o.shape[1:])+1e20
ind=np.zeros(t.shape).astype(int)
for i in scena:
i.intercetta(o,r,t,ind)
return t,ind
def disegna(o_camera,r_camera,scena,luce):
t,ind=distanze(o_camera,r_camera,scena)
img=np.zeros((t.shape))
visibile=(ind>0)
img[visibile]=ind[visibile]
return img
luce=normalizza(np.array([0, 5, 10]).reshape(3,1))
scena=[Sfera([.75,.1,1.],.6,[1.0,1.0,1.0]),
Sfera([-.75,.1,2.25],.6,[1.0,1.0,1.0]),
Sfera([-2.75,.1,3.5],.6,[1.0,1.0,1.0]),
Sfera([0,-99999.5,0],99999.,[1.0,1.0,1.0])]
Sfera.C=Sfera.C.reshape(-1,3)
Sfera.R=np.array(Sfera.R)
img=disegna(cam.o,cam.r,scena,luce)
from matplotlib import pyplot as plt
plt.imshow(img.reshape((risoluzione,risoluzione)))
plt.show()
Accedi al sito per partecipare alle discussioni.
def scev(N,L,R):
NL=prodottoS(N,L)
NR=prodottoS(N,-R)
phi_l=normalizza(L-NL*N)
phi_r=normalizza(-R-NR*N)
cos_phi=prodottoS(phi_l,phi_r)
phi=(np.degrees(np.arccos(cos_phi))/10).astype(int)
thr=(np.degrees(np.arccos(NR))/10).astype(int)
thl=(np.degrees(np.arccos(NL))/10).astype(int)
lum=TAB[thl,thr,phi]
return lum
from matplotlib import pyplot as plt
b=plt.imread("scevcenco.png")*65.535
plt.imshow(b)
plt.show()
Accedi al sito per partecipare alle discussioni.
def disegna(O,R,scena,l):
Pxyz = lambda i: O[:,i]+t[i]*R[:,i]# xyz_punto = xyz_origine_raggio + distanza * direzione_raggio
riflesso = lambda i : normalizza(R[:,i]-N[:,i]*2*prodottoS(R[:,i],N[:,i]))
distanza = lambda i : distanze(O[:,i]+N[:,i]*0.00001,R[:,i],scena)
normale = lambda i : normalizza(O[:,i]-Sfera.C[ind[i]].T)
img=np.zeros((R.shape[1:]))
N=np.zeros((R.shape))
t,ind=distanze(O,R,scena)
oggetti=np.where(ind!=0)[0]
regolite=oggetti[(ind[oggetti]==4)]
riflettenti=oggetti[ind[oggetti]!=4]
O[:,oggetti]=Pxyz(oggetti)
N[:,oggetti]=normalizza(O[:,oggetti]-Sfera.C[ind[oggetti]].T)
R[:,riflettenti]=riflesso(riflettenti)
t[riflettenti],ind[riflettenti]=distanza(riflettenti)
regolite_riflessa=riflettenti[ind[riflettenti]==4]
O[:,regolite_riflessa]=Pxyz(regolite_riflessa)
N[:,regolite_riflessa]=normale(regolite_riflessa)
regolite=np.concatenate((regolite,regolite_riflessa))
t[regolite],ind[regolite]=distanze(O[:,regolite]+N[:,regolite]*0.00001,l,scena)
regolite=regolite[ind[regolite]==0]
img[regolite]=scev(N[:,regolite],l,R[:,regolite])
return img
from matplotlib import pyplot as plt
risoluzione=512*2
cam=Camera([0,.35,-3],risoluzione)
luce=normalizza(np.array([0, 5, 10]).reshape(3,1))
scena=[Sfera([.75,.1,1.],.6,[1.0,1.0,1.0]),
Sfera([-.75,.1,2.25],.6,[1.0,1.0,1.0]),
Sfera([-2.75,.1,3.5],.6,[1.0,1.0,1.0]),
Sfera([0,-99999.5,0],99999.,[1.0,1.0,1.0])]
Sfera.C=Sfera.C.reshape(-1,3)
Sfera.R=np.array(Sfera.R)
TAB=(plt.imread("scevcenco.png")*65.535).reshape((9,10,19))
img=disegna(cam.o,cam.r,scena,luce)
plt.imshow(img.reshape((risoluzione,risoluzione)))
plt.show()
Accedi al sito per partecipare alle discussioni.
import numpy as np
def prodottoS(a,b):
if (b.ndim==1):
return a.dot(b)
else:
return np.einsum("ij,ij->i",a,b)
def normalizza(a):
if (a.ndim==1):
return a/np.linalg.norm(a,axis=0)
else:
return a/np.expand_dims(np.sqrt(prodottoS(a,a)),axis=1)
class Camera:
def __init__(self,centro,risoluzione):
global o
self.c=np.array(centro)
F=.61
mm=.55
xv,yv=np.meshgrid(np.linspace(-.5,.5,risoluzione),
np.linspace(-.5,.5,risoluzione))
zv=np.zeros((risoluzione,risoluzione))-F
o=np.dstack((xv*mm,yv*mm,zv)).reshape(-1,3)
self.r=-normalizza(o)
self.o=(o+self.c)
class Sfera:
C=0
R=[]
n=1
def __init__(self,centro,raggio,colore):
if (self.n==1):
Sfera.C=np.array(centro)
self.c=np.array(centro)
self.r=raggio
Sfera.C=np.concatenate((Sfera.C,self.c))
Sfera.R.append(raggio)
self.r2=raggio*raggio
self.col=np.array(colore)
self.i=Sfera.n
Sfera.n+=1
def intercetta(self,origine,direzione,d0,ind):
L=self.c-origine
np.seterr(all='ignore')
tca=prodottoS(L,direzione)
d2= prodottoS(L,L)-tca*tca
thc=np.sqrt(self.r2-d2)
t0=tca-thc
t1=tca+thc
t0=np.where(t1<t0,t1,t0)
t0=np.where(t0<0,np.nan,t0)
m=np.where(t0<d0)
d0[m]=t0[m]
ind[m]=self.i
np.seterr(all='warn')
def distanze(o,r,scena):
t=np.zeros(o.shape[:-1])+1e20
ind=np.zeros(t.shape).astype(int)
for i in scena:
i.intercetta(o,r,t,ind)
return t,ind
def disegna(O,R,scena,l):
Pxyz = lambda i: O[i]+R[i]*t[i,np.newaxis]
riflesso = lambda i : normalizza( R[i]-(N[i]*2*prodottoS(R[i],N[i])[:,np.newaxis]))
distanza = lambda i : distanze(O[i]+N[i]*0.00001,R[i],scena)
normale = lambda i : normalizza(O[i]-Sfera.C[ind[i]])
img=np.zeros((R.shape[:-1]))
N=np.zeros((R.shape))
t,ind=distanze(O,R,scena)
oggetti=np.where(ind!=0)[0]
regolite=oggetti[(ind[oggetti]==4)]
riflettenti=oggetti[ind[oggetti]!=4]
O[oggetti]=Pxyz(oggetti)
N[oggetti]=normalizza(O[oggetti]-Sfera.C[ind[oggetti]])
R[riflettenti]=riflesso(riflettenti)
t[riflettenti],ind[riflettenti]=distanza(riflettenti)
regolite_riflessa=riflettenti[ind[riflettenti]==4]
O[regolite_riflessa]=Pxyz(regolite_riflessa)
N[regolite_riflessa]=normale(regolite_riflessa)
regolite=np.concatenate((regolite,regolite_riflessa))
t[regolite],ind[regolite]=distanze(O[regolite]+N[regolite]*0.00001,l,scena)
regolite=regolite[ind[regolite]==0]
img[regolite]=scev(N[regolite],l,R[regolite])
return img
def scev(N,L,R):
NL=prodottoS(N,L)
NR=prodottoS(N,-R)
phi_l=normalizza(L-N*NL[:,np.newaxis])
phi_r=normalizza(-R-N*NR[:,np.newaxis])
cos_phi=prodottoS(phi_l,phi_r)
phi=(np.degrees(np.arccos(cos_phi))/10).astype(int)
thr=(np.degrees(np.arccos(NR))/10).astype(int)
thl=(np.degrees(np.arccos(NL))/10).astype(int)
return TAB[thl,thr,phi]
from matplotlib import pyplot as plt
import time
risoluzione=512*2
cam=Camera([0,.35,-3],risoluzione)
luce=np.array([0, 5, 10])
luce=normalizza(luce)
scena=[Sfera([.75,.1,1.],.6,[1.0,1.0,1.0]),
Sfera([-.75,.1,2.25],.6,[1.0,1.0,1.0]),
Sfera([-2.75,.1,3.5],.6,[1.0,1.0,1.0]),
Sfera([0,-99999.5,0],99999.,[1.0,1.0,1.0])]
Sfera.C=Sfera.C.reshape(-1,3)
Sfera.R=np.array(Sfera.R)
TAB=(plt.imread("scevcenco.png")*65.535).reshape((9,10,19))
t0=time.time()
img=disegna(cam.o,cam.r,scena,luce)
print (time.time()-t0)
plt.imshow(img.reshape((risoluzione,risoluzione)))
plt.show()
Accedi al sito per partecipare alle discussioni.
def inverti32bit(bits):
bits = (bits << 16) | (bits >> 16);
bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1);
bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2);
bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4);
bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8);
return bits * 2.3283064365386963e-10
def emisfero(n=128):
N=np.arange(n,dtype=np.uint32)
u=inverti32bit(N)
theta=np.arccos(np.sqrt(1-u))
v=N/n
phi=2*np.pi*v
x = np.sin(theta)*np.cos(phi)
z = np.sin(theta)*np.sin(phi)
y = np.cos(theta)
return np.dstack((x,y,z))[0]
def nuovoSdC(N):
Nt=np.zeros(N.shape)
Nb=np.zeros(N.shape)
m=np.abs(N[:,0])>np.abs(N[:,1])
if len(Nt[m]):
Nt[m]=np.dstack((N[m][:,2],np.zeros(m.sum()),-N[m][:,0]))[0]
if len(Nt[~m]):
Nt[~m]=np.dstack((np.zeros((~m).sum()),-N[~m][:,2],N[~m][:,1]))[0]
Nt=normalizza(Nt)
Nb=np.cross(N,Nt)
return Nb,Nt
....
O[oggetti]=Pxyz(oggetti)
N[oggetti]=normalizza(O[oggetti]-Sfera.C[ind[oggetti]])
##la parte da cambiare e` la seguente:
Nt,Nb=nuovoSdC(N[oggetti])
m=np.dstack((Nt,N[oggetti],Nb))
Re=np.inner(EMI,m)
Re=np.swapaxes(Re,0,1).reshape(-1,3)
Oe=np.repeat(O[oggetti]+N[oggetti]*0.00001,CAMPIONI,axis=0)
t0,ind0=distanze(Oe,Re,scena)
t0=t0.reshape(-1,CAMPIONI).sum(1)
img[oggetti]=t0
return img
from matplotlib import pyplot as plt
import time
##parte da modificare:
CAMPIONI=128
EMI=emisfero(CAMPIONI)
risoluzione=128
##fine modifica
cam=Camera([0,.35,-3],risoluzione)
Accedi al sito per partecipare alle discussioni.
def prodottoS(a,b):
if (b.ndim==1):
return a.dot(b)
elif(a.ndim==2 and b.ndim==2):
return np.einsum("ij,ij->i",a,b)
elif(a.ndim==3 and b.ndim==3):
return np.einsum("ijk,ijk->ij",b,a)
elif(a.ndim==2 and b.ndim==3):
return np.einsum("ijk,jk->ij",b,a)
def normalizza(a):
if (a.ndim==1):
return a/np.linalg.norm(a,axis=0)
if (a.ndim==2):
return a/np.expand_dims(np.sqrt(prodottoS(a,a)),axis=1)
elif (a.ndim==3):
return a/np.expand_dims(np.sqrt(prodottoS(a,a)),axis=2)
def distanze(o,r,scena):
if (r.ndim==1):
t=np.zeros(o.shape[:-1])+1e20
else:
t=np.zeros(r.shape[:-1])+1e20
ind=np.zeros(t.shape,dtype=np.uint8)
for i in scena:
i.intercetta(o,r,t,ind)
return t,ind
def disegna(O,R,scena,l):
Pxyz = lambda i: O[i]+R[i]*t[i,np.newaxis]
riflesso = lambda i : normalizza( R[i]-(N[i]*2*prodottoS(R[i],N[i])[:,np.newaxis]))
distanza = lambda i : distanze(O[i]+N[i]*0.00001,R[i],scena)
normale = lambda i : normalizza(O[i]-Sfera.C[ind[i]])
img=np.zeros((R.shape[:-1]))
N=np.zeros((R.shape))
t,ind=distanze(O,R,scena)
oggetti=np.where(ind!=0)[0]
regolite=oggetti[(ind[oggetti]==4)]
sfere=oggetti[ind[oggetti]!=4]
O[oggetti]=Pxyz(oggetti)
N[oggetti]=normalizza(O[oggetti]-Sfera.C[ind[oggetti]])
Nt,Nb=nuovoSdC(N[sfere])
m=np.dstack((Nt,N[sfere],Nb))
Re=np.inner(EMI,m)
Oe=O[sfere]
t0,ind0=distanze(Oe,Re,scena)
Pe=Oe+Re*t0[...,np.newaxis]
Ne=normalizza(Oe-Sfera.C[ind0])
t1,ind1=distanze(Pe+Ne*0.00001,l,scena)
ireg=(ind0==4)*(ind1==0)
reg=np.zeros(ireg.shape)
reg[ireg]=scev(Ne[ireg],l,Re[ireg])
img[sfere]=np.average(reg,axis=0)*prodottoS(N[sfere],-R[sfere])*.9
t[regolite],ind[regolite]=distanze(O[regolite]+N[regolite]*0.00001,l,scena)
regolite=regolite[ind[regolite]==0]
img[regolite]=scev(N[regolite],l,R[regolite])
return img
Accedi al sito per partecipare alle discussioni.