6.1.1 ユーザー定義関数

以下のエントリをユーザー自身が用意することで, 独自の変換関数を定義することができる.

STFUSR(UX,UY,XX,YY) 正変換
STIUSR(XX,XY,UX,UY) 逆変換
STSUSR 関数初期化


この正変換と逆変換のエントリは, STFTRF の下請けルーチンである STFTRN から呼ばれる. STFUSR に渡ってくる UX, UY の値は, STFRADSTFROT による処理が終った後の値である. 拡大, 並行移動はSTFTRN が行なうので, これらの関数は, それ以外の基本的な変換関数を定義するだけで良い. 変換関数には正変換と逆変換があるが, 逆変換を使わない場合には, 逆変換はエントリー文だけで良い.

STSUSR は, 変換関数を確定するSGSTRFから呼ばれる. このエントリは, 通常SGSTRF が行なっている STPACK の関数を 初期化しなければならない. 初期化すべき関数は, STSTRF, STSTRN, STSRAD, STSROT (地図投影の時) である.

次のプログラムは常用対数の log-log 座標を定義するものである.


*--------------------------------------------------------------
*     USER SUPPLIED FUNCTION
*--------------------------------------------------------------
      SUBROUTINE STFUSR(UX, UY, XX, YY)

      XX = LOG(UX)
      YY = LOG(UY)

      RETURN
*--------------------------------------------------------------
      ENTRY STIUSR(XX, YY, UX, UY)

      UX = EXP(XX)
      UY = EXP(YY)

      RETURN
      END
*--------------------------------------------------------------
      SUBROUTINE STSUSR

      CALL SGQVPT(VXMIN, VXMAX, VYMIN, VYMAX)
      CALL SGQWND(UXMIN, UXMAX, UYMIN, UYMAX)

      CX = (VXMAX-VXMIN)/LOG(UXMAX/UXMIN)
      CY = (VYMAX-VYMIN)/LOG(UYMAX/UYMIN)

      VX0 = VXMIN - CX*LOG(UXMIN)
      VY0 = VYMIN - CY*LOG(UYMIN)

      CALL STSTRF(.FALSE.)
      CALL STSRAD(.FALSE., .FALSE.)
      CALL STSTRN(99, CX, CY, VX0, VY0)

      END

次のプログラムは MATH1/MAPLIB の MPFMWL/MPIMWL を使って モルワイデもどきの地図投影関数を定義するものである.

*---------------------------------------------------------------
*     USER SUPPLIED FUNCTION
*---------------------------------------------------------------
      SUBROUTINE STFUSR(UX, UY, XX, YY)

      CALL MPFMWL(UX, UY, XX, YY) 
      RETURN 
*---------------------------------------------------------------
      ENTRY STIUSR(XX, YY, UX, UY) 

      CALL MPIMWL(XX, YY, UX, UY) 

      RETURN 
      END 
*---------------------------------------------------------------
      SUBROUTINE STSUSR 
      LOGICAL LDEG 

      CALL SGQVPT(VXMIN, VXMAX, VYMIN, VYMAX) 
      CALL SGQSIM(SIMFAC, XOFF, YOFF) 
      CALL SGQMPL(PLX, PLY, PLROT) 
      CALL SGLGET('LDEG', LDEG) 

      IF(LDEG) THEN 
        CP = RFPI()/180 
      ELSE 
        CP = 1 
      ENDIF 

      CALL SGRGET('TXMIN', TXMIN) 
      CALL SGRGET('TXMAX', TXMAX) 
      CALL SGRGET('TYMIN', TYMIN) 
      CALL SGRGET('TYMAX', TYMAX) 
      CALL SZSCLX(CP*TXMIN, CP*TXMAX) 
      CALL SZSCLY(CP*TYMIN, CP*TYMAX) 

      VX0 = (VXMAX+VXMIN)/2 + XOFF 
      VY0 = (VYMAX+VYMIN)/2 + YOFF 

      CALL STSTRF(.TRUE.) 
      CALL STSRAD(LDEG, LDEG) 
      CALL STSROT(RFPI()/2-CP*PLY, CP*PLX, CP*PLROT) 
      CALL STSTRN(99, SIMFAC, SIMFAC, VX0, VY0) 

      END