DCL:GRPH1:STPACK : 変換メソッド(元関数):概要
以下のエントリをユーザー自身が用意することで,
独自の変換メソッド(元関数)を定義することができる.
xx, yy = NumRu::DCL.stfusr(ux,uy) 正変換 ux, uy = NumRu::DCL.stiusr(xx,yy) 逆変換 stsusr メソッド(元関数)初期化
この正変換と逆変換のエントリは, stftrf の下請けルーチンである
stftrn から呼ばれる.
stfusr に渡ってくる ux, uy の値は,
stfrad と stfrot による処理が終った後の値である.
拡大, 並行移動はstftrn が行なうので, これらのメソッド(元関数)は,
それ以外の基本的な変換メソッド(元関数)を定義するだけで良い.
変換メソッド(元関数)には正変換と逆変換があるが,
逆変換を使わない場合には, 逆変換はエントリー文だけで良い.
stsusr は, 変換メソッド(元関数)を確定するsgstrfから呼ばれる.
このエントリは, 通常sgstrf が行なっている STPACK のメソッド(元関数)を
初期化しなければならない.
初期化すべきメソッド(元関数)は,
ststrf, ststrn, stsrad, stsrot (地図投影の時)
である.
次のプログラムは常用対数の log-log 座標を定義するものである.
*--------------------------------------------------------------
* USER SUPPLIED FUNCTION
*--------------------------------------------------------------
SUBROUTINE xx, yy = NumRu::DCL.stfusr(ux,uy)
XX = LOG(UX)
YY = LOG(UY)
RETURN
*--------------------------------------------------------------
ENTRY ux, uy = NumRu::DCL.stiusr(xx,yy)
UX = EXP(XX)
UY = EXP(YY)
RETURN
END
*--------------------------------------------------------------
SUBROUTINE stsusr
vxmin, vxmax, vymin, vymax = NumRu::DCL.sgqvpt()
uxmin, uxmax, uymin, uymax = NumRu::DCL.sgqwnd()
CX = (VXMAX-VXMIN)/LOG(UXMAX/UXMIN)
CY = (VYMAX-VYMIN)/LOG(UYMAX/UYMIN)
VX0 = VXMIN - CX*LOG(UXMIN)
VY0 = VYMIN - CY*LOG(UYMIN)
NumRu::DCL.ststrf(lmapa)
NumRu::DCL.stsrad(lxdeg,lydeg)
NumRu::DCL.ststrn(itr,cxa,cya,vxoff,vyoff)
END
次のプログラムは MATH1/MAPLIB の MPFMWL/MPIMWL を使って モルワイデもどきの地図投影メソッド(元関数)を定義するものである.
*---------------------------------------------------------------
* USER SUPPLIED FUNCTION
*---------------------------------------------------------------
SUBROUTINE xx, yy = NumRu::DCL.stfusr(ux,uy)
CALL MPFMWL(UX, UY, XX, YY)
RETURN
*---------------------------------------------------------------
ENTRY ux, uy = NumRu::DCL.stiusr(xx,yy)
CALL MPIMWL(XX, YY, UX, UY)
RETURN
END
*---------------------------------------------------------------
SUBROUTINE stsusr
LOGICAL LDEG
vxmin, vxmax, vymin, vymax = NumRu::DCL.sgqvpt()
simfac, vxoff, vyoff = NumRu::DCL.sgqsim()
plx, ply, plrot = NumRu::DCL.sgqmpl()
lpara = NumRu::DCL.sglget(cp)
IF(LDEG) THEN
CP = return_value = NumRu::DCL.rfpi()/180
ELSE
CP = 1
ENDIF
rpara = NumRu::DCL.sgrget(cp)
rpara = NumRu::DCL.sgrget(cp)
rpara = NumRu::DCL.sgrget(cp)
rpara = NumRu::DCL.sgrget(cp)
CALL SZSCLX(CP*TXMIN, CP*TXMAX)
CALL SZSCLY(CP*TYMIN, CP*TYMAX)
VX0 = (VXMAX+VXMIN)/2 + XOFF
VY0 = (VYMAX+VYMIN)/2 + YOFF
NumRu::DCL.ststrf(lmapa)
NumRu::DCL.stsrad(lxdeg,lydeg)
CALL stsrot(return_value = NumRu::DCL.rfpi()
NumRu::DCL.ststrn(itr,cxa,cya,vxoff,vyoff)
END