This is the source code of the program I used to create this image. Click on “Show source code” to display it.
The following program is under the GNU General Public License (GPL).
| 本作品为自由软件,您可以依据自由软件基金会发行的GNU通用公共许可证第2版或任意后续版本的条款,传播和/或修改本作品。本作品发表时预期有用,但对此无任何保证,亦无隐含的可以销售或适合特定目的的保证。详情请见GNU通用公共许可证第2版和第3版。http://www.gnu.org/licenses/gpl.htmlGPLGNU General Public Licensetruetrue |
; Program Written in IDL (Interactive Data Language) ; Free Interpreter availible at www.rsinc.com ; Written by Georg Wiora ; This Program is under the GNU General Public License (GPL) ; ; Create a display of interference patterns ; Save this text as file "Interference2.pro" to run it. ; Draw a circle PRO circle,x,y,r,_REF_EXTRA=ex n=ULONG(!DPI*r) > 1 phi = FINDGEN(n)/FLOAT(n)*2*!DPI x1 = r*COS(phi)+x y1 = r*SIN(phi)+y PLOTS,[x1,x1[0]],[y1,y1[0]],_STRICT_EXTRA=ex END ; Compute the interference PRO Interference2 ; Final Image Size siz=2000 ; No display if larger than 800x1600 pixel pixmap=SIZ GT 800 ; Wavelength in Pixel lambda=160 ; Half distance of the sources dhalb = lambda ; Compute the distance of each point in an array from the ; center point: This is the phase of the signal d1 = SHIFT(DIST(siz*2,siz),siz,siz/2) ; Sinus of distace with 0 LE amplitude LE 2 f = SIN(d1/lambda*2*!DPI)+1 ; Compute Interference inter = SHIFT(f,-dhalb,0)+SHIFT(f,dhalb,0) ; Get maximum and minimum ma = MAX(inter,MIN=mi) ; Two colors are reserved for marking, the rest is gray scale ; Scale interference to byte range [0..253] inter = BYTE((TEMPORARY(inter)-mi)/(ma-mi)*253) ; Use lookup table to display DEVICE,DECOMPOSED=0 ; Gray scale LOADCT,0 ; Half length of center cross bars in pixel cs=30 ; Half width of center cross bars in pixel cb=3 ; Set mark for center ; Horizontal left inter[siz-dhalb-cs:siz-dhalb+cs, siz/2-cb:siz/2+cb] = 254 ; Vertical left inter[siz-dhalb-cb:siz-dhalb+cb, siz/2-cs:siz/2+cs] = 254 ; Horizontal right inter[siz+dhalb-cs:siz+dhalb+cs, siz/2-cb:siz/2+cb] = 255 ; Vertical right inter[siz+dhalb-cb:siz+dhalb+cb, siz/2-cs:siz/2+cs] = 255 ; Open a visible or invisible window (depends on pixmap flag) WINDOW,XSIZE=2*siz,YSIZE=siz,PIXMAP=pixmap ; Display the interference (only gray scale!) TV,inter ; Draw circles on maximum locations FOR i=0,2.5*siz/lambda DO $ BEGIN ; Maximum location left circle,siz-dhalb,siz/2,(i+0.25)*lambda,THICK=6,/DEVICE,COLOR=254 ; Maximum location right circle,siz+dhalb,siz/2,(i+0.25)*lambda,THICK=6,/DEVICE,COLOR=255 ENDFOR ; Colortable 0-253 as gray scake r = FINDGEN(256)/253*255 g=r b=r ; 254 is green r[254]=0 b[254]=0 g[254]=255 ; 255 is red r[255]=255 b[255]=0 g[255]=0 ; Read image from display im=TVRD() ; Crop invalid borders im = im[siz/2:3*siz/2-1,*] ; Save as PNG with colortable WRITE_PNG,'Interference2.png',im,r,g,b ; Convert to truecolor and write JPEG imt = [[[r[im]]],[[g[im]]],[[b[im]]]] ; smooth image a little bit (saves bandwith in jpeg and is OK ; with high resolution) imt[*,*,0] = SMOOTH(imt[*,*,0],3,/EDGE_TRUNCATE) imt[*,*,1] = SMOOTH(imt[*,*,1],3,/EDGE_TRUNCATE) imt[*,*,2] = SMOOTH(imt[*,*,2],3,/EDGE_TRUNCATE) ; Write as jpeg WRITE_JPEG,'Interference2.jpg',TEMPORARY(imt),/PROGRESSIVE,$ QUALITY=90, TRUE=3 END