以下のエントリをユーザー自身が用意することで,
独自の変換関数を定義することができる.
STFUSR(UX,UY,XX,YY) 正変換 STIUSR(XX,XY,UX,UY) 逆変換 STSUSR 関数初期化
この正変換と逆変換のエントリは, STFTRF の下請けルーチンである
STFTRN から呼ばれる.
STFUSR に渡ってくる UX, UY の値は,
STFRAD と STFROT による処理が終った後の値である.
拡大, 並行移動は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