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