터틀 그래픽스(Turtle Graphics)

Copyright (c) 2015-, All Rights Reserved by Kwanghoon Choi


(아래 자바 프로그래밍 강의 교재의 내용을 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.

  1. 개요

터틀 그래픽스는 컴퓨터 그래픽스 프로그래밍의 한가지 방법이다. 2차원 평면상에 터틀(turtle)이라 부르는 방법을 통해 그림을 그린다. 자세한 소개는 아래 웹 사이트를 참고한다.

터틀은 세가지 속성을 가지고 있다. 터틀의 위치(x,y좌표), 터틀이 바라보는 방향(degree 각도), 그림 그리기를 위한 펜의 속성(그리기 모드, 색깔 등)이 있다. 터틀에게 명령을 내려 이 속성을 변경함으로써 그림을 그린다. 가능한 터틀 명령어는 Forward, Backward, Left Turn, Right Turn, Pen Up, Pen Down 등이 있다.

예를 들어, 터틀 그래픽스에서 정사각형을 그리는 방법은 터틀을 만들어 다음과 같은 명령어를 실행하는 것이다.

  • Pen Down
  • Forward 100
  • Left Turn 90
  • Forward 100
  • Left Turn 90
  • Forward 100
  • Left Turn 90
  • Forward 100
  • Pen Down

초기 터틀이 향하는 방향을 0도로 가정하자. Forward 100 명령어로 X,Y좌표 상에서 위쪽 방향으로 현재 터틀 위치에서 100만큼 궤적을 남기면서 터틀이 이동한다. 즉, 처음 터틀의 위치에서 나중 터틀의 위치까지 길이 100에 해당하는 선을 그린다.

Left Turn 90 명령어로 터틀의 방향을 왼쪽으로 (반시계 방향으로) 90도 튼다. 따라서 X,Y좌표 상에서 X축의 음수가 놓인 쪽으로 터틀이 방향을 바꾼다.

다시 Forward 100 명령을 실행하면 정사각형의 두번째 변을 그린다.  이 과정을 두 번 더 반복하면 맨 처음 위치로 터틀이 다시 돌아오고 정사각형의 궤적을 남긴다.

 

  1. 터틀 그래픽스 클래스

터틀 그래픽스를 제공하는 클래스 TurtleGraphics를 만들고, 이 클래스를 사용하여 사각형, 오각형, 팔각형, 나무 모양을 그려보자.


public class Main extends JFrame {
   public static void main(String[] args) {
       JFrame frame = new Main();
       frame.setTitle("Turtle Graphics");
       frame.setSize(1200,720);
 
       frame.getContentPane().add(new MyPanel());
 
       frame.setVisible(true);
 }
 
 static class MyPanel extends JPanel {
       public void paintComponent(Graphics g) {
           TurtleGraphics tg = new TurtleGraphics(600,360,0,g);
 
           Rectangle.draw(tg);
           // Octagon.draw(tg);
           // Hexagon.draw(tg);
 
           // Tree.draw(tg);
       }
  }
}
package com.example.java;

public class Rectangle {
        public static void draw(TurtleGraphics tg) {
                tg.penDown();
        
                tg.forward(100);
                tg.leftTurn(90);
        
                tg.forward(100);
                tg.leftTurn(90);
        
                tg.forward(100);
                tg.leftTurn(90);
        
                tg.forward(100);
       }
}
package com.example.java;

import java.awt.Color;
import java.awt.Graphics;

public class TurtleGraphics {
        private double x; // 터틀의 위치
        private double y; 
        private double degree; // 터틀의 방향 0~360도
        private boolean penup; // true이면 이동, false이면 그리기
    
        private Graphics g;
    
        TurtleGraphics (double x, double y, double degree, Graphics g) {
                this.x = x;
                this.y = y;
                this.degree = degree;
                this.g = g;
        
                penup = true;
        }
    
        public void penUp() {
                // 이동 준비
        }
    
        public void penDown() {
                // 그리기 준비
        }

        public void forward(double steps) {
                // 현재위치와 steps만큼 이동한 다음 위치 사이에 선 그리기
                //   1) Pen Up 상태인 경우에는 선을 그리고 터틀을 이동하고,
                //   2) Pen Down 상태에는 선을 그리지 않고 이동

                // steps만큼 이동한 위치의 x,y좌표
                //   1) x + steps * sin(degree)
                //   2) y - steps * cos(degree)     
        }
    
        public void backward(double steps) {
                forward(-steps);
        }
    
        public void leftTurn(double angle) {
                // 현재 각도에서 인자로 주어진 각도를 빼기
        }
    
        public void rightTurn(double angle) {
                // 현재 각도에서 인자로 주어진 각도를 더하기
        }
    
        public double getX() { return x; }
        public double getY() { return y; }
        public double getDegree() { return degree; }
    
        public void setX(double x) { this.x = x; }
        public void setY(double y) { this.y = y; }
        public void setDegree(double degree) { this.degree = degree; }
}

[연습문제] 위의 프로그램을 완성하여 TurtleGraphics 프로젝트를 만드시오. Java 애플릿을 실행하고 사각형 그림을 확인하시오.

[연습문제] 오각형과 팔각형을 그리는 Pentagon 클래스와 Octagon 클래스를 추가하시오.

[연습문제] 터틀 그래픽스 관련 웹사이트 http://www.sonic.net/~nbs/webturtle/webturtle.cgi?file=tree를 참고하여 나무를 그리는 프로그램을 작성하시오.

package com.example.java;
public class Tree {
        public static void draw(TurtleGraphics tg) {
                tg.penDown();

                tree(tg, 6);
        }

        private static void tree(TurtleGraphics tg, int depth) {
                tg.forward(depth * 10);
                depth = depth - 1;
                if (depth > 0) {
                        double x, y, degree;

                        tg.leftTurn(45);

                        for (int i = 0; i < 3; i++) {
                                x = tg.getX();  // REMEMBER X,Y,DEGREE
                                y = tg.getY();
                                degree = tg.getDegree();

                                tree(tg, depth);

                                tg.setX(x); // GOBACK TO THE X,Y,DEGREE
                                tg.setY(y);
                                tg.setDegree(degree);

                                tg.rightTurn(45);
                        }
                }
        }
}

[연습문제] 그래픽스 프로그램을 작성하기 위해 반드시 Java 애플릿을 사용해야 하는 것은 아니다. TurtleGraphics 프로젝트에 main 메소드로 시작하는 응용프로그램 방식으로도 실행할 수 있도록 코드를 추가하시오. (힌트: Java 애플릿 클래스는 패널 클래스를 상속 받아 정의한다.)

[연습문제] 터틀 그래픽스를 사용하여 본인이 원하는 주제의 그림을 그리는 프로그램을 작성하시오.