⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter14happyyou3dscontrol.pro

📁 idl 可视化分析与应用(随书程序)
💻 PRO
📖 第 1 页 / 共 3 页
字号:
; Chapter14HappyYou3DSControl.pro
;----------------------------------------------------------------------------
function Chapter14HappyYou3DSControlMakeView, xdim, ydim, uval
  aspect = xdim / float(ydim)
  myview = [-1, -1, 2, 2] * sqrt(2)
  if (aspect > 1) then begin
    myview[0] = myview[0] - ((aspect-1.0)*myview[2])/2.0
    myview[2] = myview[2] * aspect
  end else begin
    myview[1] = myview[1] - (((1.0/aspect)-1.0)*myview[3])/2.0
    myview[3] = myview[3] / aspect
  end
  v = obj_new('IDLgrView', projection=2, eye=3, zclip=[1.5,-1.5], dim=[xdim,ydim],$
      viewplane_rect=myview, color=[30,30,60], uvalue=uval )
  gg = obj_new('IDLgrModel')  &  g = obj_new('IDLgrModel')  &  gg->add,g
  b_verts = fltarr(3,5,5)     &  b_conn = lonarr(5,16)      &  vert_cols=bytarr(3,25)
  j = 0
  for i=0,15 do begin
    b_conn[0,i] = 4       &    b_conn[1,i] = j
    b_conn[2,i] = j+1     &    b_conn[3,i] = j+6
    b_conn[4,i] = j+5     &    j = j + 1
    if (j MOD 5) EQ 4 then j = j + 1
  end
  k = 0
  for i=0,4 do begin
    for j=0,4 do begin
      b_verts[0,i,j] = i   &   b_verts[1,i,j] = j  &   b_verts[2,i,j] = 0
      if (k EQ 1) then begin
        vert_cols[*, i+j*5] = [40,40,40]
      end else begin
        vert_cols[*, i+j*5] = [255,255,255]-40
      end
      k = 1 - k
    end
  end
  b_verts[0,*,*] = (b_verts[0,*,*]-2)/2.0  &  b_verts[1,*,*] = (b_verts[1,*,*]-2)/2.0
  baseplate = obj_new('IDLgrPolygon', b_verts, poly=b_conn, $
    shading=1, vert_colors=vert_cols )
  g->add, baseplate      &      g->add, obj_new('IDLgrModel')
  gg->add, obj_new('IDLgrLight',loc=[2,2,5],type=2,color=[255,255,255],intensity=.5)
  gg->add, obj_new('IDLgrLight',type=0, intensity=.5, color=[255,255,255] )
  v->add, gg
  return, v
end
;----------------------------------------------------------------------------
pro Chapter14HappyYou3DSControlGetViewObjs,view,oWorldRotModel,oBasePlatePolygon,model_top
  gg = view->get()
  oWorldRotModel = gg->get(pos=0)
  oBasePlatePolygon = oWorldRotModel->get(pos=0)
  model_top = oWorldRotModel->get(pos=1)
end
;----------------------------------------------------------------------------
pro Chapter14HappyYou3DSControlCone,verts,conn,n
  verts = fltarr(3,n+1)
  verts[0,0] = 0.0     &    verts[1,0] = 0.0    &    verts[2,0] = 0.1
  t = 0.0     &    tinc = (2.*!PI)/float(n)
  for i=1,n do begin
    verts[0,i] = 0.1*cos(t)  &  verts[1,i] = 0.1*sin(t)  &   verts[2,i] = -0.1
    t = t + tinc
  end
  conn = fltarr(4*n+(n+1))
  i = 0       &      conn[0] = n
  for i=1,n do conn[i] = (n-i+1)
  j = n+1
  for i=1,n do begin
    conn[j] = 3     &    conn[j+1] = i
    conn[j+2] = 0   &    conn[j+3] = i + 1
    if (i EQ n) then conn[j+3] = 1
    j = j + 4
  end
