1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 프리미엄 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
***************************< 캠퍼스 C 강좌 >******************************
[제목] :
[코드] : campusc1-024 (초급)
[교재] : CAMPUS C (초급, Third edition) [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄 수
있습니다. 그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있습니다.
[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
천리안 : go campusc
나우콤 : go lcampc
하이텔 ID : campusc
****************************<< 목 차 >>************************************
<1> 그래픽에 관하여
1> 들어가며..
2> 라이브러리 레퍼런스를 뒤지자
3> 픽셀 및 좌표계에 대하여
4> 그래픽 어댑터(카드)와 그래픽 모드의 종류
5> 그래픽 시스템으로 들어가기와 끝내기
6> 그래픽 라이브러리 를 포함해라
7> 선을 긋는 함수와 그래픽 커서
8> 원을 긋는 함수
9> floodfill 과 무늬 종류 고르기
10> 그래픽에서 글자를 쓰는법
<2> 프로그램에 응용하자. 숙제
**************************< 내용 시작 >********************************
1> 들어가며..
-----------------------------------------------------------------------
여러분들 중에 설마 영화 "터미네이터 2" 를 못 본 사람은 없을 것
입니다. 나는 비디오를 포함해서 한 10번 가까이는 본것 같은데 처음 본 것
은 미국에서 한 컴퓨터 엔지니어가 보자고 권해서 엉겁결에 봤지요. 그것은
(저에게는) 가히 숨막히는 영화였었습니다.
그 영화는 내용 자체도 흥미 진진 했지만, 나는 거기서 사용한 그래
픽 기법을 보고 한동안 탄성을 금치 못했지요.
서울 에서는 현대의 엘란트라 선전을 그래픽 애니메이션으로 한적이
있고, 그게 최초의 TV 그래픽 광고라고 얼뜻 들은적이 있습니다.
또 요즘은 "멀티 미디어(multi media) 컴퓨터"라는게 점점 등장하
기 시작하는데, 이것은 우리가 쓰고 있는 보통의 PC에 "그래픽" 과 "음향"
성능이 향상된 컴퓨터라고 보면 크게 틀리지 않는 것입니다. 이와 같이 그래
픽 분야는 우리의 실생활과 점점 가까워 지고 있습니다.
"그래픽 애니메이션(animation)" 이란, 만화영화를 만드는 것 처럼,
그림을 조금씩 변화시켜 연속적으로 보여 주므로서, 움직이는것 같은 효과를
주는 것을 말합니다.
이런 그래픽 애니메이션 분야는 컴퓨터, 에서도 하나의 전문 분야로
서 우리가 이 강좌에서 전문적으로 다룰 만한 수준을 벗어나는 것입니다. 그
리고 그런 전문적인 분야에 사용하는 컴퓨터도 우리가 쓰고 있는 PC보다는
더 그래픽 성능이 막강해야 하지요. 최소한 워크스테이션 수준에서 주로 사
용합니다. 컴퓨터 그래픽은 엄청나게 많은 데이타를 처리해야 하는 분야 이
기 때문에, 속도가 느린 컴퓨터로는 도저히 사용할 수가 없기 때문입니다.
그러나 여러분도 아시다시피 요즘 PC의 "실행 속도"가 무서운 속도
로 빨라지고 있기 때문에 우리도 어느정도 까지는 "컴퓨터 그래픽"의 재미를
즐길 수 있을 것입니다.
-----------------------------------------------------------------------
2> 라이브러리 레퍼런스를 뒤지자
-----------------------------------------------------------------------
우리도 현재 터보 씨가 제공하는 함수를 를 이용해서 그래픽을 즐겨
볼 수 있는데, 그 함수의 이름들이 [375쪽] < 그래픽 루틴 > 에 잘 나와 있
습니다. 이 함수들은 약 80개 정도 되는데, 이것들만 잘 이용하면 사무처리
용 정도의 그래픽은 어렵지 않게 구현 할 수 있습니다.
따라서 우리는 "함수를 읽고 사용 하는 법"만 정확히 안다면 옛날에
는 전문가들이나 그릴수 있었던 그림들을 지금 당장 부터도 그릴 수 있습니
다.
아래에 가장 기본적인 함수들을 소개 합니다. 이것들은 눈에 잘 띄는곳에 붙
여 놓고 하나씩 장난 삼아 연습해 보면 그래픽에 관한 것은 금새 익힐 수 있
습니다. 그래픽에 관한 내용은 나중에 게임 정도를 직접 제작하는 수준이 되
면 공부할 것이 무척 많아지지만, 지금 단계에서는 아래에 설명하는 기본 사
항만 약간 공부하고나면 주로 "함수의 사용법"에 관한 것이므로 주로 함수의
소개및 나열입니다.
initgraph() : 그래픽을 모드로 들어가고 싶을 때 쓴다.
closegraph() : 그래픽을 모드에서 빠져 나오고 싶을때 쓴다.
cleardevice() : 화면을 지운다.
circle() : 원 그린다
ellipse() : 타원형
rectangle() : 사각형
line() : 두 좌표 사이 선 긋기
lineral() : 현재 커서 에서 상대위치 까지 선긋기
lineto() : 현재 커서 에서 절대위치 까지 선긋기
moveto() : 커서를 옮기기
moverel() : 커서를 상대적 위치까지 옮기기
setlinestyle() : 선의 스타일을 결정
floodfill() : 색깔 채워 넣기
setfillstyle() : 채울 스타일 결정
getpixel() : 픽셀 색상을 알아냄
putpixel() : 픽셀을 표시
settextstyle() : 글자 스타일 결정
outtext() : 글자 를 현재 커서에 쓰기
outtextxy() : 글자를 지정한 (x,y)에 쓴다.
textheight() : 글자의 높이 설정
textwidth() : 글자의 넓이 설정
getx() : x 좌표 알아냄
gety() : y 좌표 알아냄
getmaxx() : x 좌표 의 최대 크기 알아냄
getmaxy() : y 좌표 의 최대 크기 알아냄
함수의 이름들이 내용을 잘 얘기해 주고 있으므로 사용하기에 어렵
지는 않을 것입니다.
-----------------------------------------------------------------------
3> 픽셀 및 좌표계에 대하여
-----------------------------------------------------------------------
모니터에 나타나는 글자나 그림들은 많은 점으로 구성 되어 있음을
알것입니다. 그래픽 모드에서는 "점" 이라는 말 대신에 "픽셀(pixel)"이라고
부릅니다. 그래픽 모드에서 픽셀의 좌표는 텍스트 모드의 좌표계와 유사합니
다. 다만 텍스트 모드는 (1,1)부터 시작 하는데 비해 그래픽 모드에서는
(0,0) 부터 시작하는 것을 기억해야 합니다. 그 그림이 [307쪽]) 에 나와
있습니다. 이 좌표계를 잘 기억 해야 합니다.
여기서 기준은 VGA 카드의 (640 x 480) 모드를 기준으로 했습니다.
그리고 좌표의 순서는 역시 (X,Y) 순서이고 텍스트 좌표와 마찬가지로 Y 좌
표는 수학의 Y좌표와 반대라는걸 유념해야 합니다.
여기서 상식으로 "텍스트 모드"와 "그래픽 모드"의 차이를 구분해보
면 다음과 같습니다. 지금 우리는 주로 모니터에 찍히는 그래픽모드에 대해
서 얘기하는 것이지만, 좀 더 기본적으로 얘기를 하면 이런 겁니다. 즉,
월남에 있는 람보가 만일 홍콩에 있는 임청하와 "텍스트 모드"로 교신을 할
때는 다음과 같이 일을 처리합니다.
람보 : "청하 ! 종이에 써봐 " 0x47 0x4f 0x4f 0x44
청하 : "썼다.... 고마워"
위 대화에서 한국말로 사람이 전화 거는 말투는 내가 편의상 적은 것일 뿐이
고 텍스트 모드로 나가는 부분은 다음과 같이 아스키 코드 4글자만 입니다.
즉
람보 : 0x47 0x4f 0x4f 0x44 (보냄)
청하 : (받음)
자 그러면 이때 청하가 받은 메세지는 무엇일까요 ? 이 답을 알려면 여러분
들 교재 [534쪽](새교재 [509쪽])의 아스키(ASCII)코드를 찾아보면 됩니다.
찾기 귀찮을테니 적어 드리지요.
람보 : 'G' 'O' 'O' 'D' (보냄)
청하 : (받음)
<문제> 이 순간에 임청하의 메모지에 써 있는 글자들은 무엇일까요 ?
<답> 참 한심한 질문이다. 당연히 "GOOD" 이라는 글자가 써있겠지 !
위의 문제는 정말 한심한데, 정말 문제는 그것이 아닙니다. 진짜 문
제는 임청하가 아스키 코드를 아느냐 하는것 이지요. 임청하가 받은 것은
"GOOD" 이라는 글자가 아니고 단지 숫자들 0x47, 0x4f, 0x4f, 0x44 일 뿐입
니다. 지금 임청하가 전화상으로 이 숫자들을 받고 어떤 느낌일까요 ?
(경우 1) 임청하가 아스키 코드를 모를경우 의 느낌
"나갔구나 ! "
"더운 월남에서 매일 싸움만 하더니 완전히 정신 나갔구나"
"느닷없이 웬 암호지령이야 ?"
(경우 2) 임청하가 아스키 코드를 알경우의 느낌
"나보고 GOOD 이라내 !"
"내가 칼 쓰는게 근사하게 보였나 보지 ?"
위의 (경우 1) 같은 경우는 아스키 코드를 모르는 컴퓨터와 교신을
할 때 벌어지는 일입니다. 실제로 IBM에서 만드는 대형 컴퓨터 들은 자기들
고유의 코드를 가지고 있어서 아스키 코드를 사용하지 않습니다(물론 호환하
는 방법은 있지만). 그 코드의 이름이 EBCDIC 이라는 코드인데, 건방지게 일
개 회사인 주제에 "미국 표준코드(ASCII)를 안쓰다니 말이 됩니까 ? 그러나
컴퓨터에 관한한 IBM이라는 회사는 그만큼 세력이 있고 또 그만큼 일찍 시작
했기 때문에 어쩔 수 없는 부분도 있겠지요. 이런 경우는 우리나라도 마찬가
지지요. 1980년 초반경에는 삼보같은 회사에서 한국표준코드(KSCII)를 만들
기 전부터 자체조합형 코드를 만들어서 널리 퍼지지 않았습니까 ? 그것이 지
금도 역시 너무 많이 쓰는 "상용 조합한글" 이구요. 그런데 아쉬운 것은 국
내의 대기업에서 나오는 컴퓨터들은 또 나름대로의 한글코드를 가지고 있어
요. 이것도 일종의 유치한 "자존심" 냄새가 나는 부분인데, 코드를 유심히
보면 많이 쓰는 "상용 조합형" 한글과 별로 차이가 없어요. 별로 창의적인
코드가 아닌 바에야 기존에 많이 쓰고 있는 한글과 대거 통합을 해서 한글문
제를 일원화 할 생각은 않하고 소국적인 견지에서 자꾸 코드만 난립을 시키
면 되겠습니까 ? 그런 속성이 남아 있으면 남북통일을 한다거나 전세계를 정복
하는 따위의 단결력을 발휘하기 어려울 것이라는 저의 개인적인 생각입니다.
좌우간 이렇게 "코드"를 가지고 통신을 하면서 의사를 전달하는 것
이 "텍스트 모드" 입니다. 그 대상은 비단 컴퓨터와 컴퓨터 뿐 만이 아니고
컴퓨터 본체와 프린터 간에도 마찬가지 입니다. 즉 본체가 프린터에게 "0x41
찍어" 하고 명령을 내리면 프린터에서는 'A' 라는 글자가 찍혀 나오는 겁니
다. 이 때도 물론 상황은 임청하와 같습니다. 즉
(경우 1) 프린터가 아스키 코드를 모를경우
"본체 미쳤구나 똑바로 보내라 !"
(경우 2) 프린터가 아스키 코드를 알경우
"이건 A를 찍으라는 소리 아니야 ? 찍어줘야지 "
이때 (경우 2)에 대해서 생각해 볼것은 'A'를 찍으라는 소리를 알아
들었으면 실제로 'A'를 그릴 수 있는 데이타가 있어야 하지 않겠습니까 ?
그것은 당연히 프린터 내부에 가지고 있어야 합니다. 아시겠지만 그것이 "폰
트(글꼴)" 이지요. 보통은 하드웨어적으로 폰트의 데이타를 갖고 있는데 아
시다시피 한글의 경우 글자수가 (영문보다) 많기 때문에 폰트의 데이타가 많
아지지요. 게다가 요즘은 프린터에서 "명조체" "고딕체" 등등 여러가지 글자
체를 가지고 있어서 폰트 데이타의 양은 더 많아지는 것이지요.
이 폰트들은 하드웨어 시간에 얘기했던 "ROM" 이라는 칩안에 들어가
있는데,기억 나시지요 ? 전원이 나가도 항상 데이타를 가지고 있다는 그 칩
말입니다.
이렇게 폰트를 많이 쓰면 당연히 ROM이 많이 필요하지요. ROM이 많
이 필요하다는 얘기는 곧 공간도 많이 필요하고 돈도 더 많이 든다는 얘기
입니다. 그래서 국내의 모 회사에서는 이 ROM을 없에는 방법을 동원하여 아
주 저렴한 레이저 프린터를 내놨다는 기사를 읽은적 있습니다.
이렇게 ROM이 없는 경우는 당연히, 본체에서 폰트데이타를 처음에
왕창 받아다가 프린터 내부의 RAM에 저장해서 써야 합니다. 따라서 이 경우
는 당연히 껐다가 키면 또 받아야지요.
좌우간 어느 경우이든지 "텍스트 모드"에서는 프린터는 글자(text)
에 대한 "폰트"는 확보해야 합니다.
이런 문제는 본체와 "모니터" 사이에도 똑같습니다. 사실은 이 얘기
를 하려고 서두가 너무 길어졌는데, 교재 [14쪽]을 보세요.
언젠가도 얘기를 했지만, 컴퓨터는 "CPU"를 중심으로 하고 나머지 모든 외부
장치들과 "정보"를 교환하는 것일 뿐입니다.
따라서 cpu가 모니터와 얘기를 할 때도 그림의 VGA 따위의 그래픽
카드와 지금 얘기한 "텍스트 모드" 혹은 "그래픽 모드"따위로 얘기를 합니다.
텍스트 모드는 프린터와 하는 방법과 똑같습니다.
중급 강좌에서는 보다 자세히 다루겠지만, 이를테면 모니터좌표의
(1,1) 에 'A'라는 글자를 찍고 싶으면 그에 해당하는 "아스키 코드"를 VGA
따위의 그래픽 카드에 전송하면 됩니다. 물론 이때 좌표위치를 정확히 찾기
위해서 계산이 필요하지요. 이 위치는 메모리의 번지와 1대 1로 연계되어 있
습니다.
이에비해 "그래픽 모드"에서는 "아스키 코드" 따위를 보내는 것이
아니고 예를 들어 'A'를 찍고 싶으면, 실제로 'A' 의 그림 형태를 고스란히
가로 세로 크기를 맞추어 0101 따의의 점(픽셀)의 형태로 보내 주어야 합니
다. 그러면 그 점의 형태에 맞추어 점을 찍다보면 그림이 그려지는데 나중에
보면 'A' 라는 글자 형태로 보이는 것이지요.
따라서 만일 해상도가 똑같고 모양도 똑같다면 "그래픽 모드"로 인
쇄된 'A' 나 "텍스트모드"로 찍힌 'A'나 구분을 못할지도 모릅니다. 그러나
그 작업을 하기 위해 본체와 프린터 간에 데이타가 오간 방법의 차이를 이해
할 수 있어야 합니다.
<문제> 어느 방식이 전송하는데 더 오래걸릴까요 ?
<답> 그래픽 모드 (데이터가 많아지니까 당연)
<문제> 텍스트 모드에서는 폰트에 없는 글자는 못찍겠네 ?
<답> 당연. 전송속도가 그래픽에 비해 빠른 대신 쓸 수 있는 글자,혹은 도형
의 수에는 제한이 있는 것이지.
-----------------------------------------------------------------------
4> 그래픽 어댑터(카드)와 그래픽 모드의 종류
-----------------------------------------------------------------------
요즘 컴퓨터에는 거의 VGA 카드가 꽂혀있는 것 같고, 아주 간혹 흑
백(허큘리스) 카드를 갖고 있는 분도 있는것 같습니다. 성능은 다소 차이 나
지만 기본적인 개념은 똑같으니까 별 문제는 없습니다.
앞으로는 VGA 카드를 기준으로 합니다. 현재 TURBO C 2.0 이 지원하
는 카드(어댑터)는 허큘리스,EGA,VGA 등을 포함해서 8 가지이지요. 다시 말
해서 이 8 가지 카드중 아무거나 갖고 있으면 터보 C로 그래픽 프로그램을
짜서 돌릴 수 있다는 얘기입니다.
TURBO C에서는 이 카드를 제어하기 위해 "그래픽 드라이버(graphic
driver)"라는 프로그램을 사용합니다. 이것들은 확장자 이름이 xxx.bgi 로
되있는데 (Borland Graphics Interface)의 첫글자들입니다.
카드와 그래픽 드라이버의 관계는 다음과 같습니다.
Hercules Graphics Adapter --> herc.bgi
EGA --> ega.bgi
VGA --> egavga.bgi
잠시 읽는걸 중단하고 터보 C 디렉토리에 가서 위의 xxx.bgi 들이
있는지 확인하세요. 자기 카드에 맞는 xxx.bgi 프로그램만 있으면 나머지는
사실상 필요없습니다.
그래픽 모드의 종류는 한 카드에 대해 여러개씩 있는데 여기서 말하
는 모드란 것은 쉽게 얘기해서 "해상도를 높게 하는가 낮게 하는가, 색상을
몇개나 쓸수 있게하는가" 따위의 상태를 말합니다.
그 모드를 전부 보여 주는 것이 [309쪽]의 "각종 그래픽 카드의
모드"에 나와 있습니다. 지원하는 모드는 이와 같이 많으나 우리가 관심을
가져야 할것은 아래와 같은 VGA 모드 입니다.
---------------------------------------------------------------------
그래픽 모드 해상도(X x Y) 색깔 페이지
---------------------------------------------------------------------
VGALO 640 x 200 16가지 4
VGAMED 640 x 350 16가지 2
VGAHI 640 x 480 16가지 1
-----------------------------------------------------------------------
[309쪽]의 도표는 사실 "graphics.h"에 정의 되 있는것을 표로 만든
것 인데, 이제 우리는 소스를 읽을 수 있는 수준에 도달 했을것 이므로(?)
직접 한번 읽어보기로 합니다.
앞으로는 이 강좌가 끝나더라도 모든 자료는 소스코드로 직접 읽도
록 노력하세요. 읽을 줄만 안다면 소스보다 더 정확한 자료는 없습니다. 아
래는 간단한 enum 타입으로 되있는것 이고, 역시 각 멤버들은 "대문자"로 쓰
인걸 눈여겨 봐야 합니다. 이런건 아주 사소한 문제 이지만, 처음 배우는 단
계부터 습관을 확실히 들여야 합니다.
enum graphics_modes { /* graphics modes for each driver */
CGAC0 = 0, /* 320x200 palette 0; 1 page */
CGAC1 = 1, /* 320x200 palette 1; 1 page */
CGAC2 = 2, /* 320x200 palette 2: 1 page */
CGAC3 = 3, /* 320x200 palette 3; 1 page */
CGAHI = 4, /* 640x200 1 page */
MCGAC0 = 0, /* 320x200 palette 0; 1 page */
MCGAC1 = 1, /* 320x200 palette 1; 1 page */
MCGAC2 = 2, /* 320x200 palette 2; 1 page */
MCGAC3 = 3, /* 320x200 palette 3; 1 page */
MCGAMED = 4, /* 640x200 1 page */
MCGAHI = 5, /* 640x480 1 page */
EGALO = 0, /* 640x200 16 color 4 pages */
EGAHI = 1, /* 640x350 16 color 2 pages */
EGA64LO = 0, /* 640x200 16 color 1 page */
EGA64HI = 1, /* 640x350 4 color 1 page */
EGAMONOHI = 0, /* 640x350 64K on card,1page - 256K on card,4
pages */
HERCMONOHI = 0, /* 720x348 2 pages */
ATT400C0 = 0, /* 320x200 palette 0; 1 page */
ATT400C1 = 1, /* 320x200 palette 1; 1 page */
ATT400C2 = 2, /* 320x200 palette 2; 1 page */
ATT400C3 = 3, /* 320x200 palette 3; 1 page */
ATT400MED = 4, /* 640x200 1 page */
ATT400HI = 5, /* 640x400 1 page */
VGALO = 0, /* 640x200 16 color 4 pages */
VGAMED = 1, /* 640x350 16 color 2 pages */
VGAHI = 2, /* 640x480 16 color 1 page */
PC3270HI = 0, /* 720x350 1 page */
IBM8514LO = 0, /* 640x480 256 colors */
IBM8514HI = 1 /*1024x768 256 colors */
};
두말 할것도 없이 여기 정의된 이름은 정확히 따라줘야 합니다. 여
기서 잠시 기억 해야 할것은, C 로 "그래픽 프로그램"을 짤 때 항상 아래의
두가지 사실을 염두에 두어야 한다는 것입니다.
1. 내 그래픽 카드는 어떤 종류인가
2. 그래픽 모드는 어떤 걸로 쓸까
위 1번 그래픽 카드가 어떤게 꽂혀 있는지는 자동으로 검사하는 법
이 있습니다. 따라서 우리는 아무 생각없이 "자동으로 알아서 찾아" 명령을
내리면 그만이지만 기본적으로 내용을 이해할 필요는 있습니다.(나중에 나
옴)
-----------------------------------------------------------------------
5> 그래픽 시스템으로 들어가기와 끝내기
-----------------------------------------------------------------------
이제 직접 프로그램을 돌려보며 실험을 합니다.
#include <graphics.h> <-- 꼭 첨가
main()
{
int graphdrive = VGA; <-- 그래픽 카드를 결정
int graphmode = VGAHI; <-- 그래픽 모드 설정
initgraph(&graphdrive, &graphmode," ");<-- 그래픽 상태로 들어간다
.... <-- 그리고 싶은 그림 그리기
closegraph(); <-- 다시 텍스트 상태로 전환
}
앞으로는 그래픽을 이용할 때 이 형태를 "그대로 복사"를 해서 쓰기
로 합니다. 내용을 잠깐 보면
1. <graphics.h>를 반드시 포함해야 합니다.
2.변수명 graphdrive 와 graphmode 는내맘대로 짓는 이름이지만 initgraph()
를 부르면서 넘겨주는 이름과 반드시 똑같아야 합니다.
3. 변수를 넘겨줄 때 앞의 &(주소표시)를 붙인것은 initgraph() 함수를
사용 하는 법에 따른 것 이므로 그대로 따라 쓰도록 합니다.
허큘리스를 갖고 있는 분들은 다음과 같이 합니다
#include <graphics.h>
main()
{
int graphdrive = HERCMONO, graphmode = HERCMONOHI; <-- 모드 선택 자유
initgraph(&graphdrive, &graphmode," "); <-- 그래픽 상태로 들어간다
..... <-- 그리고 싶은 그림 그리기
closegraph(); <-- 다시 텍스트 상태로 전환
}
내가 무슨 카드를 갖고 있는지 모르는 분들은 다음과 같이 합니다
#include <graphics.h>
main()
{
int graphdrive = DETECT,graphmode; <-- 자동으로 찾음
initgraph(&graphdrive, &graphmode," "); <-- 그래픽 상태로 들어간다
..... <-- 그리고 싶은 그림 그리기
closegraph(); <-- 다시 텍스트 상태로 전환
}
이와 같이 하면 자동적으로 그래픽 카드의 종류를 찾아 주므로 우리는 별로
신경을 안써도 됩니다. 그리고 graphmode 는 그 카드에서 가장 해상도 가 높
은 모드로 자동 설정됩니다.
-----------------------------------------------------------------------
6> 그래픽 라이브러리 를 포함해라
-----------------------------------------------------------------------
터보 C 2.0 컴파일러는 하도 쓰기가 편해서 여러분들은 여태 [^ F9]만
누르면 만사 형통 이었지요. 그러나 학습 차원에서는 어떤 작업이 이루어 지
는지 내용을 이해할 필요는 있습니다. 여태까지는 "기본 라이브러리"가
default로 여러분의 프로그램에 같이 합류(link)가 되서 같이 실행 파일 속
에 들어갔습니다.
따라서 단 한줄만 main() 함수에 짜서 컴파일을 시켜도 실행 파일
은 무척 커져있었지요. (a.c a.obj a.exe)삼형제 화일의 크기를 비교하라
는 숙제를 충실히 하신 분은 이해 할 수 있을 것입니다
그러나 그래픽에 관련된 함수들은 다른 라이브러리 이름으로 만들어
졌기 때문에, 앞으로는 그래픽 함수를 부르려면 "그래픽 라이브러리"를 같
이 link 시켜야 합니다.
이건 보통 자동적으로 link 되게끔 설정 되있는데 혹시 모르니까 조
사를 해보세요. 터보 C 메뉴에서
-------------------------------------------------------
[Options[ [Linker] [Graphics library]를 --> ON 으로
-------------------------------------------------------
선택합니다. 거기에 "On" 으로 설정되있으면 그래픽 라이브러리를 자동으로
불러 온다는 뜻입니다. "Off"로 되있는 분들은 "On"으로 바꾸어 놓아야 합니
다.
-----------------------------------------------------------------------
7> 선을 긋는 함수와 그래픽 커서
-----------------------------------------------------------------------
그래픽을 그릴때도 우리는 커서(cursor)를 씁니다. 그러나 이것은 텍스트
의 커서처럼 반짝거리며 현재 위치를 알려 주지는 않습니다. 그리고 보통은
"현재 위치"라는 뜻으로 "CP (Current Position)" 이라는 용어를 씁니다.
아래에 직접 프로그램을 보면서 함수의 기능을 익힙니다.
main()
{
int x,y,x1,y1;
int graphdrive;
int graphmode;
graphdrive = DETECT; <-- 자동으로 카드 검출
initgraph(&graphdrive, &graphmode," "); <-- 그래픽 상태로 들어간다
cleardevice() <-- 화면 깨끗이 지우기(그래픽
x = getx(); <-- 현재 x 좌표값을 알고 싶을때
y = gety(); <-- 현재 y 좌표값을 알고 싶을때
moveto(100,23); <--- 텍스트 모드의 gotoxy() 와 같이
커서를 (100,23) 좌표로 옮김
x = 123;
y = 200;
moveto(x, y); <--- 마찬가지
moverel(1,2); <--- move + relative(상대적으로 이동)이건
현재 있는 위치에서 (1,2) 만큼을 움직이
라는 얘기지 진짜 좌표(1,2) 로 가라는 것
이 아님.
line(x,y,x1,y1); <--- 줄을 그리려면 4개의 좌표가 필요하다는
것은 알것입니다. 양쪽 끝 두점의 좌표다.
이 줄을 그리고 나서 커서는 따라가않고
제자리에 있다
lineto(x,y); <--- 현재위치에서 절대쫘표 (x,y)까지 줄을 그
린다.커서 따라간다.
linerel(x,y); <--- 현재위치에서 상대쫘표 (x,y)까지 줄을 그
린다.커서 따라간다.
rectangle(x,y,x1,y1); <--- x,y 좌표는 왼쪽위 구석점, x1,y1은 오른
쪽 아래구석점을 나타내고 그에 해당하는
box를 그린다.
closegraph(); <-- 다시 텍스트 상태로 전환
}
<문제>
아래의 프로그램을 읽어보세요. 죄표계를 신경 써서 기억하고, 어떤 그림이
그려 질지를 상상해 보고 맞는지 실행해 보세요.
#include <graphics.h>
main()
{
int i;
int graphdriver;
int graphmode;
graphdriver = DETECT;
initgraph(&graphdriver, &graphmode, "");
line(20, 20,200,200);
getch();
cleardevice();
for(i=0; i < 320 ; i++) {
/* cleardevice(); <-- 요기
*/ rectangle(0,0, 2*i++,i++);
delay(10);
}
getch();
for(i=320; i > 0; i--) {
cleardevice();
rectangle(0,0, 2*i--,i--);
delay(20);
}
getch();
closegraph();
}
<문제> 위의 " <-- 요기" 에서 주석문 표시 "/* ..*/" 를 지우면 프로그램
결과가 어떻게 달라지나요 ?
-----------------------------------------------------------------------
8> 원을 긋는 함수
-----------------------------------------------------------------------
main()
{
int x,y,radius;
int graphdriver;
int graphmode;
graphdriver = DETECT;
initgraph(&graphdriver, &graphmode, "");
circle(x,y,radius); <--- 중심좌표를 x,y로 잡고 반지름을
radius로
원을 그린다.
ellipse(x,y,start_angle,end_angle,xradius,yradius);
<-- 중심좌표(x,y) X반지름(xradius),Y반지름(yradius)
그리고 수학의 각도정의 처럼 3시 방향을 0도로 하
고 반시계 방향으로 360 도 까지 그리는데
(start_angle, end_angle) 만큼만 타원형을 그린
다. 완전한 타원형을 그리고 싶으면 start_angle =
0, end_angle = 360을 대입하라.
closegraph();
}
-----------------------------------------------------------------------
9> floodfill 과 무늬 종류 고르기
-----------------------------------------------------------------------
"페인트 브러쉬" 나 "닥터 할로" 같은 그래픽 유틸리티를 써본분들은 지
금이해가 빠를것 이라고 생각됩니다. 지금 소개하고 있는 이런 함수들을 주
섬주섬 챙기기만 하면 우리도 간단한 그래픽 유틸리티는 금새 만들 수 있
습니다.
이제 위에 소개한 rectangle() 함수로 box를 하나 그리고 그안에 색
깔을 칠해 봅니다. floodfill 이란 "살살 칠하는게" 아니고 "물감통을 "확
들어 붓는것"같이 과격하게 색깔을 채운다는 뜻입니다. 실제로 칠하는 것을
보고 있으면 그런 느낌이 들것입니다.
main()
{
int x,y,border;
int graphdriver;
int graphmode;
graphdriver = DETECT;
initgraph(&graphdriver, &graphmode, "");
floodfill(x,y, border);
closegraph();
}
여기서 (x,y) 는 색깔을 칠하는 기준점이고 자기를 둘러싼 폐곡선 내부를 칠
하는데 border라는 색깔을 지정해 주어 폐곡선을 찾지요. 칠하는 무늬를 특
별히 지정하고 싶으면 setfillstyle() 함수를 씁니다.
setfillstyle(무늬번호, 색깔);
여기서 색깔은 16 가지(0 - 15) 중에 하나를 고르면 되고 무늬 패턴은 아래
처럼 <graphics.h> 에 지정되있습니다.
enum COLORS {
BLACK, /* dark colors */
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY, /* light colors */
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
이것을 도표로 만들어 놓은 것이 [524쪽]입니다.
enum fill_patterns { /* Fill patterns for get/setfillstyle
*/
EMPTY_FILL, /* fills area in background color */
SOLID_FILL, /* fills area in solid fill color */
LINE_FILL, /* --- fill */
LTSLASH_FILL, /* /// fill */
SLASH_FILL, /* /// fill with thick lines */
BKSLASH_FILL, /* \\\ fill with thick lines */
LTBKSLASH_FILL, /* \\\ fill */
HATCH_FILL, /* light hatch fill */
XHATCH_FILL, /* heavy cross hatch fill */
INTERLEAVE_FILL, /* interleaving line fill */
WIDE_DOT_FILL, /* Widely spaced dot fill */
CLOSE_DOT_FILL, /* Closely spaced dot fill */
USER_FILL /* user defined fill */
};
이걸 보기 쉽게 책에 도표로 만들어 놓은것이 [314쪽])에 있습니다.
-----------------------------------------------------------------------
10> 그래픽에서 글자를 쓰는법
-----------------------------------------------------------------------
그래픽 상태에서 글자를 쓰는 방법은 크게 두가지가 있습니다.
1. outtextxy(x,y, *string);
출력할 위치를 지정하고 스트링을 쓰는 것입니다.이것은 커서를 움직이지
않지요. 예를 들면
outtextxy(10,10," Happy Birth Day !");
2. outtext(*string);
현재 커서 위치에 스트링을 출력 하는것입니다. 이것은 커서가 따라갑니
다.
예) outtext("Good morning");
이상으로 가장 기초적인 그래픽 함수 몇가지를 소개했는데 이것 말
고도 정말 많은 함수들이 제공되있습니다. 나중에 또 살펴 보기로 합니다.
<숙제> 선 그리기와 원그리기 등을 이용하여 자기 이름을 화면에 크게 써보
세요. (색깔과 무늬 패턴을 이용하여)
<숙제> 화면 가득히 양궁 과녁을 그려 보세요(동심원 5개를 이용하여)
(색깔과 무늬 패턴, 점수 표시 까지 표시 하여)
<숙제> 자기가 그리고 싶은 그림을 그려서 "메뉴 선택" 프로그램에 첨가 시
키세요.
****************************< 끝 마치며 >******************************
수고 하셨습니다
***********************************************************************