🔗Asymptote Gallery Tagged by “Spherical harmonics” #166
đź”—graph3-fig015

Show graph3/fig0150.asy on Github.
Generated with Asymptote 3.00-0.
Categories : Examples 3D | Graph3.asy
Tags : #Graph (3D) | #Palette | #Surface | #Shading (3D) | #Array | #Spherical harmonics
settings.render=0; import graph3; size(15cm); currentprojection=orthographic(4,2,4); real r(real Theta, real Phi){return 1+0.5*(sin(2*Theta)*sin(2*Phi))^2;} triple f(pair z) {return r(z.x,z.y)*expi(z.x,z.y);} pen[] pens(triple[] z) { return sequence(new pen(int i) { real a=abs(z[i]); return a < 1+1e-3 ? black : interp(blue, red, 2*(a-1)); },z.length); } surface s=surface(f,(0,0),(pi,2pi),100,Spline); // Interpolate the corners, and coloring each patch with one color // produce some artefacts draw(s,pens(s.cornermean())); if(!is3D()) shipout(bbox(3mm,Fill(black)));
đź”—graph3-fig016

Show graph3/fig0160.asy on Github.
Generated with Asymptote 3.00-0.
Categories : Examples 3D | Graph3.asy
Tags : #Graph (3D) | #Palette | #Surface | #Shading (3D) | #Array | #Spherical harmonics
settings.render=0; import graph3; size(15cm); currentprojection=orthographic(4,2,4); real r(real Theta, real Phi){return 1+0.5*(sin(2*Theta)*sin(2*Phi))^2;} triple f(pair z) {return r(z.x,z.y)*expi(z.x,z.y);} pen[][] pens(triple[][] z) { pen[][] p=new pen[z.length][]; for(int i=0; i < z.length; ++i) { triple[] zi=z[i]; p[i]=sequence(new pen(int j) { real a=abs(zi[j]); return a < 1+1e-3 ? black : interp(blue, red, 2*(a-1));}, zi.length); } return p; } surface s=surface(f,(0,0),(pi,2pi),100,Spline); // Here we interpolate the pens, this looks smoother, with fewer artifacts draw(s,mean(pens(s.corners()))); if(!is3D()) shipout(bbox(3mm,Fill(black)));
đź”—graph3-fig017

Show graph3/fig0170.asy on Github.
Generated with Asymptote 3.00-0.
Categories : Examples 3D | Graph3.asy
Tags : #Graph (3D) | #Palette | #Surface | #Shading (3D) | #Array | #Spherical harmonics
import graph3; size(16cm, 0); currentprojection=orthographic(4, 2, 4); real r(real Theta, real Phi){return 1+0.5*(sin(2*Theta)*sin(2*Phi))^2;} triple f(pair z) {return r(z.x, z.y)*expi(z.x, z.y);} pen[][] pens(triple[][] z) { pen[][] p=new pen[z.length][]; for(int i=0; i < z.length; ++i) { triple[] zi=z[i]; p[i]=sequence(new pen(int j) { real a=abs(zi[j]); return a < 1+1e-3 ? black : interp(blue, red, 2*(a-1));}, zi.length); } return p; } surface s=surface(f, (0, 0), (pi, 2pi), 100, Spline); // Here we determine the colors of vertexes (vertex shading). // Since the PRC output format does not support vertex shading of Bezier surfaces, PRC patches // are shaded with the mean of the four vertex colors. s.colors(pens(s.corners())); draw(s); if(!is3D()) shipout(bbox(1mm, Fill(black)));
đź”—graph3-fig018

The spherical harmonics are the angular portion of the solution to Laplace's equation in spherical coordinates where azimuthal symmetry is not present.
The spherical harmonics are defined by:
where and is the Legendre polynomial.
Source
Show graph3/fig0180.asy on Github.
Generated with Asymptote 3.00-0.
Categories : Examples 3D | Graph3.asy
Tags : #Graph (3D) | #Palette | #Surface | #Shading (3D) | #Spherical harmonics
import palette; import math; import graph3; typedef real fct(real); typedef pair zfct2(real,real); typedef real fct2(real,real); real binomial(real n, real k) { return gamma(n+1)/(gamma(n-k+1)*gamma(k+1)); } real factorial(real n) { return gamma(n+1); } real[] pdiff(real[] p) { // p(x)=p[0]+p[1]x+...p[n]x^n // retourne la dérivée de p real[] dif; for (int i : p.keys) { if(i != 0) dif.push(i*p[i]); } return dif; } real[] pdiff(real[] p, int n) { // p(x)=p[0]+p[1]x+...p[n]x^n // dérivée n-ième de p real[] dif={0}; if(n >= p.length) return dif; dif=p; for (int i=0; i < n; ++i) dif=pdiff(dif); return dif; } fct operator *(real y, fct f) { return new real(real x){return y*f(x);}; } zfct2 operator +(zfct2 f, zfct2 g) {// Défini f+g return new pair(real t, real p){return f(t,p)+g(t,p);}; } zfct2 operator -(zfct2 f, zfct2 g) {// Défini f-g return new pair(real t, real p){return f(t,p)-g(t,p);}; } zfct2 operator /(zfct2 f, real x) {// Défini f/x return new pair(real t, real p){return f(t,p)/x;}; } zfct2 operator *(real x,zfct2 f) {// Défini x*f return new pair(real t, real p){return x*f(t,p);}; } fct fct(real[] p) { // convertit le tableau des coefs du poly p en fonction polynôme return new real(real x){ real y=0; for (int i : p.keys) { y += p[i]*x^i; } return y; }; } real C(int l, int m) { if(m < 0) return 1/C(l,-m); real OC=1; int d=l-m, s=l+m; for (int i=d+1; i <=s ; ++i) OC *= i; return 1/OC; } int csphase=-1; fct P(int l, int m) { // Polynôme de Legendre associé // http://mathworld.wolfram.com/LegendrePolynomial.html if(m < 0) return (-1)^(-m)*C(l,-m)*P(l,-m); real[] xl2; for (int k=0; k <= l; ++k) { xl2.push((-1)^(l-k)*binomial(l,k)); if(k != l) xl2.push(0); } fct dxl2=fct(pdiff(xl2,l+m)); return new real(real x){ return (csphase)^m/(2^l*factorial(l))*(1-x^2)^(m/2)*dxl2(x); }; } zfct2 Y(int l, int m) {// http://fr.wikipedia.org/wiki/Harmonique_sph%C3%A9rique#Expression_des_harmoniques_sph.C3.A9riques_normalis.C3.A9es return new pair(real theta, real phi) { return sqrt((2*l+1)*C(l,m)/(4*pi))*P(l,m)(cos(theta))*expi(m*phi); }; } real xyabs(triple z){return abs(xypart(z));} size(16cm); currentprojection=orthographic(0,1,1); zfct2 Ylm; triple F(pair z) { // real r=0.75+dot(0.25*I,Ylm(z.x,z.y)); // return r*expi(z.x,z.y); real r=abs(Ylm(z.x,z.y))^2; return r*expi(z.x,z.y); } int nb=4; for (int l=0; l < nb; ++l) { for (int m=0; m <= l; ++m) { Ylm=Y(l,m); surface s=surface(F,(0,0),(pi,2pi),60); s.colors(palette(s.map(xyabs),Rainbow())); triple v=(-m,0,-l); draw(shift(v)*s); label("$Y_"+ string(l) + "^" + string(m) + "$:",shift(X/3)*v); } }