# geom.py import math, trigo def add (x,y): return [a+b for a,b in zip(x,y)] # x+t(y-x) def bari (x,y,t): return add(x,mul(t,diff(y,x))) def diff (x,y): return [a-b for a,b in zip(x,y)] # Distanza dall'iperpiano ||a,x||=c. def distdaiperpiano (a,c,p): return abs(prodottoscalare(a,p)-c)/float(lun(a)) # Lunghezza di un vettore. def lun (v): return math.sqrt(prodottoscalare(v,v)) def magico (z): (x,y)=z; return [-y,x] def mul (t,v): return [t*a for a in v] def prodottoscalare (u,v): s=0 for x,y in zip(u,v): s+=x*y return s # Proiezione di p sull'iperpiano ||a,x||=c. def prosuiperpiano (a,c,p): return add(p,mul((c-prodottoscalare(a,p))/float(prodottoscalare(a,a)),a)) # Proiezione di p sulla retta p0+Rw. def prosuretta (p0,w,p): t=prodottoscalare(diff(p,p0),w)/float(prodottoscalare(w,w)) return add(p0,mul(t,w)) # Riflessione di p in m. def riflinpunto (m,p): return diff(mul(2,m),p) # Riflessione di p nella retta p0+Rw. def riflinretta (p0,w,p): return riflinpunto(prosuretta(p0,w,p),p) # Rotazione di p attorno al centro m. # L'angolo alfa e' indicato in gradi. def rot (p,alfa,m=None): if m==None: m=(0,0) c=trigo.cosgradi(alfa); s=trigo.singradi(alfa) (x,y)=diff(p,m) return add(m,[x*c-y*s,x*s+y*c])