! 観賞グラフ

 投稿者:SECOND  投稿日:2009年 3月15日(日)03時57分47秒
  ! 観賞グラフ
! 輝く マンデルブロー( 添付サンプル Complex\mandelbm.bas の着色改変)
!
OPTION ARITHMETIC COMPLEX
SET POINT STYLE 1
!
FOR n=0 TO 50
   SET COLOR MIX(    n) 0   ,0     ,n/51   !BLACK =< < BLUE
   SET COLOR MIX( 51+n) 0   ,n/51  ,1      !BLUE =< < CYAN
   SET COLOR MIX(102+n) 0   ,1     ,1-n/51 !CYAN =< < GREEN
   SET COLOR MIX(153+n) n/51,1     ,0      !GREEN =< < YELLOW
   SET COLOR MIX(204+n) 1   ,1-n/51,0      !YELLOW =< < RED
NEXT n
!SET COLOR MIX(255) 1,0,0 !=RED
SET COLOR MIX(255) 0.549,0.549,0.561 !=GRAY =default
!
LET XL=-2
LET XR=.8
LET w1=XR-XL
LET w2=w1/2
!
SET WINDOW XL, XR,-w2,w2
ASK PIXEL SIZE(XL,-w2; XR,w2) px,py
!
! マンデルブローのμ-map
! f(z)=z^2+μの反復が有界となる複素数μの集合
! 発散の判定に至るまでの繰り返し回数で色分け。
!
FOR x=XL TO XR STEP w1/(px-1)
   FOR y=0 TO w2 STEP w1/(py-1)
      LET z=0
      FOR n=1 TO 255
         LET z=z^2+COMPLEX(x,y)
         IF 2< ABS(z) THEN
            IF n< 64 THEN SET POINT COLOR n*4 ELSE SET POINT COLOR 255
            PLOT POINTS :x,y
            PLOT POINTS :x,-y
            EXIT FOR
         END IF
      NEXT n
   NEXT y
NEXT x

!--------------
pause !一時停止
SET COLOR MIX(0) 1,1,1
CLEAR

! 左へ伸びる白線(無発散領域)は、本来は、細い線で見えない位なので、
! 以下の様にすると、消える。速度が落ちるので、他に方法も・・。
!--------------

FOR x=XL TO XR STEP w1/(px-1)
   FOR y=-w2-w1/(py-1)/2 TO w2 STEP w1/(py-1) !故意に(x,0)を描点の間に挟む。
      LET z=0
      FOR n=1 TO 255
         LET z=z^2+COMPLEX(x,y)
         IF 2< ABS(z) THEN
            IF n< 64 THEN SET POINT COLOR n*4 ELSE SET POINT COLOR 255
            PLOT POINTS :x,y !上下の対象プロットをしない。
            EXIT FOR
         END IF
      NEXT n
   NEXT y
NEXT x

END
 

Re: ! 観賞グラフ

 投稿者:山中和義  投稿日:2009年 3月16日(月)15時03分27秒
  > No.307[元記事へ]

不等式f(x,y)>0の領域がつくる模様

平面は、各関数やそのnの値を変更することで可能です。
単色ですが平面の起伏によって、おもしろい模様が描けます。

また、等高線で色分けするのも良いかと思います。

!不等式f(x,y)>0の領域がつくる模様

!関数の定義 f(x,y)=0
LET n=0.25
DEF g(x,y)=COS(PI*y)-n/COS(PI*x) !n=[-1,1]

!LET n=0.2
!DEF g(x,y)=x*y/n-(x^2+y^2)/(COS(2*PI*x)+COS(2*PI*y)) !n=[0.1,1]

!LET n=0.5
!DEF g(x,y)=COS(2*PI*y)-COS(2*PI*(COS(2*n*PI*x)+COS(2*n*PI*y))) !n=[0.1,2]

!LET n=3
!DEF g(x,y)=COS(PI*x*y/n)-(COS(2*PI*x)+COS(2*PI*y)) !n=[0.1,5]

!LET n=0.2
!DEF g(x,y)=n*COS(PI*x*y)-(SIN(2*PI*x)+SIN(2*PI*y)) !n=[-0.5,0.5]

!LET n=25
!DEF g(x,y)=COS(PI*x*y)-COS(n*x*y/(x^2+y^2)) !n=[1,100]

!LET n=25
!DEF g(x,y)=COS(PI*x*y)-x*y*COS(n*x*y/(x^2+y^2)) !n=[1,100]


LET a=-5 !x=[a,b] ※xy座標の表示領域
LET b=5
LET c=a !y=[c,d]
LET d=b


SET WINDOW a,b,c,d !表示領域を設定する
DRAW grid(1,1) !座標を描く
ASK PIXEL SIZE (a,c; b,d) w,h !画像の縦横の大きさ(ドット単位)を調べる

!条件を満たす領域を描く
SET POINT STYLE 1 !ドット形式
SET POINT COLOR 2
FOR j=1 TO h !画面全体を走査する
   LET y=WORLDY(j) !ドットをxy座標に変換する
   FOR i=1 TO w
      LET x=WORLDX(i)

      WHEN EXCEPTION IN
         LET z=g(x,y) !関数値を計算する
         IF z>0 THEN !正の部分を切り取る
            PLOT POINTS: x,y
         END IF
      USE !0割りなどの例外処理
      END WHEN

   NEXT i
NEXT j

END
 

戻る