十進BASICのバグだとは思いますが...

 投稿者:しばっち  投稿日:2022年 1月 1日(土)19時05分44秒
  WINDOWS版十進BASIC ver. 7.8.5.6で下記のプログラムを
2進モード、複素数モードで実行するとI=171でエラーとなり実行が止まります。
10進モードだとI=70で止まります。
1000桁モードではI=453で止まります。

LET A=1
FOR I=2 TO 500
   LET A=A*I
   PRINT I;A
NEXT I
END

次に下記のようにプログラムを変更して2進モード、複素数モードで実行すると
I=170以降は同じ値が表示されます。

ですが10進モードだとそのまま計算し続けます。
しかもMAXNUM(1E99)をはるかに超えています。

WHEN EXCEPTION IN文がエラーによる停止を抑止したため、MAXNUMを超えて計算しています。
また、MAXNUM値を超えた数値が正しく判定できています。

これは明らかに十進BASICのバグだとは思いますが、2進モード(複素数モード)での限界(1.79769313486232E308)を超えていますので
指数表記ではありますが、正しく計算できているようなので超巨大数の計算に利用できそうです。(巨大数の計算には有理数モードがありますが...)

但し、MAXNUM値を大幅に超えていますので何らかの不具合を起こす可能性があるかもしれません。
(実際にどこまで計算できるのかは試しておりません。2000の階乗までは問題ない!?)

2進モード(複素数モード)ではIEEE754による数値表現で限界値があるのはわかりますが
10進モードでの数値表現(どんなものかよくわかりませんが)では、まだまだ計算可能ということだと思います。


1000桁モードではI=453でMAXNUMを超えています。
I=819で小数点以下2000桁を超えています。
I=820から指数表示に変わりますがそのまま計算し続けてます。

LET A=1
FOR I=2 TO 2000

   WHEN EXCEPTION IN
      LET A=A*I
   USE
   END WHEN

   PRINT I;
   IF MAXNUM<A THEN PRINT "TRUE"; ELSE PRINT "FALSE";
   PRINT A
NEXT I
END

       2進モード(複素数モード)での実行(一部のみ)

165 FALSE 5.42391066613159E295
166 FALSE 9.00369170577843E297
167 FALSE 1.503616514865E300
168 FALSE 2.5260757449732E302
169 FALSE 4.2690680090047E304
170 FALSE 7.25741561530799E306
171 FALSE 7.25741561530799E306
172 FALSE 7.25741561530799E306
173 FALSE 7.25741561530799E306

       10進モードでの実行(一部のみ)

65 FALSE 8.24765059208253E90
66 FALSE 5.44344939077447E92
67 FALSE 3.64711109181889E94
68 FALSE 2.48003554243685E96
69 FALSE 1.71122452428143E98
70 TRUE 1.197857166997E100
71 TRUE 8.50478588567871E101
72 TRUE 6.12344583768867E103
73 TRUE 4.47011546151273E105
74 TRUE 3.30788544151942E107
75 TRUE 2.48091408113956E109

1997 TRUE 4.151569143494E5725
1998 TRUE 8.29483514870102E5728
1999 TRUE 1.65813754622533E5732
2000 TRUE 3.31627509245067E5735


ちなみに下記のようにした場合は
2進モード、複素数モードで実行するとI=178以降で0になります。

10進モードではI=70以降で0になります。
(I=70以降も0にはならずにずっと指数表示が続くかと思ったのですが...)

1000桁モードではI=456で小数点以下2000桁を超えていますが
I=457で突然0になります。これは何らかの処理により0が代入されたものと思いますが
この挙動はいささか不自然にも思えます。

LET A=1
FOR I=2 TO 500
   LET A=A/I
   PRINT I;A
NEXT I
END
 

Re: 十進BASICのバグだとは思いますが...

 投稿者:SHIRAISHI Kazuo  投稿日:2022年 1月 2日(日)08時13分51秒
  10進モードの十進演算ルーチンは指数部をかなり大きく取っています。
べき乗の計算精度がほぼ確実と考えられる範囲をもとにMAXNUMとEPS(0)を定めています。
Full BASICの十進演算は,数値式と数値変数は別物です。
MAXNUMとEPS(0)は,数値変数の精度からきまる定数です。
十進BASICだと,数値式の途中でMAXNUMを超えるような計算も可能です。

10 LET x=MAXNUM
20 PRINT (MAXNUM*1000)/10000
30 END
数値変数にEPS(0)より小さい正の数を代入すると,変数の値は0になります。
十進BASICでは,数値式の中でそれより小さい数も扱えます。
10 LET x=EPS(0)
20 PRINT (x/100)*1000
30 END

10進1000桁モードのEPS(0)は1E-1017です。
10 OPTION ARITHMETIC DECIMAL_HIGH
20 PRINT USING "#.##^^^^^^":EPS(0)
30 END

ただし,MAXNUMより大きい数やEPS(0)より小さい数を数値変数に保持できるのは,十進BASICのバグかも知れません。








> WINDOWS版十進BASIC ver. 7.8.5.6で下記のプログラムを
> 2進モード、複素数モードで実行するとI=171でエラーとなり実行が止まります。
> 10進モードだとI=70で止まります。
> 1000桁モードではI=453で止まります。
>
> LET A=1
> FOR I=2 TO 500
>    LET A=A*I
>    PRINT I;A
> NEXT I
> END
>
> 次に下記のようにプログラムを変更して2進モード、複素数モードで実行すると
> I=170以降は同じ値が表示されます。
>
> ですが10進モードだとそのまま計算し続けます。
> しかもMAXNUM(1E99)をはるかに超えています。
>
> WHEN EXCEPTION IN文がエラーによる停止を抑止したため、MAXNUMを超えて計算しています。
> また、MAXNUM値を超えた数値が正しく判定できています。
>
> これは明らかに十進BASICのバグだとは思いますが、2進モード(複素数モード)での限界(1.79769313486232E308)を超えていますので
> 指数表記ではありますが、正しく計算できているようなので超巨大数の計算に利用できそうです。(巨大数の計算には有理数モードがありますが...)
>
> 但し、MAXNUM値を大幅に超えていますので何らかの不具合を起こす可能性があるかもしれません。
> (実際にどこまで計算できるのかは試しておりません。2000の階乗までは問題ない!?)
>
> 2進モード(複素数モード)ではIEEE754による数値表現で限界値があるのはわかりますが
> 10進モードでの数値表現(どんなものかよくわかりませんが)では、まだまだ計算可能ということだと思います。
>
>
> 1000桁モードではI=453でMAXNUMを超えています。
> I=819で小数点以下2000桁を超えています。
> I=820から指数表示に変わりますがそのまま計算し続けてます。
>
> LET A=1
> FOR I=2 TO 2000
>
>    WHEN EXCEPTION IN
>       LET A=A*I
>    USE
>    END WHEN
>
>    PRINT I;
>    IF MAXNUM<A THEN PRINT "TRUE"; ELSE PRINT "FALSE";
>    PRINT A
> NEXT I
> END
>
>        2進モード(複素数モード)での実行(一部のみ)
>
>  165 FALSE 5.42391066613159E295
>  166 FALSE 9.00369170577843E297
>  167 FALSE 1.503616514865E300
>  168 FALSE 2.5260757449732E302
>  169 FALSE 4.2690680090047E304
>  170 FALSE 7.25741561530799E306
>  171 FALSE 7.25741561530799E306
>  172 FALSE 7.25741561530799E306
>  173 FALSE 7.25741561530799E306
>
>        10進モードでの実行(一部のみ)
>
>  65 FALSE 8.24765059208253E90
>  66 FALSE 5.44344939077447E92
>  67 FALSE 3.64711109181889E94
>  68 FALSE 2.48003554243685E96
>  69 FALSE 1.71122452428143E98
>  70 TRUE 1.197857166997E100
>  71 TRUE 8.50478588567871E101
>  72 TRUE 6.12344583768867E103
>  73 TRUE 4.47011546151273E105
>  74 TRUE 3.30788544151942E107
>  75 TRUE 2.48091408113956E109
>
>  1997 TRUE 4.151569143494E5725
>  1998 TRUE 8.29483514870102E5728
>  1999 TRUE 1.65813754622533E5732
>  2000 TRUE 3.31627509245067E5735
>
>
> ちなみに下記のようにした場合は
> 2進モード、複素数モードで実行するとI=178以降で0になります。
>
> 10進モードではI=70以降で0になります。
> (I=70以降も0にはならずにずっと指数表示が続くかと思ったのですが...)
>
> 1000桁モードではI=456で小数点以下2000桁を超えていますが
> I=457で突然0になります。これは何らかの処理により0が代入されたものと思いますが
> この挙動はいささか不自然にも思えます。
>
> LET A=1
> FOR I=2 TO 500
>    LET A=A/I
>    PRINT I;A
> NEXT I
> END
>
 

