본문 바로가기
Programming/LOGO

LOGO : 변수(Variables) - 12 - ColorBox256

by The Programmer 2024. 5. 19.

1. Introduction

 

이번 시간에는 예제 10번에서 살펴본 방법을 응용하여 랜덤 색상으로 컬러박스 256개를 그려보겠습니다. 먼저 예제 10번을 완전하게 소화할 필요가 있습니다.
 
최종 결과 화면부터 보겠습니다. setup 함수에 있는 변수값만 고쳐서 다른 결과를 보여주는 가변형입니다.
 

[ 그림 12-0. 가변형 컬러박스256 ]

 
◈ setup 함수 내 옵션값

make "side1 25       ;; 컬러박스 한 변의 크기.
make "margin1 5    ;; 박스 간격.
make "num 21         ;; 한 줄에 표시할 컬러박스의 수.
 
( 변수값을 마음대로 바꿀 경우, moveIn, moveOut 함수의 구현 방법 때문에 약간의 버그가 있을 수 있습니다. ^.^; 
엉뚱한 곳에 색칠하기!!!)
 

주요 알고리즘을 요약하면 다음과 같습니다.

1) SetLineColor1, 2 함수들을 수정해서 SetFillColor1, 2 함수로 만들고 선 대신 면에 색을 칠합니다.
2) 색상은 랜덤 색상을 골라서 적용하고, 색상을 선택하는 랜덤 색상 선택 방법은 이전과 '거의' 동일합니다.
3) 선이 아니라 도형의 면에 색을 칠해야 하기 때문에 MoveIn 함수와 MoveOut 함수가 추가되고,
4) 실제로 도형의 면에 색상을 칠할 때에는 Fill 함수가 반드시 사용되어야 합니다.
5) 이전 10번 예제에서는 120개 컬러박스를 그렸으나 이번에는 컬러박스의 수를 256개로 늘립니다.
 
먼저 좀 더 쉬운 기초 예제를 작성해보고 그 후에 좀 더 복잡한 본 예제 코드를 만들어보겠습니다.
 


2. 연습 코드 -1

 
;; 사전 준비를 하기 위한 예제 코드입니다.
;; 이 코드는 256개의 모노박스(=흑백상자)를 그리는 방법을 보여줍니다.
;; repCount 특별 변수를 매우 잘 활용하고 있습니다. 이 방법을 반드시 알아두셔야 합니다.
 
to box1 :side1
    repeat 4 [ fd :side1 rt 90 ]
end

to box256 :num    ;; num = 한 줄에 표시할 박스의 수. setup 함수에서 값을 결정.
    repeat 256 [ 
        box1 :side1 move1
        print repCount   ;; Check repCount Number
        if ((modulo repCount :num) = 0) [
            gotoNextLine
        ]
    ]
end

to draw
    box256 :num
    ht
end

to gotoNextLine
    pu
        lt 90 fd ((:side1 + :margin1) * :num)     ;; CR. 왼쪽 맨 앞으로. (Carrage Return)
        lt 90 fd (:side1 + :margin1) lt 180    ;; LF. 다음 줄로 한 줄 바꾸기. (Line Feed)
    pd
end

to gotoStartingPosition
    pu
        lt 90 fd 300 rt 90 fd 200    ;; 대략, Left Top.
    pd
end

to main
    setup
    draw
end

to move1
    pu
        rt 90 fd (:side1 + :margin1) lt 90
    pd
end

to setup
    Window Home CS PPT PD ST
    gotoStartingPosition
    make "side1 20
    make "margin1 5
    make "num 16
end
 
 
;; ^.^;
 


3. 연습 코드 - 1 결과

 
;; 예비 코드 결과.
;; setup 함수에 있는 :num 변수 값 하나만 수정해서 한 줄에 표시할 박스의 갯수를 쉽게 변경할 수 있습니다.
 

[ 그림 12-1. monoBox120 ]

 
(tbc... )
 
 

