|
フラグメントシェーダー ブーリアン演算
円を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
|
|