OpenGL을 이용한 Polyspirals 그리기

육각형

60도씩 돌고, 이동거리는 100에서 1씩 감소함.

tumblr_inline_n4bcu6gf7j1rubmdv.jpg

바람개비

89.5도씩 돌고, 이동거리는 200에서 1씩 감소함.

tumblr_inline_n4bcupWF5D1rubmdv.jpg

-144도씩 돌고, 이동거리는 200에서 2씩 감소함.

tumblr_inline_n4bcuxO78x1rubmdv.jpg

성게

170도씩 돌고, 이동거리는 200에서 2씩 감소함.

tumblr_inline_n4bcv50bOw1rubmdv.jpg

오리

179도씩 돌고, 이동거리는 200에서 1씩 감소함.

tumblr_inline_n4bcvbroMP1rubmdv.jpg

장미

100도씩 돌고, 이동거리는 200에서 4씩 감소함.

tumblr_inline_n4bcviNKfg1rubmdv.jpg
Share Comments

OpenGL을 이용한 지형 그리기

내용설명

  1. 노을진 밤하늘을 표현하기 위해 화면 크기로 폴리곤을 쉐이드 모드로 그린다.
  2. 랜덤한 좌표에 점을 찍어 별을 그린다.
  3. 두 개의 원을 이용해 그 사이를 폴리곤으로 채워 달을 그린다.
  4. 프랙탈을 이용해 재귀적으로 지형의 좌표를 구하고 내부를 폴리곤으로 채운다.

출력화면

tumblr_inline_n4bcnlqnL41rubmdv.jpg tumblr_inline_n4bcnqnCqL1rubmdv.jpg tumblr_inline_n4bcnzIbfR1rubmdv.jpg tumblr_inline_n4bco6y63P1rubmdv.jpg
Share Comments

OpenGL을 이용한 학교 로고 그리기

내용 설명

  1. 왼쪽 반원을 그리고 그 위에 중점을 오른쪽으로 조금 옮겨 반지름을 조금 늘려 흰색 반원을 덮어 남색 초승달 모양을 만든다.
  2. 1번과 대칭되게(중점을 왼쪽으로 옮겨) 오른쪽 하늘색 초승달 모양을 만든다.
  3. 0,0을 중점으로 대칭되게 하늘색, 남색 반원을 그린다.
  4. 0,0을 중심으로 동일한 너비와 높이의 직각 삼각형을 로고에 맞는 색상으로 그린다.

출력 화면

tumblr_inline_n48igvuacR1rubmdv.jpg tumblr_inline_n48ihcjtQV1rubmdv.jpg tumblr_inline_n48ihvMSAY1rubmdv.jpg tumblr_inline_n48ii4wUgk1rubmdv.jpg tumblr_inline_n48iiiuBwt1rubmdv.jpg tumblr_inline_n48ij3r4Gq1rubmdv.jpg tumblr_inline_n48ijc2bdG1rubmdv.jpg tumblr_inline_n48ijnWCsW1rubmdv.jpg
Share Comments

OpenGL을 이용한 이름 쓰기

내용 설명

  1. 각 획은 직선을 그려서 표현한다.
  2. 동그라미는 원을 그려서 표현한다.

출력화면

tumblr_inline_n48hugpNo31rubmdv.jpg tumblr_inline_n48hunmRoJ1rubmdv.jpg tumblr_inline_n48hv2C18g1rubmdv.jpg
Share Comments

Baby Hoola

프로그램 구조

클래스 다이어그램

Card 클래스

게임에서 사용되는 카드를 클래스로 만든 것이다. 카드의 숫자는 A~K까지이고, 무늬는 4가지로 불변의 값이기 때문에 타입에 안전한 enum 키워드를 이용하여 속성값을 정의하였다. 그리고 적절하지 않을지 모르겠지만 GUI 구현시 데이터와 화면표시가 따로 노는 것을 방지하기 위해 JButton 클래스를 상속하여 실제 카드의 데이터와 화면에 보이는 버튼이 한 몸이 되도록 하였다. Player 클래스에서 카드를 순서대로 정렬하기 위해 Comparable 인터페이스를 구현하였다.

Deck 클래스

