|
!日常に潜む問題。
!加法・減法混色の、色見本を作るとき、
!半径1の原色円3個、互いの距離を、2重部分が最大面積になるようにしたい。
!
SET WINDOW 0,6,0,3
!
FOR mr=0 TO 2 STEP .01 !半径1の円3個、中心間距離は、mr
LET w=calc(mr)
PRINT USING "mr=#.## 2重部面積=#.##### 3重部面積=#.#####": mr,w,s33
IF bak< w THEN
LET bak=w
LET bak3=s33
LET peak=mr
END IF
CALL disp3
DO
WAIT DELAY 0
mouse poll mx,my,mlb,mrb
IF mrb=1 THEN STOP
IF s33<=1e-4 THEN EXIT FOR
LOOP UNTIL mlb=0
NEXT mr
PRINT "3重部 消失 停止。"
PRINT "2重部 最大値"
LET mr=peak
PRINT USING "mr=#.## 2重部面積=#.##### 3重部面積=#.#####": mr,bak,bak3
CALL disp3
FUNCTION calc(mr)
LET s1= PI !円1個、面積
LET a2= ACOS(mr/2) !円2個、重なる範囲の扇形、頂角の半角
LET s2= a2/PI*s1 !円2個、重なる範囲の扇形、面積
LET s22= 2*s2-mr*SIN(a2) !円2個、2重範囲の面積
LET s3= (a2+PI/6)/PI*s1 !円3個、重なる範囲の扇形、1個の面積
LET s6= mr^2*SQR(3)/4+3*mr*SIN(a2)/2 !円中心3個と外側交点3個での6角形面積
LET s33=3*s22-(3*s3-s6) !円3個、3重範囲の面積
LET calc=3*(s22-s33) !円3個、2重範囲3個の面積
END FUNCTION
SUB disp3
SET DRAW mode hidden
!-----加法混色
SET VIEWPORT 0,1,0/2,1/2 !下側半分
CALL BG_color(1) !黒地
!---
SET DRAW MODE MERGE !加法混色
CALL ctest
!-----減法混色
SET VIEWPORT 0,1,1/2,2/2 !上側半分
CALL BG_color(0) !白地
!---
SET DRAW MODE MASK !減法混色
CALL ctest
SET DRAW mode explicit
END SUB
SUB BG_color(c)
SET DRAW MODE OVERWRITE
SET AREA COLOR c
PLOT AREA:0,0; 6,0; 6,3; 0,3
END SUB
SUB ctest
SET AREA COLOR 2 !blue B
DRAW disk WITH SHIFT(1,1)
SET AREA COLOR 3 !green G
DRAW disk WITH SHIFT(1+mr,1)
SET AREA COLOR 4 !red R
DRAW disk WITH SHIFT(1+mr/2,1+mr*SQR(3)/2)
!---
SET AREA COLOR 5 !cyan W-R
DRAW disk WITH SHIFT(4,1)
SET AREA COLOR 6 !yellow W-B
DRAW disk WITH SHIFT(4+mr,1)
SET AREA COLOR 7 !magenta W-G
DRAW disk WITH SHIFT(4+mr/2,1+mr*SQR(3)/2)
END SUB
END
|
|