4. 연습 코드 - 2

 
;; monoBox 안에 별 집어넣기.
 
to box1 :side1
    repeat 4 [ fd :side1 rt 90 ]
end

to box256 :num    
;; num = 한 줄에 표시할 박스의 수. setup 함수에서 값을 결정.
    repeat 256 [ 
        box1 :side1 
        moveIn rt 90 star1 :side2 lt 90 moveOut   
;; 수정판 핵심 코드 부분.
        move1
        print repCount   ;; Check repCount Number
        if ((modulo repCount :num) = 0) [
            gotoNextLine
        ]
    ]
end

to draw
    box256 :num
    ht
end

to gotoNextLine
    pu
        lt 90 fd ((:side1 + :margin1) * :num)    
;; CR. 왼쪽 맨 앞으로. (Carrage Return)
        lt 90 fd (:side1 + :margin1) lt 180     
 ;; LF. 다음 줄로 한 줄 바꾸기. (Line Feed)
    pd
end

to gotoStartingPosition
    pu
        lt 90 fd 450 rt 90 fd 330    
;; 대략, Left Top. 위치 약간 조정.
    pd
end

to main
    setup
    draw
end

to move1
    pu
        rt 90 fd (:side1 + :margin1) lt 90
    pd
end

to moveIn   
;; 상자 안으로 들어가기 
    pu
        rt :myAngle1 fd (:side2+10) lt :myAngle1
    pd
end

to moveOut   
;; 상자 밖으로 나오기
    pu
        rt :myAngle1 back (:side2+10) lt :myAngle1
    pd
end

to setup
    Window Home CS PPT PD ST
    gotoStartingPosition
    make "side1 40
    make "margin1 5
    make "num 16
    make "side2 13
    make "myAngle1 7
end

to star1 :side2
    repeat 5 [ fd :side2 lt 72 fd :side2 rt 144 ]
end

 
 
(tbc... )
 

5. 연습 코드 - 2 결과

 

[ 그림 12-2. StarInABox ]

 
 