52장의 카드 한 벌을 Deck 이라고 한다. 초기엔 카드를 저장하기 위해 Stack 클래스를 사용하여 구현하였다. 하지만 API 문서에서 Deque 인터페이스를 활용하는 것을 권장하기에 이를 따르기로 했다. 이 클래스의 기능 중에 카드를 섞는 shuffle 메소드를 손쉽게 구현하기 위해 Collections 클래스의 shuffle 메소드를 이용하였고 이 메소드는 인자로 List 인터페이스를 구현한 객체를 필요로 하기 때문에 Deque와 List를 둘다 구현하고 있는 LinkedList 클래스를 사용하였다.

Player 클래스

게임에서 유저나 컴퓨터와 같은 플레이어를 정의한 클래스이다. 컴퓨터와 유저의 공통적인 특성들을 모아놓았고 거의 대부분이 구현되어 있다. abstract 키워드로 하위 클래스에서 객체를 생성하도록 유도하였다. Sort 기능도 Collections 클래스의 Sort 메소드를 이용해 손쉽게 구현하였다.

HumanPlayer 클래스

유저를 정의하는 클래스이다. 생성자 파라미터로 유저의 이름을 넣을 수 있고 버릴 카드를 직접 선택할 수 있다.

ComputerPlayer 클래스

게임상의 컴퓨터를 정의하는 클래스이다. 유저와는 반대로 이름과 버릴 카드를 선택할 수 없다.

UserInterface 인터페이스

UI를 쉽게 변경할 수 있도록 인터페이스를 정의하였다. 나중에 프로그램을 확장해 자신만의 UI를 만들더라도 쉽게 만들 수 있을 것이다.

BabyHoolaConsole 클래스

위의 클래스들을 이용해 Console 환경으로 구현하였다. GUI 환경을 만들기 전에 테스트 용도로 만들었고 UserInterface 인터페이스를 구현해 UI를 손쉽게 바꿀수 있도록 하였다.

BabyHoolaGUI 클래스

위의 클래스들을 이용해 GUI 환경으로 구현하였다. 보드 게임의 형식을 갖추고 직관적인 인터페이스를 유지하려고 노력하였다. UserInterface 인터페이스를 구현하였다.

프로그램 실행환경

  • 펜티엄4 2.4Ghz, 메모리 1G
  • 윈도우즈 XP, JRE 1.6

결과화면

콘솔 환경
콘솔 환경

이름 입력
이름 입력

초기 화면
초기 화면

게임 도중
게임 도중

승리시 화면
게임 도중

Share Comments

단일 패스 매크로 프로세서

과제 목표

단일 패스 매크로 프로세서를 구현

프로그램 설명

텍스트 파일을 입력으로 받아 매크로 구문을 해석 후 확장된 코드로 변환시켜주는 단일 패스 매크로 프로세서를 자바로 구현함.

입력 텍스트

L
MACRO
ADD1    &A
L    &A
A    &A
ST    &A
MEND
L
MACRO
ADDS    &A1, &A2, &A3
ADD1    &A1
ADD1    &A2
ADD1    &A3
MEND
ADDS    DATA1, DATA2, DATA3
END

출력 결과물

tumblr_inline_n46lb0lYSf1rubmdv.jpg
Share Comments

java로 작성한 도서관리 프로그램

프로그램 주제

자바를 이용한 통합 도서관리 프로그램

개발목적

도서관 관리자에게 관리를 더욱 효율적이고 용이하게 할 수 있도록 도움을 줌.

특징

  • 그래픽 인터페이스를 최대한 직관적이고 쉽도록 구성하였고, 관리자가 실시간으로 모니터링 할 수 있도록 구성하였음.
  • 데이터의 저장과 열기시 파일을 선택할 수 있어 한 프로그램으로 여러 도서관을 관리할 수 있음.
  • 도서 예약 기능을 추가하여 선택한 도서가 이미 대여시 예약이 가능. 반납시 자동으로 대출가능.

개발환경

  • Pentium4 2GHz, 1GB RAM, WINDOWS XP
  • J2SE SDK 5.0, Eclipse 3.2

프로그램 설명

프로그램 구동시 초기화면

좌측 상단의 패널에서 학번, 성명, 연락처 등을 입력후 등록 버튼을 눌러 회원을 추가할 수 있음. 또한 우측 상단의 패널에서 번호와 제목을 입력후 등록 버튼을 눌러 도서를 추가할 수 있음.

불러오기 대화창