白石先生へ

 投稿者:RCカー  投稿日:2022年 1月10日(月)15時29分30秒
  十進ベーシックでの、行列計算について、参考になるものはありませんか。
最小二乗法で、観測方程式と、正規方程式と、連立方程式の解き方、χ二乗検定について、
教えてほしいです。
観測値の数が、多すぎると、余剰観測といって、解が一つに定まりません。
少ないと、解けません。余剰観測値がゼロになるとそれはそれで、困るようです。
西先生の本と原田先生の本です。
最小二乗法は、測量以外にも応用が利くようですとのこと。
 

Re: 白石先生へ

 投稿者:SHIRAISHI Kazuo  投稿日:2022年 1月11日(火)08時10分0秒
  > No.4999[元記事へ]

RCカーさんへのお返事です。

十進BASICの行列計算(MAT文)は厳密解を求めるアルゴリズムになっています。
十進BASICのMAT文はサイズが大きい行列の計算には不向きなので,行列の特徴に応じたアルゴリズムに組み直した方がベターです。大きい行列の計算には反復計算で収束させるようなアルゴリズムがあるので,そのような例が見出される本を選べばいいと思います(お勧めは思いつきません)。

http://hp.vector.co.jp/authors/VA008683/

 

Re: 白石先生へ

 投稿者:RCカー  投稿日:2022年 1月11日(火)08時51分37秒
  SHIRAISHI Kazuoさんへのお返事です。
ありがとうございます。
> RCカーさんへのお返事です。
>
> 十進BASICの行列計算(MAT文)は厳密解を求めるアルゴリズムになっています。
> 十進BASICのMAT文はサイズが大きい行列の計算には不向きなので,行列の特徴に応じたアルゴリズムに組み直した方がベターです。大きい行列の計算には反復計算で収束させるようなアルゴリズムがあるので,そのような例が見出される本を選べばいいと思います(お勧めは思いつきません)。
>
 

オイラーの列の和を求める方法

 投稿者:たろさ  投稿日:2022年 1月16日(日)20時51分21秒
  解析教程〈上〉 単行本 ? 1997/10/1
E. ハイラー  (著), G. ワナー  (著)

1.5.3 サイン関数とオイラー積 P74~75
(5.23)   1/pi^2 +1/4pi^2 +1/9pi^2 +1/16pi^2 +1/25pi^2+ … =1/6


FOR n=1 TO 1E9
   LET Z=Z+1/(PI^2*n^2)
NEXT n
PRINT Z
PRINT 1/6
END


計算結果
.1666666656523
.1666666666667


動作確認 Microsoft surface pro6  メモリーDDR3 8GB   Win11 Pro 64-bit
Paract BASIC Ver. 2.1.3.1 (2022.01.09)
64ビット版Lazarus3.2.2


e^(pi*i)=-1  ;https://keisan.casio.jp/calculator

PRINT EXP(PI*COMPLEX(0,1))
計算結果
(-1  1.224646799147E-16)
(-1  1.22460635382238E-16)


https://keisan.casio.jp/exec/system/1161228679
zeta(2)=pi^2/6
zeta(100)=pi^100*189196075638244250590454866138987443745405683066133872266771392408622790830394495422/9815205420757514710108178059369553458327392260750404049930407987933582359080767225644716670683512153512547802166033089160919189453125
#4115
 

オイラーのゼータ関数

 投稿者:たろさ  投稿日:2022年 1月16日(日)21時36分47秒
  ! 6n+1,6n-1 篩 Ver.2
!5億までの素数を配列DIMに登録する。
!オイラーのゼータ関数
OPTION ARITHMETIC NATIVE       !2進モード
LET t0=TIME
LET Pk=26355867
LET k=5E8    !1E7  9999991 素数 (664579th)
LET k1=IP(k/6)
LET k2=IP(SQR(k1))

DIM A5(k1),A7(k1)

MAT A5=ZER
MAT A7=ZER

LET P1=5
LET C1=1

DO
   FOR n=1 TO k1
      LET P6=P1*n+C1
      IF P6 > k1 THEN EXIT FOR
      LET A5(P6)=1
   NEXT n
   FOR n=1 TO k1
      LET P6=P1*n-C1
      IF P6 > k1 THEN EXIT FOR
      LET A7(P6)=1
   NEXT n

   LET P1=P1+6
   LET C1=C1+1
   IF P1 >k1 THEN EXIT DO
LOOP


LET P1=7
LET C1=1
DO
   FOR n=1 TO k1
      LET P6=P1*n+C1
      IF P6 > k1 THEN EXIT FOR
      LET A7(P6)=1
   NEXT n

   FOR n=1 TO k1
      LET P6=P1*n-C1
      IF P6 > k1 THEN EXIT FOR
      LET A5(P6)=1
   NEXT n

   LET P1=P1+6
   LET C1=C1+1
   IF P1 >k1 THEN EXIT DO
LOOP
DIM B(Pk)       !1E8 99999989 素数 (5761455th)
LET B(1)=2      !2E8 199999991 素数 (11078937th)
LET B(2)=3
LET C=3
FOR n=1 TO k1
   LET P5=6*n-1
   LET P7=6*n+1
   IF A5(n)=0 THEN
      LET B(C)=P5
      LET C=C+1
   END IF
   IF A7(n)=0 THEN
      LET B(C)=P7
      LET C=C+1
   END IF
