본문 바로가기
Programming/Python

[ L2P ] Turtle 동심원 그리기 - 001

by The Programmer 2025. 7. 31.

1. Intro.

 
circle() 내장 함수 도움 없이 동심원을 그려봅니다. 중3 수학이 약간 필요합니다. ^.^;

좀 더 쉬운 다른 방법도 있을 것.

.
.

2. Code :

 
"""
Program Name : my_r_cir
Version : 1.0.0 (b1)
Auther : James.
Date : Jul. 31, 2025
Licence : copyright(c) James.
All rights are reserved. 2025.

Contact : https://grammar.tistory.com/
:: 함수 없이 Flat coding. ^.^;
:: 이 프로그램은 동심원을 그립니다만 이 알고리즘에는 오류가 포함되어 있을 수 있습니다.
"""

import turtle
import math

win1 = turtle.Screen()
# 비율로 크기 지정 가능
# win1.setup(width=0.8, height=0.6)
# 화면 해상도의 80% × 60%
# 픽셀로 크기 지정도 가능.
win1.setup(800, 600, startx=100, starty=50)
win1.title("Hello, Turtle!")
win1.bgcolor("#eeccFF")
# 대소문자 모두 허용. 통일 권장.
t = turtle.Turtle()

# 설정값
pi = math.pi
circle_count = 6     # 동심원 수
radius_step = 10     # 반지름 증가 단위
max_seg_len = 2      # 최대 호 길이.
# 문제가 될 수 있다.


# 초기화
t.clear()
t.pu()
t.home()
t.seth(0)

for i in range(1, circle_count + 1):
    r = i * radius_step
    circumference = 2 * pi * r
    steps = math.ceil(circumference / max_seg_len)

    # 시작점 이동
    t.pu()
    t.home()
    t.fd(r)
    t.rt(90)
    t.pd()

    # 원 그리기
    for _ in range(steps):
        t.fd(circumference / steps)
        t.rt(360 / steps)

turtle.done()
.
.

 

3. Result

 
Android 폰, PyDroid 3에서 코딩 및 실행 테스트되었습니다.

[ 동심원 그리기 -001 ]

.
.

4. Notes

 
숫자 표현에 정수와 실수가 뒤섞여 있지만 숫자들 각각의 의미를 찾아보세요.

win1.update()
# 거북이 그래픽 화면 정보를 갱신합니다.
- tracer(0,0) 썼다면 필수
- final solution 코드의 용례를 참고할 것.
- 코드 사용 위치에 주목.



■ 연습 Update 1.

# 부분 코드.
# 다음 부분만 추가 및 수정

win1.setup(1200, 1200, startx=100, starty=50)
win1.title("Hello, Turtle!")
win1.bgcolor("#eeccFF")
# 대소문자 모두 허용. 통일 권장.
win1.tracer(0)
t = turtle.Turtle()
t.speed(100)

# 설정값
pi = math.pi
circle_count = 30     # 동심원 수
radius_step = 20  # 반지름 증가 단위
max_seg_len = 3    # 최대 호 길이

□ result :

[ 동심원 그리기 - 002 ]

 

[ 동심원 그리기 - 003 ]


□ 생각해 볼 문제.

- 픽셀 그래픽에서 한 점의 크기(=호의 최대 길이)와 회전수(=반복횟수).
.
.

 

5. 응용 연습

 
■  Q 1.
# 연습 과제 : 위 코드를 함수로 구조화 하세요.

■ Q 2.
FMSLogo나 Python Turtle 모듈의 비트맵 픽셀 기반 그래픽에서 폐곡선이나 닫힌 도형 판정에 소숫점, 실수 표현은 얼마나 가치가 있을까요?


■ 응용 연습 코드 일부 : 원을 그리는 다른 방식 - 1
 
(Turtle_Ex_001_Circle_003_.py)
 
import turtle
import math

# 수정된 전역 변수
RADIUS      = 300
STEPS       = 360
ANGLE       = 360 / STEPS
STEP_LENGTH = 2 * RADIUS * math.sin(math.pi / STEPS)

def create_win(title="나의 터틀 그래픽 창", width=1024, height=800, bgcolor="lightblue"):
    screen = turtle.Screen()
    screen.setup(width, height, -50, -50)
    screen.bgcolor(bgcolor)
    screen.title(title)
    screen.tracer(0, 0)
    return screen

win1 = create_win()

def setup_turtle():
    t = turtle.Turtle()
    t.speed(0)
    t.clear()
    t.penup()
    # (0,0)에서 y축 아래로 RADIUS만큼 이동 → 원의 아랫부분
    t.goto(0, -RADIUS)
    # 오른쪽(0°) 바라보게
    # goto(x, y) 형태로 좌표 x, y 위치로 이동.
    # 참고 : setpos(), srtposition()

    t.setheading(0)
    t.pendown()
    return t

def draw_circle(t):
    for _ in range(STEPS):
        t.forward(STEP_LENGTH)
        t.left(ANGLE)
    win1.update()    # tracer(0,0) 썼다면 필수

def main():
    create_win()
    t = setup_turtle()
    draw_circle(t)
    # ...
    turtle.done()

if __name__ == "__main__":
    main()

 
 
■ 결과 :
 

 

이 방식으로 동심원을 그려보세요. 뭐... 큰 일이라도 날까요? ^.^;

■ 참고 :