end
;----------------------------------------------------------------------------
function Chapter14HappyYou3DSControlMakeObj,type,thefont
oModel= obj_new('IDLgrModel')
case type of
  0 : begin
      s = obj_new('orb',color=[255,0,0],radius=0.1,shading=1,select_target=1)
      str = "Sphere"
  end
  1 : begin
      verts = [[-0.1,-0.1,-0.1],[0.1,-0.1,-0.1],[0.1,0.1,-0.1],[-0.1,0.1,-0.1], $
               [-0.1,-0.1, 0.1],[0.1,-0.1, 0.1],[0.1,0.1, 0.1],[-0.1,0.1,0.1]]
      conn=[[4,3,2,1,0],[4,4,5,6,7],[4,0,1,5,4],[4,1,2,6,5],[4,2,3,7,6],[4,3,0,4,7]]
      s = obj_new('IDLgrPolygon',verts,poly=conn,color=[0,255,0],shading=0)
      str = "Cube"
  end
  2 : begin
      Chapter14HappyYou3DSControlCone,verts,conn,3
      s = obj_new('IDLgrPolygon',verts,poly=conn,color=[0,255,255],shading=0)
      str = "Tetrahedron"
  end
  3 : begin
      Chapter14HappyYou3DSControlCone,verts,conn,20
      s = obj_new('IDLgrPolygon',verts,poly=conn,color=[255,128,255],shading=1)
      str = "Cone"
  end
  4 : begin
      Chapter14HappyYou3DSControlCone,verts,conn,4
      l = obj_new('IDLgrPolygon',verts*0.5,poly=conn,color=[100,255,100],shading=0)
      oModel->add,l
      l = obj_new('IDLgrPolyline',[[0,0,0],[0,0,-0.1]], color=[100,255,100])
      oModel->add,l
      s = obj_new('IDLgrLight',loc=[0,0,0],dir=[0,0,-1],cone=40, $
                               focus=0,type = 3,color=[100,255,100])
      str = "Green Light"
  end
  5 : begin
      e_height = BYTARR(64,64, /NOZERO)
      OPENR, lun, /GET_LUN, demo_filepath('elevbin.dat', SUBDIR=['examples','data'])

      READU, lun, e_height  &  FREE_LUN, lun
      zdata = e_height / (1.7 * max(e_height)) + .001
      xdata = (findgen(64)-32.0)/64.0
      ydata = (findgen(64)-32.0)/64.0
      s = obj_new('IDLgrSurface',zdata,shading=1,style=2,$
                                 datax=xdata,datay=ydata,color=[150,50,150])
      str = "Surface"
  end
  6 : begin
      restore, filename='Chapter14HappyYou3DSColorTable.sav'
      restore, demo_filepath('marbells.dat', subdir=['examples','data'])
      image = bytscl(elev, min=2658, max=4241)
      image = image[8:*, *] ; Trim unsightly junk from left side.
      sz = size(image)
      img = bytarr(3,sz[1],sz[2])
      img[0,*,*]=ctab[0,image] & img[1,*,*]=ctab[1,image] & img[2,*,*]=ctab[2,image]
      oTextureImage = obj_new('IDLgrImage', img, loc=[0.0,0.0],dim=[0.01,0.01],hide=1)
      oModel->add, oTextureImage
      xp=0.5  &  yp=0.5*(72./92.)  &  zp=0.1
      s=obj_new('IDLgrPolygon',[[-xp,-yp,zp],[xp,-yp,zp],[xp,yp,zp],[-xp,yp,zp]],$
                 texture_coord=[[0,0],[1,0],[1,1],[0,1]],texture_map=oTextureImage, $
                 color=[255,255,255] )
      str = "Image"
  end
  7 : begin
      Chapter14HappyYou3DSControlCone, verts, conn, 4
      oModel->add, obj_new('IDLgrPolygon', verts*0.5, poly=conn, $
                                           color=[255,255,255], shading=0 )
      oModel->add, obj_new('IDLgrPolyline', [[0,0,0], [0,0,-0.1]],color=[255,255,255])
      s = obj_new('IDLgrLight', loc=[0,0,0], dir=[0,0,-1], cone=20,focus=0,  type=3, $
                                           color=[255,255,255] )
      str = "White Light"
  end
  8 : begin
      s=obj_new('IDLgrText', "IDL", location=[0,0,0.001], align=0.5, $
                 color=[255,0,255], font=thefont[0] )
      str = "Text"
  end
  9 : begin
      N = 1024 ; number of time samples in data set
      delt = 0.02; sampling interval in seconds
      U = -0.3 + 1.0 * Sin(2*!Pi* 2.8 *delt*FIndGen(N)) $
          + 1.0 * Sin(2*!Pi*6.25*delt*FIndGen(N))+1.0*Sin(2*!Pi*11.0*delt*FIndGen(N))
      V = fft(U)             &    signal_x = FINDGEN(N/2+1) / (N*delt)
      mag = ABS(V[0:N/2])    &    signal_y = 20*ALOG10(mag)
      phi = ATAN(V[0:N/2]) ; phase of first half of v
      xc=[-0.5,1.0/25.0]  &  yc=[0.5,1.0/80.0]
      s=obj_new('IDLgrPolygon', [[-7,-90,-0.002],[30,-90,-0.002], [30,10,-0.002],$
        [-7,10,-0.002]],color=[0,0,0], xcoord_conv=xc, ycoord_conv=yc )
      oModel->add,s
      s=obj_new('IDLgrAxis', 0, range=[0.0,25.0], xcoord_conv=xc, ycoord_conv=yc, $
            location=[0,-80.0], color=[0,255,0], ticklen=5, /exact )
      s->GetProperty,ticktext=tt
      tt->setproperty,font=thefont[3]
      oModel->add,s
      s=obj_new('IDLgrAxis', 0, range=[0.0,25.0], /notext,xcoord_conv=xc, $
            ycoord_conv=yc, location=[0.0,0.0], color=[0,255,0], ticklen=-5, /exact)
      oModel->add,s
      s=obj_new('IDLgrAxis', 1, range=[-80.0,0.0],xcoord_conv=xc, $
            ycoord_conv=yc, color=[0,255,0], ticklen=1.0, /exact )
      s->GetProperty,ticktext=tt
      tt->setproperty,font=thefont[3]
      oModel->add,s
      s=obj_new('IDLgrAxis', 1, range=[-80.0,0.0], /notext,xcoord_conv=xc, $
            ycoord_conv=yc, loc=[25.0,0.0], color=[0,255,0], ticklen=-1.0, /exact )
      oModel->add,s
      s=obj_new('idlgrplot',signal_x,signal_y,xcoord_conv=xc,ycoord_conv=yc, $
                             color=[0,255,255] )
      str = "Plot"
  end
  10 : begin
       x=indgen(200)
       yexp = exp(-x*0.015)
       ysexp = exp(-x*0.015)*sin(x*0.1)
       dataz=fltarr(200,5)
       dataz[*,0] = yexp         &       dataz[*,1] = yexp
       dataz[*,2] = REPLICATE(1.1,200)
       dataz[*,3] = ysexp-0.01   &       dataz[*,4] = ysexp-0.01
       datay = fltarr(200,5)
       datay[*,0] = 0.0   &   datay[*,1] = 1.0  &  datay[*,2] = 0.0
       datay[*,3] = 0.0   &   datay[*,4] = 1.0
       cbins = bytarr(3,60)
       for i=0,59 do begin
         color_convert, float(i)*4., 1., 1., r,g,b, /HSV_RGB
         cbins[*,59-i] = [r,g,b]
       end
       colors = bytarr(3,200*5)
       colors[0,0:599] = REPLICATE(80,3*200)
       colors[1,0:599] = REPLICATE(80,3*200)
       colors[2,0:599] = REPLICATE(200,3*200)
       colors[*,600:799] = cbins[*,(ysexp+1.0)*30.0]
       colors[*,800:999] = cbins[*,(ysexp+1.0)*30.0]
       xc = [-0.5,1.0/200.0]*0.8
       yc = [-0.5,1.0/1.0]*0.1   &   zc = [-0.5,1.0/1.0]*0.4
       s=obj_new('IDLgrAxis', 0, range=[0,200], color=[255,255,255], ticklen=0.2, $
                  xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       oModel->add,s
       s=obj_new('IDLgrAxis', 2, range=[-1.,1.],color=[255,255,255], ticklen=4, $
                  xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       oModel->add,s
       s=obj_new('IDLgrSurface', dataz, style=2, vert_colors=colors,datay=datay, $
             max_value=1.05,shading=1,xcoord_conv=xc,ycoord_conv=yc,zcoord_conv=zc)
       oModel->add,s
       s=obj_new('IDLgrSurface', dataz, style=3, color=[0,0,0],datay=datay, $
             max_value=1.05, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       str = 'Ribbon Plot'
  end
  11 : begin
       dataz = dist(8)
       dataz[1,*] = -1  &  dataz[3,*] = -1  &  dataz[5,*] = -1
       dataz[*,1] = -1  &  dataz[*,3] = -1  &  dataz[*,5] = -1
       dataz = dataz + 1
       cbins=[ [255,  0,0],[255, 85,0],[255,170,0],[255,255,0],$
               [170,255,0],[ 85,255,0],[  0,255,0] ]
       colors = bytarr(3, 8*8)
       minz = min(dataz)  &  maxz = max(dataz)
       zi = round((dataz - minz)/(maxz-minz) * 6.0)
       colors[*,*] = cbins[*,zi]
       xc = [-0.5,1.0/8.0]*0.4  &  yc = [-0.5,1.0/8.0]*0.4  &  zc = [0,1.0/8.0]*0.4
       s=obj_new('IDLgrAxis',0,range=[0,8],major=5,color=[255,255,255],ticklen=0.2, $
                 /exact, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       oModel->add,s
       s=obj_new('IDLgrAxis', 1, range=[0,8], major=5,color=[255,255,255], $
             ticklen=0.2, /exact, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       oModel->add,s
       s=obj_new('IDLgrAxis', 2, range=[0,8], major=5, color=[255,255,255], $
             ticklen=0.2, /exact, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       oModel->add,s
       s=obj_new('IDLgrSurface', dataz, STYLE=6, VERT_COLORS=colors,$
             xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc )
       str = 'Bar Plot'
  end
endcase
oModel->Add, s
oModel->SetProperty, uvalue=str
return, oModel
end
;----------------------------------------------------------------------------
pro Chapter14HappyYou3DSControlNewMode, state, mode
  widget_control, /hourglass
  state.oModelMan->SetProperty, mode=mode
  widget_control, state.wModelModeRadio, set_value=mode
end
;----------------------------------------------------------------------------
pro Chapter14HappyYou3DSControlAdd, state, oModel, as_child=as_child
  if keyword_set(as_child) then begin
     state.selected->add, oModel
  endif else begin
     state.oCurrentTopModel->add, oModel
  endelse
  state.oCurrentView->GetProperty, uvalue=view_uval
  *(state.model_lists[view_uval.num]) = [oModel, *(state.model_lists[view_uval.num])]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -