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