- t.goto(0, -RADIUS)
   # 오른쪽(0°) 바라보게
    # goto(x, y) 형태로 좌표 x, y 위치로 이동.
    # 화면 중앙의 좌표가 (0, 0). LOGO와 같다.
    # pu() 상태라면 선이 그려지지 않는다.
    # 참고 : setpos(), srtposition()

- return screen
    # turtle.Screen()으로 만든 스크린 객체 screen을 반환한다.

- return t
    # turtle.Turtle() 또는 turtle.Pen()으로 만든 거북이 객체 t를 반환한다.

# 활용법 : 위와 같은 return 값을 가지는 함수는 다음처럼 활용될 수 있다.

def goodTurtle():
    k = turtle.Turtle()
    k.shape("turtle")
    k.shapesize(5)
    pass
    pass
    pass
    return k

def main():
    t = goodTurtle()
    for i in range(4):
        t.fd(100)
        t.rt(90)
    turtle.done()

main()


■ 반환값을 이용한 거북이 생성 및 할당

- t = goodTurtle()    
# goodTurtle()로 거북이 k 가 생성됨
# 거북이 객체 k를 변수 t에 할당.
# t는 결국 거북이 객체 변수가 된다.
# 결국 거북이 객체 k가 거북이 객체 t가 된다.
# 무엇이 다른가?
# 이미 거북이 모양과 크기를 가지고 있다.


6. Final Solution


이 프로그램은 위 여러 코드 샘플들을 참고하여 새롭게 동심원을 그립니다. 사용된 모든 표현들은 최대한 모범적인 방식을 따르려고  하였습니다.

물론 좀 더 간단하고 명료한 다른 코딩 방식도 있을 것입니다.

"""
Program Name : myRCircle
Version : 1.0.4.
Auther : James.
Date : Aug. 04, 2025
Licence : copyright(C) James.
All rights are reserved. 2025.
https://grammar.tistory.com/

Notes : 이 프로그램은 동심원을 그립니다.
"""


import turtle
import math

win1 = turtle.Screen()
# 비율로 크기 지정 가능
# win1.setup(width=0.8, height=0.6)
# 화면 해상도의 80% × 60%
# 픽셀로 크기 지정도 가능.

win1.setup(1200, 1200, startx=100, starty=50)
win1.title("Hello, Turtle!")
win1.mode("logo")
# LOGO 처럼 북쪽으로 시작.
win1.bgcolor("#eeddFF")
# 대소문자 모두 허용. 통일 권장.
win1.tracer(0)    
# 그리기 속도 개선

t = turtle.Turtle()
t.shape("turtle")
t.shapesize(5)
t.speed(0)    
# 그리기 속도 개선

#필요한 변수 설정값
pi = math.pi
r = 100

def setup():
   
 # 초기화
    t.clear()
    t.pu()
    t.home()
    
t.seth(0)    
# 거북이 머리 방향. 0도 방향.
    t.pd()

def set_position():
    t.pu()
    
t.home()    
# 지금은 좀 중요해진 home.
    t.lt(90)
    t.fd(r)
    t.rt(90)
    t.pd()
    
# pass

def set_position2():
    t.pu()
    
# t.home()
    t.lt(90)
    t.fd(r/2)    
# 적당한 자리 잡기
    t.rt(90)
    t.pd()
    
# pass

def draw_circle(radius):
  
  # 선분 길이를 기준으로 steps 계산
    # 핵심 코드.

    
step_length = 1
    
# 원하는 부드러움에 따라 조절
    global r
    r = radius
    circumference = 2 * math.pi * radius
    steps = int(circumference / step_length)
    angle = 360 / steps
    
    set_position()
    
    for _ in range(steps):
        t.forward(step_length)
        t.rt(angle)

        
    # set_position() 상황에 따라 위치 결정.

def draw():
    draw_circle(100)
    draw_circle(200)
    draw_circle(300)
    
# 반지름 300짜리 원
    
set_position2()
    
# t.ht()   거북이 숨기기가 필요할 때.
    
win1.update()    # 결과 화면 정보 갱신
    
turtle.done()

def main():
    setup()
    draw()

main()


■ result ::

[ my_r_cir_v1_0_4_ ]



Notes

이 방식으로 그리면 원의 크기가 커져도 외곽선이 비교적 깔끔하게 유지됩니다.

기타 사항들 :

- t.home()
# 여기서는 원의 위치 결정에 중요한 역할을 합니다.

- t.seth(0)    
# 거북이 머리 방향. 0도 방향.
# setheading(). 사용하기에 따라 win1.mode("logo")가 필요없을 수도.

- steps = int(circumference / step_length)
# int() 함수는 정수값으로 변환합니다. 반올림이나 반내림은 실습을 통해서!
^.^;

 

7. Files

circle_ex_001_.py
0.00MB
circle_ex_002_.py
0.00MB
Turtle_Ex_001_Circle_003_.py
0.00MB
my_r_cir_v1_0_4_.py
0.00MB

.
.

8. References

 
1) Python 내장 turtle 모듈 도움말
2) 김영탁, [ 컴퓨팅 사고와 파이썬 프로그래밍 ] 홍릉.
3) 우재남, [ 파이썬 for Beginner ] 한빛.
4) 강환수, 신용현, [ Python으로 배우는  누구나 코딩 ] 홍릉.
5) 천인국, [ 파이썬 Express ] 생능.
6) Mark Lutz, [ Programming Python ] 4th.
7) Mark Lutz, [ Learning Python ] 5th.


Happy Programming!
^.^;
.
.