툴바의 불러오기 버튼을 눌러 데이터가 저장된 파일을 불러옴. 파일명과 확장자는 임의로 지정할 수 있으나 본 예제에서는 list.dat 파일을 사용하겠음. 마찬가지로 저장도 파일 대화창을 띄움.

데이터를 불러온 화면

하단의 대여목록과 예약목록도 같이 불러옴(본 예제는 처음 사용자를 위함). 올바른 데이터가 들어있지 않은 임의의 파일을 불러왔을 경우 에러메시지 대화창을 띄움.

대여 불가능

손님의 경우나 대여가 불가능한 장르의 경우 대여 불가능 메시지를 띄움. 참고로 각 목록의 항목을 클릭하면 그에 맞는 속성값들이 출력됨. 예로 대여목록의 경우 대여일자와 반납기한이 출력됨.

예약 기능

이미 대여된 도서의 경우 예약 기능을 이용할 수 있음. 단, 대여가 불가능한 회원이나 장르는 예약도 불가능함.

데이터 저장

도서관 이용시간이 끝났을 경우 데이터를 저장해 다음 개장시 다시 불러올 수 있음. 회원목록, 도서목록, 대여목록, 예약목록이 저장됨.

어려웠던 부분

  • 설계 경험 부족으로 인해 초기 기획부터 코딩까지 몇 번이나 다시 시작함.
  • 짧은 테스트 기간으로 인해 찾지 못한 버그의 존재가 의심됨.
  • GUI를 씌우면서 점점 불어나는 소스코드로 인한 클래스 단위의 적절한 분배의 어려움.

향후 개선 사항

  • 리스트의 정렬 및 검색 기능 추가
  • 관리자의 패스워드 잠금 기능
  • 로그 파일을 남겨 월말 결산, 우수 대여자 선발 등에 이용
  • 지저분한 소스코드를 디자인패턴을 통해 리펙토링(Manager 클래스는 Singleton 패턴, GUI 컴포넌트들은 Factory Method 패턴 적용 예상)

배운 점

  • 프로그램 개발과정을 몸으로 느껴볼 수 있는 좋은 기회였음.
  • 개발 초기에 Edit Plus 와 같은 텍스트 에디터를 이용하였으나 점점 규모가 커지면서 Eclipse와 같은 IDE의 필요성을 느끼게 되었음. Eclipse의 기능을 좀 더 알게되었음.
Share Comments

알고리즘 아트

어디서 본 그림인데 기억이 안난다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void setup() {
size(500, 500);
background(255);
smooth();
noFill();
noLoop();
ellipseMode(RADIUS);
}
void draw() {
rule1(width / 2, height / 2, 400);
blend(createCircleMask(200), 0, 0, width, height, 0, 0, width, height, ADD);
}
void rule1(float x, float y, float r) {
if (r < 25) {
return;
}
strokeWeight(r / 100);
ellipse(x, y, r, r);
float hr = r / 2;
rule1(x, y, hr);
for (int t = 30; t < 360 + 30; t += 60) {
float c = hr * cos(radians(t));
float s = hr * sin(radians(t));
rule1(x + c, y + s, hr);
}
}
PGraphics createCircleMask(float r) {
PGraphics mask = createGraphics(width, height);
mask.beginDraw();
mask.background(255);
mask.noStroke();
mask.fill(0);
mask.ellipseMode(RADIUS);
mask.ellipse(width / 2, height / 2, r, r);
mask.endDraw();
return mask;
}
Share Comments

코딩을 지탱하는 기술

코딩을 지탱하는 기술

역사와 비교를 통해 프로그래밍 언어의 기본 원리를 정리한 책이다.

지금껏 프로그래밍 언어를 공부하면서 ‘왜’라는 질문을 품어본 적이 없는데, 이 책이 그 ‘왜’라는 질문과 동시에 그 답을 알려줬다.

프로그래머라면 꼭 한번은 읽어야 하는 책이라고 생각한다.

자세한 내용은 책 소개에서 확인하자.

Share Comments

화이

5명의 범죄자로부터 길러진 ‘화이’가 괴물이 되어가는 이야기이다.

모든 배우들의 캐릭터가 각각의 색을 가지고 있다.

2~3번은 봐야 전체 스토리를 정확히 해석할 수 있을 듯하다.

Share Comments