複素数で定義される変換

 十進BASICの独自拡張である複素数モードでは,複素数の関数を定義することができるので,平面から平面への写像を,DEF文やFUNCTION構文,EXTERNAL FUNCTION構文を用いてBASICの関数として記述することができます。
 しかし,射影変換の場合と異なり,描画命令の集まり(BASICでは絵定義)に対し一括して関数を適用するような記述ができないので,個々の描画に対し関数を適用して変換を行う,少々,泥臭いプログラムになります。
 また,描画に逆変換が有効な場合がありますが,(射影変換の場合と異なり)BASIC自体には逆変換を作り出す機構がありません。つまり,逆変換を用いる場合には,プログラムを書く人がそれを記述する必要があります。

例 写像 w=z3

 媒介変数表示の曲線の像を描くときは,各点に対し写像を適用し,結果を実部,虚部に分けて,PLOT文を適用すれば描画できます。
[Note] 直交座標で,媒介変数tを用いて,x=f(t), y=g(t) と定められる曲線は,複素数平面上では,f(t)+i*g(t) とまとめて記述できます。

100 OPTION ARITHMETIC COMPLEX
110 LET i=SQR(-1)
120 DEF F(z)=z^3                 ! 写像
130 DEF C(t)=-1+(1+2*i)*t        ! 媒介変数表示の直線(または曲線)
140 SET POINT STYLE 1
150 SET WINDOW -10,10,-10,10
160 DRAW grid
170 FOR t=-10 TO 10 STEP 0.001
180    LET z=C(t)
190    LET w=F(z)
200    SET POINT COLOR 2
210    PLOT POINTS: RE(z),IM(z)
220    SET POINT COLOR 4
230    PLOT POINTS: RE(w),IM(w)
240 NEXT t 
250 END


 画像を 写像 w=z3 で変換する場合は,元画像の各点を w=z3 で変換した点をプロットしてもよい画像が得られません。このような場合は,逆変換が有効です。
 第1象限に置いた画像を写像 w=z3 で変換するものとします。結果の画像は第1〜3象限に分布するので,第1〜3象限の各点w(=x+yi)に対してw=z3となる第1象限の点z(=u+vi)を求め,点zにおける画像の色を点wに移せばよいことになります。
 次のプログラムでは,300〜330行が逆変換です。処理の都合で,元画像を第4象限に置いています。

90 REM 写像w=z^3
100 OPTION ARITHMETIC NATIVE
110 OPTION ANGLE DEGREES
120 SET COLOR MODE "NATIVE"                ! 24ビットの色(true color)が使えるようにする。
130 GLOAD "nya.JPG"                        ! 任意の画像(BMP,GIF,JPEG)が指定可能
140 ASK PIXEL SIZE (0,0; 1,1) a,b              ! 図の縦横の長さ(ピクセル単位)を調べる
150 DIM p(a,b)                                 ! 図の大きさに対応する配列要素を用意する。
160 ASK PIXEL ARRAY (0,1) p                    ! 図の各点の色情報を配列に格納する。
170 LET s=MAX(a,b)
180 SET bitmap SIZE 2*s+1,2*s+1
190 CLEAR
200 SET WINDOW -s,s,-s,s                       ! 画素単位の座標系を設定
210 LET k=SQR(1/2)                             ! 論理上の座標系は,x,yともに-k〜k
220 MAT PLOT CELLS, IN 1,-1 ; a,-b : p         ! 元画像を第4象限に移動
230 DRAW grid(0.1, 0.1) WITH SCALE(s/k)        ! 座標系の違いを補正して座標格子を描く 
240 SET POINT STYLE 1                          ! 点の形状を・に変更
250 FOR xx=-s TO s
260    FOR yy=-s TO s
270       IF xx<0 OR yy>0 THEN                 ! 第1〜3象限の点ならば
280          LET x=xx*k/s                      ! 論理上のx座標
290          LET y=yy*k/s                      ! 論理上のy座標
300          LET r=SQR(x^2+y^2)^(1/3)          ! 絶対値を(1/3)乗し,
310          LET t=MOD(ANGLE(x,y),360)/3       ! 偏角を3で割る
320          LET u=r*COS(t)                    ! 元画像上の論理x座標
330          LET v=r*SIN(t)                    ! 元画像上の論理y座標        
340          LET uu=ROUND(u/k*s)               ! ピクセル座標に変換
350          LET vv=ROUND(v/k*s)               ! ピクセル座標に変換
360          IF uu>=1 AND uu<=a AND vv>=1 AND vv<=b THEN
370             ASK PIXEL VALUE (uu, vv-1-b) c ! 本来の位置より下に置いた分を補正
380             IF c>=0 THEN
390                SET POINT COLOR c
400                PLOT POINTS:xx,yy
410             END IF
420          END IF 
430       END IF
440    NEXT yy
450 NEXT xx
460 END


元画像は,こちらからいただきました。

<補足>
写像w=znで,0<n≦3の場合は,300行と310行を修正するだけで描けます。
写像w=z4の場合は,元画像を第4象限に置くことができないので,配列中に置いたままで描くように変更する必要があります。
ただし,いずれの場合も,210行のkの値は,適宜,修正してください。


戻る