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에서 코딩 및 실행 테스트되었습니다.

.
.
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 :


□ 생각해 볼 문제.
- 픽셀 그래픽에서 한 점의 크기(=호의 최대 길이)와 회전수(=반복횟수).
.
.
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 ::

■ Notes
이 방식으로 그리면 원의 크기가 커져도 외곽선이 비교적 깔끔하게 유지됩니다.
기타 사항들 :
- t.home()
# 여기서는 원의 위치 결정에 중요한 역할을 합니다.
- t.seth(0)
# 거북이 머리 방향. 0도 방향.
# setheading(). 사용하기에 따라 win1.mode("logo")가 필요없을 수도.
- steps = int(circumference / step_length)
# int() 함수는 정수값으로 변환합니다. 반올림이나 반내림은 실습을 통해서!
^.^;
7. Files
.
.
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!
^.^;
.
.
'Programming > Python' 카테고리의 다른 글
| 딕셔너리 연습 - 1 (0) | 2025.09.28 |
|---|---|
| 파이썬 계산기 - 001 - Version 1.0.2 Update (0) | 2025.09.15 |
| [ L2P ] Turtle Screen, Coloring and Speed : Windmill - 001 (0) | 2025.07.28 |
| SRA (SR for Android) v1.0.9 b4. rev.193. (0) | 2025.07.22 |
| Portable Thonny IDE with py5 Download and Py5 연습 - 001 - 3D (0) | 2025.06.22 |