1. Introduction
이번 예제에서는 변수를 활용해서 별을 화면에 가득 그릴 때 필요한 별의 수직 높이를 계산하는 방법에 대해서 살펴보겠습니다. 이 예제는 이전 변수 예제 7번을 선수 학습해야만 합니다.
( 어제 오늘 조금 힘든 날입니다. 글을 쓰다가 약간 졸아서 뭔가 잘못되었을 수도 있습니다. 일단은 업, 추후 수정하겠습니다. ^.^; )
주어진 문제를 너무 서둘러서 해결하려고 하지 말고, 충분한 시간을 갖고 차분하게 문제를 대하세요. 그래야만 더 나은 해결책을 찾을 수 있습니다. 이번 예제에 대한 코드는 도형만으로 해법solution에 대해서 충분하게 생각해 본 다음에 올려놓도록 하겠습니다.
별 그리기에서 별 12개 정도를 한 화면에 한 줄로 표현하고 이어서 줄을 바꾸어 다음 줄에도 같은 방식으로 별 12개... 이와 같은 방식으로 한 화면에 최대한 가득 채워봅니다.
별들은 각각 간격이 일정해야 하고, 별들은 서로 분리되어 있어야 하며, 겹쳐서는 안됩니다. 별들은 또한 줄이 맞아야 합니다. 가로와 세로 모두.
이 때 별의 수직 간격 문제를 수학적으로 엄밀하게 따지는 것은 초등 수학의 범위를 넘어서는 일이긴 합니다만. 일단은 필요한 대로 해법solution을 생각해 보겠습니다. 초등 수학만으로 해결할 수 있는지에 대해서는 추후 생각해보도록 합니다.
2. Code
비워두기 뭐해서 별 한 개 그리기 코드를 대신 올려둡니다.
to main
setup
star1
ht
end
to setup
make "side 200
make "goLeft 300
window home cs ppt pd st
pu lt 90 fd :goLeft rt 90 fd 100 pd
rt 90
end
to star1
repeat 5 [ fd :side lt 72 fd :side rt 144 ]
end
;; 업데이트 코드는 추후.
(tbc...)
3. Notes
1) 먼저, 그림으로 별의 높이에 대해서 생각해보겠습니다. FMSLogo로 그린 별입니다. 이후, Logo에서 bmp 파일로 저장하는 기능을 이용해서 bmp 그림 파일로 저장하고 이 그림 파일을 '픽픽(PicPick)' 그림 편집 프로그램에 불러와서 약간의 도형과 설명을 추가했습니다. 용도에 따라 별의 높이 부분을 다음 그림처럼 2 개의 높이로 나누어 생각해 볼 수 있습니다.
2) 별의 어깨 높이(i)를 고려하는 것은 별 하나를 다 그리고 나면 별 그리기 시작 위치에 돌아오는데 수직으로 이동할 때는 여기서부터 아래로 내려가야 하므로 어깨 높이를 알고 있는 것이 도움이 될 듯합니다. 별의 높이(h)에서 뭔가(?)를 빼면 i가 될 듯하네요. i만 별도로 계산해도 되겠지만 시간 낭비가 아닐까 생각합니다. 다음 그림에서는 k로 이름을 바꾸었습니다. k의 쓸모에 대해서는 나중에 생각해보기로 합니다. ^.^;
3) 이전 변수 예제 7번에서 w의 크기는 이미 구한 적이 있으니 그 방법을 참고하세요.
4) 삼각형 TUV에서 각 a를 기준으로 사인sin 값을 구하면 높이(h)를 구할 수 있습니다. 이때, 각 a의 크기는 미리 알고 있어야 합니다만.
5) 삼각형 A와 B는 서로 마주보고 있는 같은 크기의 삼각형들입니다. 각 a와 b는 서로 크기가 같습니다. 각 c는 이미 알고 있고(? 정말 알고 있나요? ^.^;) c를 알고 있다면 a와 b도 알아낼 수 있습니다. 180 - c의 결과값을 반으로 나누면 a가 되고, b는 a와 같으니.
6) 별의 날개 한 개를 세로로 확대하면 삼각형 A와 B를 합친 도형과 같은 형태의 도형이 됩니다. 내부의 각들은 각각 서로 닮았습니다.
7) 작은 핑크색 삼각형과 큰 핑크색 삼각형은 서로 닮았습니다. 내부의 세 각들도 모두 닮았습니다.
8) 이제 이러한 특징들을 이용해서 별의 높이(h)와 별의 어깨 높이(k)를 알아내 보겠습니다.
사인sin a는 빗변XY의 길이를 기준으로 YZ의 길이를 계산합니다. 기준이 되는 변이 분모가 되고 구하고자 하는 높이가 분자가 되는 분수식을 만들 수 있습니다. 대략 다음과 비슷합니다. ( 참고. 일반 수학에서는 분모를 먼저 씁니다. 16분의 1을 분수로 표현할 때, 아래쪽에 16을 먼저 쓰고 1을 위쪽에 나중에 씁니다. 보통은. ^.^; 읽을 때도 아래쪽 분모부터 읽습니다. 일반적으로 컴퓨터에서 평범한 서술로 왼쪽부터 오른쪽으로 이어서 쓸 때는 분자부터 왼쪽에 쓰고 나누기를 뜻하는 슬래시(/) 기호를 쓰고 분모를 제일 나중에 씁니다. a = 1 / 16 )
sin(a) = YZ/XY
빗변은 보통 r로 표기하고 높이는 보통 h로 표기합니다. 그래서 위 식은 다음과 같이 써도 무방할 듯합니다.
sin(a) = h/r
분수식에서 h가 위에 올라가는 분자이고 r이 아래에 내려오는 분모입니다. 다음과 같은 뜻입니다.
sin(a) = h ÷ r
여기서 sin(a)는 일반적인 표기법입니다. FMSLogo에서는 sin a라고 표기해야 합니다. 두 방식을 비교해보세요.
sin(72)
sin 72
두 번째 방식이 FMSLogo 방식입니다.
각 a의 크기를 알고 있다고 가정하고 사인 a의 값은 FMSLogo가 대신 알아냅니다. FMSLogo의 명령어 입력창(혹은 입력칸)에 다음처럼 입력하고 엔터키를 치면됩니다.
sin a(엔터)
a 자리에는 각 a의 크기 숫자가 실제로 입력되어야 합니다. 예를 들자면,
sin 72(엔터)
처럼.
이렇게 하면 sin a의 값이 자동으로 계산됩니다. 이 값을 v1에 저장합니다.
v1 = h / r
v1 값은 컴퓨터로부터 주어지고 r값은 지난 예제에서 찾을 수 있고, 그럼 혼자서도 계산할 수 있습니다.
4. Ref.
1) 중학 수학 3학년 참고서
2)
(tbc...)
5. Files.
(tbc...)
여러가지 해법이 있어도, 지금 우리에게는 좀 더 쉽고 간결한 답이 정답입니다.
당분간은! ^.^;
Happy Programming!
^.^;
'Programming > LOGO' 카테고리의 다른 글
LOGO : 변수(Variables) - 10 - ColorBox 120 (0) | 2024.04.28 |
---|---|
LOGO : 변수(Variables) - 9, Coloring (1) (0) | 2024.04.26 |
LOGO : 변수(Variables) - 7 (0) | 2024.04.14 |
LOGO 변수(Variables) - 6 (0) | 2024.03.25 |
LOGO : 변수(Variables) - 5 (0) | 2024.03.17 |