十進BASICの独自拡張である複素数モードでは,複素数の関数を定義することができるので,平面から平面への写像を,DEF文やFUNCTION構文,EXTERNAL FUNCTION構文を用いてBASICの関数として記述することができます。
しかし,射影変換の場合と異なり,描画命令の集まり(BASICでは絵定義)に対し一括して関数を適用するような記述ができないので,個々の描画に対し関数を適用して変換を行う,少々,泥臭いプログラムになります。
また,描画に逆変換が有効な場合がありますが,(射影変換の場合と異なり)BASIC自体には逆変換を作り出す機構がありません。つまり,逆変換を用いる場合には,プログラムを書く人がそれを記述する必要があります。
媒介変数表示の曲線の像を描くときは,各点に対し写像を適用し,結果を実部,虚部に分けて,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の値は,適宜,修正してください。