NEXT n

LET Q=1
FOR n=1 TO Pk
   LET P=B(n)^2
   LET Q=Q*(P/(P-1))
NEXT n

PRINT Q
PRINT PI^2/6

LET TM=TIME-t0
PRINT TM;"秒"

END

動作確認 Microsoft surface pro6  メモリーDDR3 8GB   Win11 Pro 64-bit
Paract BASIC Ver. 2.1.3.1 (2022.01.09)
64ビット版Lazarus3.2.2

計算結果
1.644934066247
1.644934066848
9.474000000002 秒

5億まで では?
15億までは確認しました。1.644934066

とある八雲の科学解説 『素数から生まれる円周率』
https://www.youtube.com/watch?v=aq_-cIv92t8
 

フラグメントシェーダー グラフ

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時20分11秒
  フラグメントシェーダー グラフ

4548
4549
4550
4551
4552



OpenGLのシェーダー言語GLSLをもとにしています。
フラグメントシェーダーでは各ドットに対して色を決めて描画していくもので
使用する描画コマンドはPLOT POINTSのみです。PLOT LINESやDRAW文は使いません。

各R,G,Bを0~1までの数値で表したフルカラーを使います。
WINDOWは(-1,-1)-(1,1)として原点(0,0)を中心とした正方形領域を想定しています。


フラグメントシェーダーにはMOD関数による繰り返しやABS関数による折り畳み
ブーリアン演算などがあります。


フラグメントシェーダーでは基本的に距離関数というものを定義して描画していきます。
その距離関数の正体は陰関数(f(x,y)=0)です。y=f(x)もy-f(x)=0とすれば陰関数になります。
陰関数なのでf(x,y)<0ならその内側になり、f(x,y)>0なら外側になります。

ここではy=3*sin(2*x)^3+sin(x)^2-2*sin(3*x)のグラフを描画しています。


なお、シェーダー言語GLSL(WebGL)ではGPUをごりごりに使用したアニメーション表示です。(GPUで暖がとれる!?)
見ているだけでも楽しいのでぜひアクセスしてみてください。

https://glslsandbox.com/
https://glslsandbox.com/e#78473.0
https://glslsandbox.com/e#78672.0
https://glslsandbox.com/e#78754.0
https://glslsandbox.com/e#78747.0
https://glslsandbox.com/e#78666.0
https://glslsandbox.com/e#78263.0
https://glslsandbox.com/e#78701.0
https://glslsandbox.com/e#78390.0


DIM P(2),COL(3),CC(3),B(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE) !! SET WINDOW -1,1,-1,1
CALL VEC3(CC,1,.4,.1)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE) ! -1~1
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE) ! -1~1
      CALL VEC2(P,X,Y)
      MAT P=5*P
      IF ABS(MOD(P(1),1))<.02 OR ABS(MOD(P(2),1))<.02 THEN CALL VEC3(B,.2,.2,.2) ELSE CALL VEC3(B,0,0,0)
      IF ABS(P(1))<.03 OR ABS(P(2))<.03 THEN CALL VEC3(B,.5,.5,.5)
      LET L=ABS(DISTANCE(P)-.6)
      IF L<>0 THEN
         LET F=.1/L
      ELSE
         LET F=1
      END IF
      MAT COL=F*CC
      MAT COL=COL+B
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION DISTANCE(P()) !距離関数 y=3*sin(2*x)^3+sin(x)^2-2*sin(3*x)
LET DISTANCE=3*SIN(2*P(1))^3+SIN(P(1))^2-2*SIN(3*P(1))-P(2)
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION
 

フラグメントシェーダー 円

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時20分54秒
  フラグメントシェーダー 円

ここでは距離関数に円を定義しています。
これは円の方程式 x^2+y^2=r^2 から SQR(x^2+y^2)-r=0となります。
距離関数が正か負で塗分けています。

では距離関数をどう定義したらいいのかについては
具体的な距離関数がネット上に公開されています。

https://iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm
https://www.shadertoy.com/playlist/MXdSRf

3次元の距離関数も公開されています。
https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm


DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)>0 THEN
         CALL VEC3(C,0,0,0)
      ELSE
         CALL VEC3(C,1,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION CIRCLE(P(),R) !距離関数 円
LET CIRCLE=LENGTH(P)-R
!!LET CIRCLE=NLENGTH(P,4)-R
END FUNCTION

EXTERNAL  FUNCTION ELLIPSE(P(),A,B,N) !距離関数 楕円
LET ELLIPSE=ABS(P(1)/A)^N+ABS(P(2)/B)^N-1
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
LET DISTANCE=CIRCLE(P,.5)
!LET DISTANCE=ELLIPSE(P,.7,.4,2)
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION

EXTERNAL  FUNCTION NLENGTH(P(),N)
LET NLENGTH=(ABS(P(1))^N+ABS(P(2))^N)^(1/N)
END FUNCTION
 

フラグメントシェーダー 箱

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時21分48秒
  フラグメントシェーダー 箱

距離関数BOXに四角形(箱)を定義しています。
どうしてこれで四角形(箱)が描けるのかを考えてみるのもいいかもしれません。

また距離関数ROUNDBOXは角に丸みがある四角形(箱)です。
距離関数BOXとの違いはRを引いているかだけです。

DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)>0 THEN
         CALL VEC3(C,0,0,0)
      ELSE
         CALL VEC3(C,1,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION BOX(P(),B()) !距離関数 箱
DIM D(2),DD(2)
FOR I=1 TO 2
   LET D(I)=ABS(P(I))-B(I)
NEXT I
FOR I=1 TO 2
   LET DD(I)=MAX(D(I),0)
NEXT I
LET BOX=LENGTH(DD)+MIN(MAX(D(1),D(2)),0)
END FUNCTION

EXTERNAL  FUNCTION ROUNDBOX(P(),B(),R) !距離関数
LET ROUNDBOX=BOX(P,B)-R
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM B(2)
CALL VEC2(B,.3,.3)
LET DISTANCE=BOX(P,B)
!!LET DISTANCE=ROUNDBOX(P,B,.1)
!!LET DISTANCE=ABS((P(1)-B(1))+(P(2)-B(2)))+ABS((P(1)-B(1))-(P(2)-B(2)))-1
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION
 

フラグメントシェーダー 三角形

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時22分28秒
  フラグメントシェーダー 三角形

三角形を定義しています。

DIM P(2),COL(3),PP(2)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      IF DISTANCE(P)<0 THEN
         CALL VEC3(COL,1,0,0)
      ELSE
         CALL VEC3(COL,0,0,0)
      END IF
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION TRIANGLE(P(),P0(),P1(),P2()) !距離関数 三角形
DIM E0(2),E1(2),E2(2),V0(2),V1(2),V2(2),PQ0(2),PQ1(2),PQ2(2),D(2)
MAT E0=P1-P0
MAT E1=P2-P1
MAT E2=P0-P2
MAT V0=P-P0
MAT V1=P-P1
MAT V2=P-P2
FOR I=1 TO 2
   LET PQ0(I)=V0(I)-E0(I)*CLAMP(DOT(V0,E0)/DOT(E0,E0),0,1)
   LET PQ1(I)=V1(I)-E1(I)*CLAMP(DOT(V1,E1)/DOT(E1,E1),0,1)
   LET PQ2(I)=V2(I)-E2(I)*CLAMP(DOT(V2,E2)/DOT(E2,E2),0,1)
NEXT I
LET S=SIGN(E0(1)*E2(2)-E0(2)*E2(1))
CALL VEC2(V0,DOT(PQ0,PQ0),S*(V0(1)*E0(2)-V0(2)*E0(1)))
CALL VEC2(V1,DOT(PQ1,PQ1),S*(V1(1)*E1(2)-V1(2)*E1(1)))
CALL VEC2(V2,DOT(PQ2,PQ2),S*(V2(1)*E2(2)-V2(2)*E2(1)))
FOR I=1 TO 2
   LET D(I)=MIN(MIN(V0(I),V1(I)),V2(I))
NEXT I
LET TRIANGLE=-SQR(D(1))*SIGN(D(2))
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM P0(2),P1(2),P2(2)
CALL VEC2(P0,-.9,.1)
CALL VEC2(P1,.3,.5)
CALL VEC2(P2,-.5,-.8)
LET DISTANCE=TRIANGLE(P,P0,P1,P2)
!!LET DISTANCE=TRIANGLE(P,P0,P1,P2)-.1 ! 角を丸くする
!!LET DISTANCE=ABS(4*P(1)+(2*SQR(3))*ABS(P(2))-1)+2*SQR(3)*ABS(P(2))-3
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION SIGN(X)
IF X<0 THEN
   LET SIGN=-1
ELSEIF X>0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

フラグメントシェーダー 五角形

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時23分15秒
  フラグメントシェーダー 五角形

五角形を定義しています。


DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)>0 THEN
         CALL VEC3(C,0,0,0)
      ELSE
         CALL VEC3(C,1,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION PENTAGON(P(),R) !距離関数 五角形
DIM K(3),P1(2),P2(2),PP(2)
CALL VEC3(K,.809016994,.587785252,.726542528)
CALL VEC2(P1,-K(1),K(2))
CALL VEC2(P2,K(1),K(2))
LET P(1)=ABS(P(1))
MAT PP=P
FOR I=1 TO 2
   LET P(I)=P(I)-2*MIN(DOT(P1,PP),0)*P1(I)
NEXT I
MAT PP=P
FOR I=1 TO 2
   LET P(I)=P(I)-2*MIN(DOT(P2,PP),0)*P2(I)
NEXT I
CALL VEC2(P1,CLAMP(P(1),-R*K(3),R*K(3)),R)
MAT P=P-P1
LET PENTAGON=LENGTH(P)*SIGN(P(2))
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
LET DISTANCE=PENTAGON(P,.5)
!!LET DISTANCE=ABS(PENTAGON(P,.5))-.1 !くり抜き
!!LET DISTANCE=2*ABS(P(2))+ABS(SQR(3)*P(1)-P(2))+ABS(SQR(3)*P(1)+P(2))-2*SQR(3) !6角形
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION

EXTERNAL  FUNCTION SIGN(X)
IF X<0 THEN
   LET SIGN=-1
ELSEIF X>0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

フラグメントシェーダー 正多角形

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時24分7秒
  フラグメントシェーダー 正多角形

正多角形を定義しています。
http://math.sakura.ne.jp/?action=common_download_main&upload_id=2052


DIM P(2),COL(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      IF DISTANCE(P)<0 THEN
         CALL VEC3(COL,1,0,0)
      ELSE
         CALL VEC3(COL,0,0,0)
      END IF
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION POLYGON(P(),N)
FOR K=1 TO INT(N/2)
   LET S=S+ABS(P(1)*SIN(2*K*PI/N)-ABS(P(2))*COS(2*K*PI/N))
   LET E=E+SIN(2*K*PI/N)
NEXT K
LET S=S+.5*ABS(P(2)*SIN(N*PI/2))-.5*P(1)*COT(INT(N/2)*PI/N)
LET E=E-.5*COT(INT(N/2)*PI/N)
LET POLYGON=S-E
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
CALL ROTATE(P,PI/6)
LET DISTANCE=POLYGON(P,3)

!CALL ROTATE(P,PI/4)
!LET DISTANCE=POLYGON(P,4)

!CALL ROTATE(P,PI/5*1.5)
!LET DISTANCE=POLYGON(P,5)

!LET DISTANCE=POLYGON(P,6)

!CALL ROTATE(P,PI/14)
!LET DISTANCE=POLYGON(P,7)

!CALL ROTATE(P,PI/8)
!LET DISTANCE=POLYGON(P,8)
END FUNCTION

EXTERNAL  SUB ROTATE(A(),T)
DIM M(2,2)
LET S=SIN(T)
LET C=COS(T)
LET M(1,1)=C
LET M(1,2)=S
LET M(2,1)=-S
LET M(2,2)=C
MAT A=A*M
END SUB

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION
 

フラグメントシェーダー 星

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時24分54秒
  フラグメントシェーダー 星

星型を定義しています。


DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)>0 THEN
         CALL VEC3(C,0,0,0)
      ELSE
         CALL VEC3(C,1,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION STAR5(P(),R,RF) !距離関数 星型
DIM K1(2),K2(2),BA(2),P1(2),PP(2)
CALL VEC2(K1,.809016994375,-.587785252292)
CALL VEC2(K2,-K1(1),K1(2))
LET P(1)=ABS(P(1))
MAT PP=P
FOR I=1 TO 2
   LET P(I)=P(I)-2*MAX(DOT(K1,PP),0)*K1(I)
NEXT I
MAT PP=P
FOR I=1 TO 2
   LET P(I)=P(I)-2*MAX(DOT(K2,PP),0)*K2(I)
NEXT I
LET P(1)=ABS(P(1))
LET P(2)=P(2)-R
CALL VEC2(K2,-K1(2),K1(1))
MAT BA=RF*K2
CALL VEC2(K2,0,1)
MAT BA=BA-K2
LET H=CLAMP(DOT(P,BA)/DOT(BA,BA),0,R)
MAT P1=H*BA
MAT P1=P-P1
LET STAR5=LENGTH(P1)*SIGN(P(2)*BA(1)-P(1)*BA(2))
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
LET DISTANCE=STAR5(P,.5,.381966011250105)
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION

EXTERNAL  FUNCTION SIGN(X)
IF X<0 THEN
   LET SIGN=-1
ELSEIF X>0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

フラグメントシェーダー ハート

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時25分29秒
  フラグメントシェーダー ハート

ハート型を定義しています。

DIM P(2),COL(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      !! MAT P=2*P
      IF DISTANCE(P)<0 THEN
         CALL VEC3(COL,1,0,0)
      ELSE
         CALL VEC3(COL,0,0,0)
      END IF
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION HEART(P()) !距離関数 ハート
DIM P1(2),P2(2),P3(2)
CALL VEC2(P1,.25,.75)
CALL VEC2(P2,0,1)
LET P(1)=ABS(P(1))
IF P(2)+P(1)>1 THEN
   MAT P1=P-P1
   LET HEART=SQR(DOT(P1,P1))-SQR(2)/4
ELSE
   MAT P2=P-P2
   FOR I=1 TO 2
      LET P3(I)=P(I)-.5*MAX(P(1)+P(2),0)
   NEXT I
   LET HEART=SQR(MIN(DOT(P2,P2),DOT(P3,P3)))*SIGN(P(1)-P(2))
END IF
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM P1(2)
CALL VEC2(P1,0,-.5)
MAT P=P-P1
LET DISTANCE=HEART(P)
!!LET DISTANCE=(P(1)^2+P(2)^2-1)^3-P(1)^2*P(2)^3
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  FUNCTION SIGN(X)
IF X<0 THEN
   LET SIGN=-1
ELSEIF X>0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION
 

フラグメントシェーダー 増殖 mod関数

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時26分30秒
  フラグメントシェーダー 増殖 mod関数

距離関数にmod関数を使うと増殖させることができます。

DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)<0 THEN
         CALL VEC3(C,1,0,1)
      ELSE
         CALL VEC3(C,0,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION CIRCLE(P(),R)
LET CIRCLE=LENGTH(P)-R
END FUNCTION

EXTERNAL  SUB REP(P(),C())
FOR I=1 TO 2
   LET P(I)=MOD(P(I)+.5*C(I),C(I))-.5*C(I)
NEXT I
END SUB

EXTERNAL  FUNCTION DISTANCE(P())
DIM T(2)
CALL VEC2(T,.25,.25)
CALL REP(P,T) !ここを注釈にすると1個だけになる。
LET DISTANCE=CIRCLE(P,.1)
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION
 

フラグメントシェーダー 折り畳み abs関数

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時27分36秒
  フラグメントシェーダー 折り畳み abs関数

abs関数を使うと万華鏡のような効果をうみます。
(-1,-1)~(1,1)の範囲においてx=abs(x)とするとy軸対称になり
更にy=abs(y)とするとx軸対称になり万華鏡のようになります。

https://docs.google.com/presentation/d/12RrqyAkFanKmfL96ZHvhDCozE-_rKFPlU1YVwej4_bc/htmlpresent
※現在時刻(TIME)を使用しています。

DIM C(3),P(2),T(2)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
LET TI=INT(TIME)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      FOR K=0 TO 4
         FOR I=1 TO 2
            LET P(I)=ABS(1.5*P(I))-1
         NEXT I
         CALL ROTATE(P,TI*K)
      NEXT K
      FOR I=1 TO 2
         LET T(I)=1-SMOOTHSTEP(.01,.02,ABS(P(I)))
         LET C(I)=MIX(P(I),1,T(1)+T(2))
      NEXT I
      CALL SETCOLOR(C(1),C(2),.5)
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB ROTATE(A(),T)
DIM M(2,2)
LET S=SIN(T)
LET C=COS(T)
LET M(1,1)=C
LET M(1,2)=S
LET M(2,1)=-S
LET M(2,2)=C
MAT A=A*M
END SUB

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION MIX(X,Y,A)
LET MIX=X*(1-A)+Y*A
END FUNCTION

EXTERNAL  FUNCTION SMOOTHSTEP(A,B,X)
LET T=CLAMP((X-A)/(B-A),0,1)
LET SMOOTHSTEP=T*T*(3-2*T)
END FUNCTION

EXTERNAL  FUNCTION SIGN(X)
IF X<0 THEN
   LET SIGN=-1
ELSEIF X>0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

フラグメントシェーダー 再帰呼び出し tree

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時28分42秒
  フラグメントシェーダー 再帰呼び出し tree

https://gam0022.net/blog/2017/03/02/raymarching-fold/
距離関数TREEはループとabs関数で再帰呼び出しの代わりをしています。

※シェーダー言語GLSLは再帰呼び出しができないのでループで代用します。


DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)>0 THEN
         CALL VEC3(C,0,0,0)
      ELSE
         CALL VEC3(C,1,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION BOX(P(),B()) !距離関数 BOX
DIM D(2),DD(2)
FOR I=1 TO 2
   LET D(I)=ABS(P(I))-B(I)
NEXT I
FOR I=1 TO 2
   LET DD(I)=MAX(D(I),0)
NEXT I
LET BOX=LENGTH(DD)+MIN(MAX(D(1),D(2)),0)
END FUNCTION

EXTERNAL  FUNCTION TREE(P()) !距離関数 TREE
DIM Q(2),SIZE(2)
LET SCALE=.8
CALL VEC2(SIZE,.1,.4)
LET D=BOX(P,SIZE)
MAT Q=P
FOR I=1 TO 7
   LET Q(1)=ABS(P(1))
   LET Q(2)=Q(2)-SIZE(2)
   CALL ROTATE(Q,-RAD(45))
   LET D=MIN(D,BOX(P,SIZE))
   MAT P=Q
   MAT SIZE=SCALE*SIZE
NEXT I
LET TREE=D
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
LET P(2)=P(2)+.5
LET DISTANCE=TREE(P)
END FUNCTION

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB ROTATE(A(),ANGLE)
DIM M(2,2)
LET M(1,1)=COS(ANGLE)
LET M(1,2)=-SIN(ANGLE)
LET M(2,1)=SIN(ANGLE)
LET M(2,2)=COS(ANGLE)
MAT A=A*M
END SUB

EXTERNAL  FUNCTION STEP(A,X)
IF X<A THEN LET STEP=0 ELSE LET STEP=1
END FUNCTION

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION
 

フラグメントシェーダー ブーリアン演算

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時29分43秒
  フラグメントシェーダー ブーリアン演算

円を2つ定義してブーリアン演算により合体させています。
ブーリアン演算には和、差、積があります。
https://ja.wikipedia.org/wiki/ブーリアン演算


DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)<0 THEN
         CALL VEC3(C,1,0,0)
      ELSE
         CALL VEC3(C,0,0,0)
      END IF
      CALL SETCOLOR(C)
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION CIRCLE(P(),B(),R)
DIM PP(2)
MAT PP=P-B
LET CIRCLE=LENGTH(PP)-R
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM P1(2),P2(2)
CALL VEC2(P1,-.25,0)
CALL VEC2(P2,.25,0)
LET A=CIRCLE(P,P1,.6)
LET B=CIRCLE(P,P2,.4)
!LET DISTANCE=A
!LET DISTANCE=B
LET DISTANCE=MIN(A,B)   ! ブーリアン演算 和
!LET DISTANCE=MAX(A,B)  ! ブーリアン演算 積
!LET DISTANCE=MAX(-A,B) ! ブーリアン演算 差
!LET DISTANCE=MAX(A,-B) ! ブーリアン演算 差
!LET DISTANCE=MIN(MAX(-A,B),MAX(A,-B)) ! ブーリアン演算
END FUNCTION

EXTERNAL  SUB SETCOLOR(COL())
SET COLOR COLORINDEX(CLAMP(COL(1),0,1),CLAMP(COL(2),0,1),CLAMP(COL(3),0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION
 

フラグメントシェーダー ブーリアン演算 smooth min関数

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時30分46秒
  フラグメントシェーダー  ブーリアン演算 smooth min関数

ブーリアン演算のmin関数をsmooth min関数にすると
接合部をなめらかにすることができます。min関数と比べてみてください。
https://www.iquilezles.org/www/articles/smin/smin.htm

DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      !IF ABS(DISTANCE(ST))<.01 THEN
      IF DISTANCE(ST)<0 THEN
         CALL VEC3(C,1,0,0)
      ELSE
         CALL VEC3(C,0,0,0)
      END IF
      CALL SETCOLOR(C)
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION CIRCLE(P(),B(),R)
DIM PP(2)
MAT PP=P-B
LET CIRCLE=LENGTH(PP)-R
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM P1(2),P2(2)
CALL VEC2(P1,-.25,0)
CALL VEC2(P2,.25,0)
LET DISTANCE=SMIN(CIRCLE(P,P1,.6),CIRCLE(P,P2,.4))
!LET DISTANCE=SMIN2(CIRCLE(P,P1,.6),CIRCLE(P,P2,.4))
!LET DISTANCE=SMIN3(CIRCLE(P,P1,.6),CIRCLE(P,P2,.4))
!LET DISTANCE=SMIN4(CIRCLE(P,P1,.6),CIRCLE(P,P2,.4))
!LET DISTANCE=SMIN5(CIRCLE(P,P1,.6),CIRCLE(P,P2,.4))
END FUNCTION

EXTERNAL  FUNCTION SMIN(A,B) !exponential smooth min
LET K=32
LET RES=EXP(-K*A)+EXP(-K*B)
LET SMIN=-LOG(RES)/K
END FUNCTION

EXTERNAL  FUNCTION SMIN2(A,B) !polynomial smooth min
LET K=.1
LET H=CLAMP(.5+.5*(B-A)/K,0,1)
LET SMIN2=MIX(B,A,H)-K*H*(1-H)
END FUNCTION

EXTERNAL  FUNCTION SMIN3(A,B) !polynomial smooth min
LET K=.1
LET H=MAX(K-ABS(A-B),0)/K
LET SMIN3=MIN(A,B)-H*H*K/4
END FUNCTION

EXTERNAL  FUNCTION SMIN4(A,B) !polynomial smooth min
LET K=.1
LET H=MAX(K-ABS(A-B),0)/K
LET SMIN4=MIN(A,B)-H*H*H*K/6
END FUNCTION

EXTERNAL  FUNCTION SMIN5(A,B) !root smooth min
LET K=.01
LET H=A-B
LET SMIN5=.5*((A+B)-SQR(H*H+K))
END FUNCTION

!EXTERNAL  FUNCTION SMAX(A,B)
!LET SMAX=A+B-SMIN(A,B)
!END FUNCTION

EXTERNAL  SUB SETCOLOR(COL())
SET COLOR COLORINDEX(CLAMP(COL(1),0,1),CLAMP(COL(2),0,1),CLAMP(COL(3),0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION

EXTERNAL  FUNCTION MIX(X,Y,A)
LET MIX=X*(1-A)+Y*A
END FUNCTION
 

フラグメントシェーダー 三項ブーリアン演算

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時31分47秒
  フラグメントシェーダー  三項ブーリアン演算

ブーリアン演算を3項でやってみた。


DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      IF DISTANCE(ST)<0 THEN
         CALL VEC3(C,1,0,0)
      ELSE
         CALL VEC3(C,0,0,0)
      END IF
      CALL SETCOLOR(C)
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION MIN3(X,Y,Z)
LET MIN3=MIN(X,MIN(Y,Z))
END FUNCTION

EXTERNAL  FUNCTION MIN4(X,Y,Z,W)
LET MIN4=MIN(MIN(X,Y),MIN(Z,W))
END FUNCTION

EXTERNAL  FUNCTION MAX3(X,Y,Z)
LET MAX3=MAX(X,MAX(Y,Z))
END FUNCTION

EXTERNAL  FUNCTION CIRCLE(P(),B(),R)
DIM PP(2)
MAT PP=P-B
LET CIRCLE=LENGTH(PP)-R
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM P1(2),P2(2),P3(2)
CALL VEC2(P1,.3*COS(0),.3*SIN(0))
CALL VEC2(P2,.3*COS(2*PI/3),.3*SIN(2*PI/3))
CALL VEC2(P3,.3*COS(4*PI/3),.3*SIN(4*PI/3))
LET A=CIRCLE(P,P1,.5)
LET B=CIRCLE(P,P2,.5)
LET C=CIRCLE(P,P3,.5)
LET DISTANCE=MIN3(A,B,C)
!LET DISTANCE=MAX3(A,B,C)
!LET DISTANCE=MAX3(-A,B,C)
!LET DISTANCE=MAX3(A,-B,C)
!LET DISTANCE=MAX3(A,B,-C)
!LET DISTANCE=MAX3(A,-B,-C)
!LET DISTANCE=MAX3(-A,B,-C)
!LET DISTANCE=MAX3(-A,-B,C)
!LET DISTANCE=MIN3(MIN(MAX(-A,B),MAX(A,-B)),MIN(MAX(-B,C),MAX(B,-C)),MIN(MAX(-A,C),MAX(A,-C)))
!LET DISTANCE=MAX3(MIN(A,B),MIN(B,C),MIN(A,C))
!LET DISTANCE=MIN3(MAX(A,B),MAX(B,C),MAX(A,C))
!LET DISTANCE=MIN3(MAX(-A,B),MAX(-B,C),MAX(A,-C))
!LET DISTANCE=MIN3(MAX3(-A,-B,C),MAX3(A,-B,-C),MAX3(-A,B,-C))
!LET DISTANCE=MIN3(MAX3(-A,B,C),MAX3(A,-B,C),MAX3(A,B,-C))
!LET DISTANCE=MIN(MAX3(-A,B,C),MAX3(A,-B,C))
!LET DISTANCE=MIN3(MAX3(-A,-B,C),MAX3(A,B,C),MAX3(A,B,-C))
!LET DISTANCE=MIN3(MAX3(-A,B,C),MAX3(-A,-B,C),MAX3(A,-B,-C))
!LET DISTANCE=MIN3(MAX3(A,B,C),MAX3(-A,B,C),MAX3(A,-B,C))
!LET DISTANCE=MAX(A,MIN(-B,C))
!LET DISTANCE=MIN3(MAX3(A,-B,-C),MAX3(-A,B,-C),MAX3(A,B,C))
!LET DISTANCE=MIN3(MAX3(A,-B,-C),MAX3(-A,B,C),MAX3(A,B,C))
!LET DISTANCE=MIN4(MAX3(A,-B,C),MAX3(-A,-B,C),MAX3(A,B,-C),MAX3(A,-B,-C))
!LET DISTANCE=MIN3(MAX3(A,B,-C),MAX3(A,-B,-C),MAX3(-A,-B,C))
END FUNCTION

EXTERNAL  SUB SETCOLOR(COL())
SET COLOR COLORINDEX(CLAMP(COL(1),0,1),CLAMP(COL(2),0,1),CLAMP(COL(3),0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION
 

フラグメントシェーダー ホワイトノイズ

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時32分48秒
  フラグメントシェーダー  ホワイトノイズ

乱数randomを定義してホワイトノイズ(砂嵐)を描いています。

randomはデダラメな数値を返す関数です。
引数が同じなら同じ値を返します。

https://nogson2.hatenablog.com/entry/2017/11/18/150645


DIM P(2),COL(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      LET N=RANDOM(P)
      CALL VEC3(COL,N,N,N)
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  FUNCTION RANDOM(S()) !乱数
DIM V(2)
CALL VEC2(V,12.9898,78.233)
LET RANDOM=FRACT(SIN(DOT(S,V))*43758.5453123)
END FUNCTION

EXTERNAL  FUNCTION FRACT(X)
LET FRACT=X-INT(X)
END FUNCTION

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION
 

フラグメントシェーダー パーリンノイズ

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時33分34秒
  フラグメントシェーダー  パーリンノイズ

ノイズ関数を定義してパーリンノイズを生成しています。
雲(霧?)のようなものを描きます。


DIM P(2),COL(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      MAT P=3*P
      LET N=FBM(P)
      CALL VEC3(COL,N,N,N)
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  FUNCTION RANDOM(S())
DIM V(2)
CALL VEC2(V,12.9898,78.233)
LET RANDOM=FRACT(SIN(DOT(S,V))*43758.5453123)
END FUNCTION

EXTERNAL  FUNCTION NOISE(ST())
DIM I(2),F(2),U(2),I1(2),I2(2),I3(2)
FOR J=1 TO 2
   LET I(J)=FLOOR(ST(J))
   LET F(J)=FRACT(ST(J))
NEXT J
CALL VEC2(I1,1,0)
CALL VEC2(I2,0,1)
CALL VEC2(I3,1,1)
MAT I1=I1+I
MAT I2=I2+I
MAT I3=I3+I
LET A=RANDOM(I)
LET B=RANDOM(I1)
LET C=RANDOM(I2)
LET D=RANDOM(I3)
FOR J=1 TO 2
   LET U(J)=F(J)*F(J)*(3-2*F(J))
NEXT J
LET NOISE=MIX(A,B,U(1))+(C-A)*U(2)*(1-U(1))+(D-B)*U(1)*U(2)
END FUNCTION

EXTERNAL  FUNCTION FBM(ST())
LET VALUE=0
LET AMPLITUDE=.5
LET FREQUENCY=0
FOR I=0 TO 5
   LET VALUE=VALUE+AMPLITUDE*NOISE(ST)
   MAT ST=2*ST
   LET AMPLITUDE=AMPLITUDE*.5
NEXT I
LET FBM=VALUE
END FUNCTION

EXTERNAL  FUNCTION FRACT(X)
LET FRACT=X-INT(X)
END FUNCTION

EXTERNAL  FUNCTION FLOOR(X)
LET FLOOR=INT(X)
END FUNCTION

EXTERNAL  FUNCTION STEP(A,X)
IF X<A THEN LET STEP=0 ELSE LET STEP=1
END FUNCTION

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION MIX(X,Y,A)
LET MIX=X*(1-A)+Y*A
END FUNCTION
 

フラグメントシェーダー 市松模様

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時34分43秒
  フラグメントシェーダー  市松模様

市松模様を描いています。
https://junk-box.net/kuyo/index.php/2020/11/29/material_part1/

※「鬼滅の刃」竈門炭治郎のイメージ ?

DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      !! CALL ROTATE(ST,RAD(25)) !注釈を外すと傾けることができます。
      MAT ST=5*ST
      FOR I=1 TO 2
         LET ST(I)=FRACT(ST(I))
      NEXT I
      MAT ST=2*ST
      LET INDEX=0
      LET INDEX=INDEX+STEP(1,MOD(ST(1),2))
      LET INDEX=INDEX+STEP(1,MOD(ST(2),2))*2
      IF INDEX=1 OR INDEX=2 THEN
         CALL VEC3(C,0,1,0)
      ELSE
         CALL VEC3(C,0,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB ROTATE(A(),T)
DIM M(2,2)
LET S=SIN(T)
LET C=COS(T)
LET M(1,1)=C
LET M(1,2)=S
LET M(2,1)=-S
LET M(2,2)=C
MAT A=A*M
END SUB

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  FUNCTION FRACT(X)
LET FRACT=X-INT(X)
END FUNCTION

EXTERNAL  FUNCTION STEP(A,X)
IF X0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
-----------------------------------------------------------------------------------------------------------
円形にしてみた


DIM P(2),COL(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
LET N=20
LET SIZE=2/N
LET NN=2
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(P,X,Y)
      LET D=NLENGTH(P,NN)
      IF X=0 AND Y=0 THEN LET TH=0 ELSE LET TH=ANGLE(X,Y)
      LET D=INT(D/SIZE)
      LET TH=INT(TH/SIZE/PI)
      IF MOD(D+TH,2)=0 THEN
         CALL VEC3(COL,0,0,0)
      ELSE
         CALL VEC3(COL,0,1,0)
      END IF
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB

EXTERNAL  SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB

EXTERNAL  FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION

EXTERNAL  FUNCTION NLENGTH(P(),N)
LET NLENGTH=(ABS(P(1))^N+ABS(P(2))^N)^(1/N)
END FUNCTION
 

フラグメントシェーダー 七宝模様

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時35分22秒
  フラグメントシェーダー  七宝模様

七宝模様です。


DIM ST(2),C(3),T1(2),T2(2)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
CALL VEC2(T1,0,0)
CALL VEC2(T2,1,1)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      MAT ST=5*ST
      FOR I=1 TO 2
         LET ST(I)=FRACT(ST(I))
      NEXT I
      MAT ST=2*ST
      LET INDEX=0
      LET INDEX=INDEX+STEP(1,MOD(ST(1),2))
      LET INDEX=INDEX+STEP(1,MOD(ST(2),2))*2
      FOR I=1 TO 2
         LET ST(I)=FRACT(ST(I))
      NEXT I
      IF INDEX=1 OR INDEX=2 THEN
         LET ST(1)=1-ST(1)
      END IF
      IF DISTANCE(ST,T1)<1 AND DISTANCE(ST,T2)<1 THEN
         CALL VEC3(C,1,1,0)
      ELSE
         CALL VEC3(C,1,0,0)
      END IF
      CALL SETCOLOR(C(1),C(2),C(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  FUNCTION DISTANCE(A(),B())
LET DISTANCE=SQR((B(1)-A(1))^2+(B(2)-A(2))^2)
END FUNCTION

EXTERNAL  FUNCTION FRACT(X)
LET FRACT=X-INT(X)
END FUNCTION

EXTERNAL  FUNCTION STEP(A,X)
IF X0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

フラグメントシェーダー 青海波模様

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時36分3秒
  フラグメントシェーダー  青海波模様

青海波模様です。


DIM ST(2),C(3),T1(2),T2(2),T3(2)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
CALL VEC2(T1,1,-.5)
CALL VEC2(T2,0,0)
CALL VEC2(T3,1,.5)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
      CALL VEC2(ST,X,Y)
      MAT ST=5*ST
      FOR I=1 TO 2
         LET ST(I)=FRACT(ST(I))
      NEXT I
      MAT ST=2*ST
      LET INDEX=0
      LET INDEX=INDEX+STEP(1,MOD(ST(1),2))
      LET INDEX=INDEX+STEP(1,MOD(ST(2),2))*2
      FOR I=1 TO 2
         LET ST(I)=FRACT(ST(I))
      NEXT I
      IF INDEX=1 OR INDEX=3 THEN
         LET ST(1)=1-ST(1)
      END IF
      LET D=DISTANCE(T1,ST)
      LET T=0
      IF D<1 THEN
         LET T=ABS(COS(D*2.65*PI))
      END IF
      LET D=DISTANCE(T2,ST)
      IF D<1 AND T=0 THEN
         LET T=ABS(COS(D*2.65*PI))
      END IF
      LET D=DISTANCE(T3,ST)
      IF T=0 THEN
         LET T=ABS(COS(D*2.65*PI))
      END IF
      IF T>.5 THEN
         CALL VEC3(C,0.,.5,1)
      ELSE
         CALL VEC3(C,1,1,1)
      END IF
      CALL SETCOLOR(C)
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB SETCOLOR(COL())
SET COLOR COLORINDEX(CLAMP(COL(1),0,1),CLAMP(COL(2),0,1),CLAMP(COL(3),0,1))
END SUB

EXTERNAL  FUNCTION DISTANCE(A(),B())
LET DISTANCE=SQR((B(1)-A(1))^2+(B(2)-A(2))^2)
END FUNCTION

EXTERNAL  FUNCTION FRACT(X)
LET FRACT=X-INT(X)
END FUNCTION

EXTERNAL  FUNCTION STEP(A,X)
IF X0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

インストーラ版に同梱されていないファイルがあります

 投稿者:nagram  投稿日:2022年 2月28日(月)11時19分1秒
  Ver.7.8.6.4 の Windowsインストーラ版に下記のファイルが同梱されていません。

テキストファイル  REVISION.TXT
ファイルフォルダー  Tutorial

アーカイブ版にはあります。
 

Re: インストーラ版に同梱されていないファイルがあります

 投稿者:SHIRAISHI Kazuo  投稿日:2022年 2月28日(月)16時34分18秒
  > No.5026[元記事へ]

ご報告ありがとうございました。
修正版を作成します。


> Ver.7.8.6.4 の Windowsインストーラ版に下記のファイルが同梱されていません。
>
> テキストファイル  REVISION.TXT
> ファイルフォルダー  Tutorial
>
> アーカイブ版にはあります。
 

奇妙な数

 投稿者:  投稿日:2022年 7月 4日(月)17時01分6秒
返信・引用 編集済
  2014年1月22日の「奇妙な数」について

どうしたらこのような数式が導き出せるのか、他にも作れないだろうか、私なりに

考えてみました。

123789^2 + 561945^2 + 642864^2 = 242868^2 + 761943^2 + 323787^2 について

まず、数値を縦に並べ、上(左辺)と下(右辺)を見比べると、2つのことがわかります。

1 2 3 7 8 9  ① 万・千・百・十の位の数字は上下同じで、3つの数字の差が一定

5 6 1 9 4 5   万の位: 2・6・4と4・6・2、 千の位: 3・1・2と2・1・3

6 4 2 8 6 4    百の位: 7・9・8と8・9・7、 十の位: 8・4・6と6・4・8

2 4 2 8 6 8  ② 十万・一の位の数字は、3つの和が上下等しく、2乗の和も等しい

7 6 1 9 4 3   十万の位:1+5+6=2+7+3、1^2+5^2+6^2 = 2^2 + 7^2 + 3^2

3 2 3 7 8 7   一の  位:9+5+4=8+3+7、9^2+5^2+4^2 = 8^2 + 3^2 + 7^2

そこで、①、②のような数字の例を探し出しました。

③ 3つの数字の差が一定の例

  1・2・3、1・3・5、1・4・7、1・5・9、2・3・4、2・4・6、2・5・8、3・4・5

  3・5・7、3・6・9、4・5・6、4・6・8、5・6・7、5・7・9、6・7・8、7・8・9

④ 3つの数字の和が等しく、2乗和も等しい例

  3^2+3^2+0^2=1^2+1^2+4^2、2^2+2^2+5^2=1^2+4^2+4^2、0^2+4^2+5^2=6^2+2^2+1^2、

    5^2+5^2+2^2=3^2+3^2+6^2、1^2+5^2+6^2=7^2+3^2+2^2、0^2+6^2+6^2=8^2+2^2+2^2、

    0^2+5^2+7^2=8^2+3^2+1^2、6^2+6^2+3^2=4^2+4^2+7^2、0^2+5^2+8^2=9^2+2^2+2^2、

    7^2+6^2+2^2=3^2+4^2+8^2、0^2+7^2+7^2=9^2+4^2+1^2、7^2+7^2+1^2=3^2+3^2+9^2、

  1^2+6^2+8^2=2^2+4^2+9^2、8^2+5^2+5^2=7^2+7^2+4^2、3^2+7^2+8^2=4^2+5^2+9^2、

   8^2+8^2+5^2=6^2+6^2+9^2

③と④の例を組み合わせて、新しい式を作りました。

                  上 (左辺)  下 (右辺)

   1 2 3 7 8 9   十万の位: 1・6・8 と 2・4・9

   6 2 7 8 5 4   万の位  : 2・2・5 と 1・4・4

   8 5 8 9 5 2   千の位  : 3・7・8 と 4・5・9

   2 1 4 7 7 8   百の位  : 7・8・9 と 7・8・9

   4 4 5 8 7 6   十の位  : 8・5・5 と 7・7・4

   9 4 9 9 4 1   一の位  : 9・4・2 と 8・6・1

 すなわち、次の式ができます。

   123789^2+ 627854^2+ 858952^2= 214778^2+ 445876^2+ 949941^2

 また、数値を逆にしても式が成立します。

   987321^2+ 458726^2+ 259858^2= 877412^2+ 678544^2+ 149949^2

 桁数がもっと多くても式が作れます。

  123456789^2+ 572347235^2+ 637892674^2
                            = 756783453^2 +361238347^2+ 215674898^2

  987654321^2+ 532743275^2+ 476298736^2
                            = 354387657^2 +743832163^2+ 898476512^2

#ネット検索すると、様々な国の言葉で「奇妙な数」の式を紹介していますが、

 987321^2+458726^2+・・・のように、数値を逆にしても式が成立することに

 言及したサイトは見つけられませんでした。
 
 

 戻る