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

📄 chapter08polyline.pro

📁 idl 可视化分析与应用(随书程序)
💻 PRO
字号:
; Chapter08Polyline.pro
PRO Chapter08Polyline_event, sEvent
  IF TAG_NAMES(sEvent, /STRUCTURE_NAME) EQ $
                       'WIDGET_KILL_REQUEST' THEN BEGIN
     WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState
     OBJ_DESTROY, sState.oView
     OBJ_DESTROY, sState.oWindow
     WIDGET_CONTROL, sEvent.top, /DESTROY
     RETURN
  ENDIF
  WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
  CASE uval OF
    'MOVE': BEGIN  ; Turn on/off automotion.
      WIDGET_CONTROl, sEvent.top, GET_UVALUE=sState
      sState.automotion = sEvent.select
      IF (sState.automotion EQ 1) THEN $
        WIDGET_CONTROL, sState.wBase, TIMER=sState.timer
      WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState
     END
    'DRAW': BEGIN  ; Expose event.
      IF (sEvent.type EQ 4) THEN BEGIN
        WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState
        sState.oWindow->Draw, sState.oView
        WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState
      ENDIF
     END
    'Chapter08Polyline': BEGIN ; Rotate it about its axis.
       WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState
       sState.oRot->Rotate, [0,0,1], -30
       sState.oWindow->Draw, sState.oView
       WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState
     END
    'TIMER' : BEGIN ; Timer event for automotion.
       WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState
       IF (sState.automotion EQ 1) THEN BEGIN
         sState.oRot->Rotate, [0,0,1], -1
         sState.oOrbit->Rotate, [0,1,0], -1
         sState.oCorr->Rotate, [0,1,0], 1
       ENDIF
       IF (sState.automotion EQ 1) THEN BEGIN
         sState.oWindow->Draw, sState.oView
         WIDGET_CONTROL, sEvent.id, TIMER=sState.timer
       ENDIF
       WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState
     END
    'SUN': BEGIN  ; Orbit the Chapter08Polyline about the sun.
       WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState
     sState.oOrbit->Rotate, [0,1,0], -6
     sState.oCorr->Rotate, [0,1,0], 6
       sState.oWindow->Draw, sState.oView
       WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState
     END
  ENDCASE
END
PRO Chapter08Polyline
  xdim = 600  &  ydim = 300
  wBase = WIDGET_BASE(/COLUMN, XPAD=0, YPAD=0,TITLE='Planet Rotation',$
            /TLB_KILL_REQUEST_EVENTS)
  wDraw = WIDGET_DRAW(wBase, XSIZE=xdim, YSIZE=ydim, UVALUE='DRAW', $
            RETAIN=0, /EXPOSE_EVENTS, GRAPHICS_LEVEL=2)
  wGuiBase = WIDGET_BASE(wBase, /ROW, UVALUE='TIMER' )
  wButton = WIDGET_BUTTON(wGuiBase, VALUE="Spin Planet About Axis",$
              UVALUE='Chapter08Polyline')
  wButton = WIDGET_BUTTON(wGuiBase,VALUE="Orbit About Sun",UVALUE='SUN')
  wBBase = WIDGET_BASE(wGuiBase, /NONEXCLUSIVE)
  wButton = WIDGET_BUTTON(wBBase, VALUE="Automotion", UVALUE='MOVE')
  WIDGET_CONTROL, wBase, /REALIZE
  WIDGET_CONTROL, wDraw, GET_VALUE=oWindow
  oWindow->Setproperty, QUALITY=0
  aspect = FLOAT(xdim)/FLOAT(ydim)
  myview = [-2.0,-2.0,4.0,4.0]
  IF (aspect GT 1) THEN BEGIN
    myview[0] = myview[0] - ((aspect-1.0)*myview[2])/2.0
    myview[2] = myview[2] * aspect
  ENDIF ELSE BEGIN
    myview[1] = myview[1] - (((1.0/aspect)-1.0)*myview[3])/2.0
    myview[3] = myview[3] / aspect
  ENDELSE
  oView = OBJ_NEW('IDLgrView', COLOR=[60,60,60], PROJECTION=2, EYE=4, $
          ZCLIP=[2.0,-2.0], VIEWPLANE_RECT=myview )
  oTop = OBJ_NEW('IDLgrModel')
  oLight1=OBJ_NEW('IDLgrLight',LOCATION=[2,2,5],TYPE=2,INTENSITY=0.25)
  oTop->Add, oLight1
  oLight2 = OBJ_NEW('IDLgrLight', TYPE=0, INTENSITY=0.5)
  oTop->Add,oLight2
  oGalaxy = OBJ_NEW('IDLgrModel')
  oTop->Add, oGalaxy
  oSun = OBJ_NEW('Orb', COLOR=[255,255,0], DENSITY=3.0)
  oGalaxy->Add, oSun
  oOrbit = obj_new('IDLgrModel')
  oGalaxy->add,oOrbit
  oOffset = OBJ_NEW('idlgrmodel')
  oOffset->Translate,1.5,0,0
  oOrbit->Add, oOffset
  oCorr = OBJ_NEW('IDLgrModel')
  oOffset->Add, oCorr
  oTilt = OBJ_NEW('IDLgrModel')
  oTilt->Rotate, [1,0,0], -60-180
  oTilt->Rotate, [0,0,1], -30
  oCorr->Add, oTilt
  oRot = OBJ_NEW('IDLgrModel')
  oTilt->Add, oRot
  oAxis=OBJ_NEW('IDLgrPolyline',[[0,0,-0.5],[0,0,0.5]],COLOR=[0,255,0])
  oRot->Add, oAxis
  oChapter08Polyline = OBJ_NEW('Orb', COLOR=[0,0,255],$
       RADIUS=0.25, DENSITY=1.0, /TEX_COORDS)
  oRot->Add, oChapter08Polyline
  oView->Add, oTop
  oWindow->Draw, oView
  sState = {wBase: wGuiBase, timer: 0.05, automotion: 0, oRot:oRot, $
            oOrbit:oOrbit, oCorr:oCorr, oWindow:oWindow, oView:oView}
  WIDGET_CONTROL, wBase, SET_UVALUE=sState
  XMANAGER, 'Chapter08Polyline', wBase, /NO_BLOCK
END

⌨️ 快捷键说明

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