3DLOGO

3D−LOGO

−空間図形・フラクタル・アニメーション−

4.他言語との比較
・3D−LOGO
TO KOCH :K :L FD 900
 IF :K < 1 [FD :L STOP]
 KOCH :K - 1 :L ÷ 3 LT 60
 KOCH :K - 1 :L ÷ 3 RT 120
 KOCH :K - 1 :L ÷ 3 LT 60
 KOCH :K - 1 :L ÷ 3
END


一つの直線を3等分し描画


FD 300 LT 60 FD 300 RT 120 FD 300 LT 60 FD 300


FD 100 LT 60 FD 100 RT 120 FD 100 LT 60 FD 100 LT 60
FD 100 LT 60 FD 100 RT 120 FD 100 LT 60 FD 100 RT 120
FD 100 LT 60 FD 100 RT 120 FD 100 LT 60 FD 100 LT 60
FD 100 LT 60 FD 100 RT 120 FD 100 LT 60 FD 100

 下線部分をKOCHに置き換える

KOCH LT 60 KOCH RT 120 KOCH LT 60 KOCH

これに引数をつけて、手続き名を登録するとプログラムが完成する。このように再帰部分を考えるといろいろな応用が簡単にできる。


・N−88BASIC
100 *HAJIME:'KOCH
110 CLEAR:CONSOLE ,,0,1:SCREEN 3,0,0,1:CLS 3
120 DIM X(100),Y(100),ST(100):S=0:K=0:TH=3.1416/3
130 VIEW (25,10)-(625,390):WINDOW (-300,-190)-(300,190)
140 INPUT "SX,SY,EX,EY,N==>",SX,SY,EX,EY,N
150 *LOOP:
160 K=K+1:IF K=N THEN *EGAKU
170 S=S+1:X(S)=EX:Y(S)=EY:ST(S)=K:GOSUB *ZAHYO:EX=DX+SX:EY=DY+SY
180 S=S+1:X(S)=2*DX+SX:Y(S)=2*DY+SY:ST(S)=K:S=S+1:X(S)=TX:Y(S)=TY:ST(S)=K
190 GOTO *LOOP
200 *EGAKU:
210 GOSUB *ZAHYO
220 LINE (SX,-SY)-(DX+SX,-DY-SY):LINE -(TX,-TY)
230 LINE -(2*DX+SX,-2*DY-SY):LINE -(EX,-EY)
240 IF S<1 THEN *OWARI
250 SX=EX:SY=EY:EX=X(S):EY=Y(S):K=ST(S):S=S-1
260 GOTO *LOOP
270 *OWARI:A$=INPUT$(1):GOTO *HAJIME
280 *ZAHYO:
290 DX=(EX-SX)/3:DY=(EY-SY)/3
300 TX=DX*COS(TH)-DY*SIN(TH)+SX+DX:TY=DX*SIN(TH)+DY*COS(TH)+SY+DY
310 RETURN


・TURBO−C
/* --- KOCH.C < by TURBO C > --- */

#include "stdio.h"
#include "graphics.h"

void koch(sx,sy,ex,ey,n)
     int sx,sy,ex,ey,n;

{     int dx,dy,tx,ty,ux,uy;
     dx=(ex-sx)/3.0;dy=(ey-sy)/3.0;
     tx=dx/2.0-1.732050*dy/2.0+sx+dx;
     ty=1.732050*dx/2.0+dy/2.0+sy+dy;
     ux=2.0*dx+sx;uy=2.0*dy+sy;dx=dx+sx;dy=dy+sy;
     if (n<1)
     {      setcolor(3);
           line(sx,sy,dx,dy);line(dx,dy,tx,ty);
           line(tx,ty,ux,uy);line(ux,uy,ex,ey);
     }
     else
     {      n-=1;
           koch(sx,sy,dx,dy,n);koch(dx,dy,tx,ty,n);
           koch(tx,ty,ux,uy,n);koch(ux,uy,ex,ey,n);
>      }
}

void main()
{    int gdriver=DETECT,gmode;
     int sx,sy,ex,ey;
     int gerr, ln;

     if(registerbgidriver(PC98_driver)<0) exit(1);
     initgraph(&gdriver,&gmode,"A:\\TC\\BGI\\");
     if((gerr=graphresult())!=grOk)
  {  printf("Error : %s\n",grapherrormsg(gerr));
            exit(1);
     }
     setcolor(1); rectangle(0,0,639,399);
     sx=40; sy=50; ex=600; ey=350; ln=4;
     koch(sx,sy,ex,ey,ln);
}


 3D−LOGOは、コッホ曲線などの線画系の描画に威力を発揮し、 BASICは、マンデルブロー集合・ジュリア集合などの座標系の描画 に威力を発揮するのではないか。描画の早さを意識するのなら、C言語 であると考える。


Home Page Index Page Pre Page Next Page