6. Code

 
그럼 이제 면에다 색상을 칠해보겠습니다. 방법은 별이 추가된 부분에 별을 제외하고 컬러링 함수를 추가하고 Fill도 함께 추가해주면 될 듯합니다. 컬러링 함수는 이전 10번 예제에서 사용하던 것을 약간만 고쳐서 사용합니다. 선색을 결정하는 setPenColor 함수 (= setPC 함수)를 면색을 결정하는 setFloodColor 함수(= setFC 함수)로 바꿉니다. random 255 부분은 random 256으로 수정했습니다. (참고: Flood는 '홍수', '범람', '바다'를 뜻하기도 합니다. '바다'같이 넓은 <면>....으로 이해할 수 있겠습니다.
 
to setBoxColor1
    make "cR random 256
    make "cG random 256
    make "cB random 256
    make "myList (List :cR :cG :cB)
    setFC :myList
end
 
이제 이 함수를 별이 그려진 위치에 별 대신 끼워넣고 색상을 정했으니 Fill 함수를 추가해서 실제로 면에 색상을 칠합니다.
 
to box256 :num    ;; num = 한 줄에 표시할 박스의 수. setup 함수에서 값을 결정.
    repeat 256 [ 
        box1 :side1 
        moveIn rt 90 
setBoxColor1
Fill lt 90 moveOut    ;; 수정판 핵심 코드 부분.
        ;; 여기서 rt 90과 lt 90은 별 그리기 때문에 추가된 것이어서 별이 없으면 이것들도 없어도 됩니다만.
        move1
        print repCount   ;; Check repCount Number
        if (
(modulo repCount :num) = 0) [

            gotoNextLine
        ]
    ]
end

 
 
◈ 전체 코드는 다음과 같습니다.
 
to box1 :side1
    repeat 4 [ fd :side1 rt 90 ]
end

to box256 :num    ;; num = 한 줄에 표시할 박스의 수. setup 함수에서 값을 결정.
    repeat 256 [ 
        box1 :side1 
        moveIn rt 90 setBoxColor1 Fill lt 90 moveOut    ;; 수정판 핵심 코드 부분.

        ;; 별 그리기 때문에 추가된 rt 90과 lt 90을 참고용으로 그대로 남겨둠. 영향이 거의 없음. ^.^;
        move1
        print repCount   ;; Check repCount Number
        if ((modulo repCount :num) = 0) [
            gotoNextLine
        ]
    ]
end

to draw
    box256 :num
    ht
end

to gotoNextLine
    pu
        lt 90 fd ((:side1 + :margin1) * :num)    ;; CR. 왼쪽 맨 앞으로. (Carrage Return)
        lt 90 fd (:side1 + :margin1) lt 180      ;; LF. 다음 줄로 한 줄 바꾸기. (Line Feed)
    pd
end

to gotoStartingPosition
    pu
        lt 90 fd 450 rt 90 fd 330    ;; 대략, Left Top.
    pd
end

to main
    setup
    draw
end

to move1
    pu
        rt 90 fd (:side1 + :margin1) lt 90
    pd
end

to moveIn    ;; 상자 안으로 들어가기, 쉬운 다른 방법도 많을 것이라고 생각됩니다.  
    pu
        rt :myAngle1 fd (:side2+10) lt :myAngle1
    pd
end

to moveOut    ;; 상자 밖으로 나오기, 쉬운 다른 방법도 많을 것이라고 생각됩니다.  
    pu
        rt :myAngle1 back (:side2+10) lt :myAngle1
    pd
end

to setBoxColor1
    make "cR random 256
    make "cG random 256
    make "cB random 256
    make "myList (List :cR :cG :cB)
    setFC :myList
end

to setup
    Window Home CS PPT PD ST
    gotoStartingPosition
    make "side1 40
    make "margin1 5
    make "num 16
    make "side2 13
    make "myAngle1 7
end

to star1 :side2
    repeat 5 [ fd :side2 lt 72 fd :side2 rt 144 ]
end


 

7. Result

최종 전체 코드 결과 화면입니다.
 

[ 그림 12-3. ColorBox256 Final ]

 
(tbc... )
 
 

8. Notes

 
star1 함수는 여기서는 사용하지 않아서 불필요하지만, 참고용으로 그대로 남겨둡니다. 사용된 기법은 대략 다음과 같습니다.
 
1) 변수 만들기, 변수 사용하기
2) 파라미터 변수 만들기, 사용하기
3) 도형 내부로 이동, 외부로 이동
4) 색상값 이해하기
5) 색상 선택과 칠하기
6) 랜덤값 이해하기
7) 랜덤 색상 선택과 랜덤 색상 칠하기
8) 리스트 만들기
9) 리스트 변수 만들기
10) 리스트 변수 사용하기
11) 나머지 연산(Modulo 연산)
12) if 문 사용법
13) FMSLogo Set 메뉴 이해하기
14) PicPick v7.2.8에서 색상값 알아내기
 
이제 이 주제들을 하나씩 하나씩 차근차근 살펴볼까요? ^.^;
 
(tbc... )
 
 

9. Extended Ex - 1

 
응용 연습 과제로 박스와 별 모두를 살려두고 각각 서로 다른 랜덤 색상으로 칠해보세요. ^.^;
(tbc... )
 
 

10. Files

예제 코드 1, 2, 3 전부해서 3개의 파일로 올려둡니다.

Ch_03_Variable_Ex_013_colorBox160_v1_.lgo
0.00MB
Ch_03_Variable_Ex_013_colorBox160_v2_.lgo
0.00MB
Ch_03_Variable_Ex_013_colorBox256_v3_.lgo
0.00MB

 
 

11. References

 
1) FMSLogo v8.3.2 공식 도움말. FMSLogo / Menu / Help / Index

2) Harold Abelson, Andrea A. diSessa, [ Tutle Geometry ], 1980. The MIT Press.

 
 
Happy Programming!
^.^;