Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ 강좌/문서
[19] BGI Graphic Seminar (Q/A에서 복사)
남병철.레조 [lezo] 17817 읽음    2007-04-16 10:47
김재구 님이 퍼오신 글입니다.
Q/A 경선님 글에 답글로 있어서 옮기지 않고 다시 퍼왔습니다. ^^;
http://turboc.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_qna&no=1315



기초 Graphic Seminar


『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 124번
제  목:[예고] 기초 Graphic Seminar #0                             
올린이:성욱    (최성욱  )    96/03/04 00:00    읽음:103 관련자료 없음

-------------------------------------------------------------------------
----
안녕하세요..

성욱인데요..

집에 있는 하드를 뒤지다가요..

작년 가을에...제가 했었던 왕기초 Graphic Programming Seminar 관련..

자료들을 찾았어요..후후

뭐..내용은 정말 부실했지만..

나름대로..누군가를 처음으로 가르친다는 마음에..

가슴뿌듯함을 느꼈던 세미나였죠..

그래서요..

혹시 누군가 이걸 보면 약간이라도 도움될 지도 모른다는 생각에..

한글화일을 아스키 화일로 바꿔서...약간 편집했습니다..

그 세미나물을 여기에 올리려고 합니다..

C언어를 처음하시는분...PASCAL을 처음하시는분...

C언어나 PASCAL 언어의 내장 그래픽 함수(BGI)를 쓰고 싶으신분...

참고하세요..

볼 건 없지만..그래두 게시판의 활성화를 바라보며..올립니다..

대상은 C언어를 써본지 별로 안됐거나..처음이신분 중에서..
      (PASCAL언어도 동일)
Graphic에 관심이 있으신분으로 합니다..

뭐..아무나 보시고..

궁금한 점이나 잘못된 점이 있으면 연락이나..메일 주십시오..

친절하게 상담해 드리지요..

그럼 올립니다..

컴공의 발전을 염원하며...

이만통통..

                                                여러분의 성욱 올림..
피에스..

                내용이 내용이니 만큼..조회수는 연연하지 않을꺼예요..히히..

                이런걸 올리자니 디게 부끄럽네요...후후..

                좀 더 심도깊은..오오~~ "콩!" .....-_- 아야야...히힛

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 125번
제  목:[강좌] 기초 Graphic Seminar #1                             
올린이:성욱    (최성욱  )    96/03/04 00:01    읽음:126 관련자료 없음

-------------------------------------------------------------------------
----
                              떴다 !! ZeroPage !!
-------------------------------------------------------------------------
--
-------------------------------------------------------------------------
--
                         Graphic Programming Seminar

                       기초  GRAPHIC  SEMINAR  CLASS #1


                                                         강 사  :  최 성 욱


                        제 1 장  GRAPHIC의 시작

⊙ Graphic(그래픽, 화상)이란 단어의 뜻

    문자(text)에 대비되는 개념으로  어떠한 정보를 나타냄에 있어서 문자만이

    아니라  그림, 도표, 사진 등의 회화적인 요소를 사용함을 나타내는 말.

    컴퓨터가 입출력에 있어 문자뿐만 아니라 그림 데이타를 다룰  수 있는 능력.

    간단히 말하면 화면에 임의의 그림을 표시할 수 있는 능력.

    컴퓨터로 그림  데이타를 나타내고, 조작하고, 저장하는 여러  가지 기술을

    연구하는 컴퓨터 과학의 한 분야

    (Computer Graphics)

    주로 문자가 아닌 그림 데이타를 이용하는 컴퓨터의  응용분야. 대표적인

    것으로 CAD, 비디오 게임, 설명 그래픽(presentation graphic), 그래픽

    인터페이스(graphic interface)등이 있다.


  ※ interface란?

    ☞ 서로 다른 두 장치나 회로 사이의 연결을 위해 필요한 제반  사항을

       규정해 놓은 것. 또는 그 규정에 맞추어 두 장비를 연결하는 행위.

□ Graphic Mode

  : 화면이 Text Mode(보통 80  * 25)과 다르게 점(Pixel, Picture Element의 약자)

    으로 이루어져  있다.

    Standard VGA CARD (보통 Video RAM이 128KB임. 가로 * 세로 * 색깔 수)

      320 * 200 * 16
      320 * 200 * 256  ⇒ 많은 color를 필요로 할 때 자주 쓰임.
      640 * 350 * 16
      640 * 400 * 16
      640 * 480 * 16  ⇒ 화면을 자세하게 그릴 필요가 있을 때 자주 쓰임.

   ※ VGA는 Video Graphic Array의 약자이다.

    Super VGA CARD (SVGA) → 각 회사마다 지원하는 Mode가 다르다.

    (아래는 일반적)  기본적으로 위의 Standard VGA의 Mode 포함.

     640  * 480  *  2^24 ≒약 1677만, 일명 true color라 불림
     1024 * 768  *  256
     800  * 600  *  2^15  =32768)
     1280 * 1024 *  16

☆ 이 외에도 Hercules,  CGA, EGA 등의 그래픽 카드가 있으나  알 필요도 없고,

    요즈음에는 거의 쓰이지 않으므로 생략한다.

   ※ 일단 여기서 그래픽 카드에 대한  설명을 간략히 마치고 8∼9 번째 시간

      쯤에 그래픽 카드에 대한 자세한 하드웨어적 사항과 그것을 제어할 수 있는

      심도 깊은 프로그래밍을 접하기로 하겠다.



                     제 2 장  GRAPHIC PROGRAMMING


  이번 시간에는 PASCAL 경륜 숙제를 위한 준비를 위해 PASCAL로써 프로그래밍

하도록 하겠다. 하지만 앞으로 강의는 C와 PASCAL을 병행하는 방향으로 진행될

것이다. 그리고 C의 막강한 System 제어 기능 때문에 점점 하드웨어의 직접 제어를

시도하려고 할 때부터 강의는 C를 중심으로 나아갈 것이다. 자! 그럼 오늘의 목표는

PASCAL로 경륜 게임 만들기!!

  이 1회 세미나물은  이미 강의를 마친 상태에서 작성을 하기  때문에 그리 자세한

설명은 하지 않겠다. 세미나 자료가 늦은 점에 대해 사과 드린다.

  터보파스칼의 그래픽 기능은 GRAPH유닛에 들어 있다. 이  GRAPH 유닛은 보통

TURBO.TPU에 들어 있지 않고 GRAPH.TPU란  화일로 따로 나와 있다. 또한 그래픽을

하기 위해선 이  화일 이외에 볼랜드 그래픽  인터페이스(Borland Graphic inter-

face, BGI)라고 부르는  그래픽 드라이버가 필요하다. 이것은 PC에서 사용되는

그래픽  카드들의 특성이 모두 다르기 때문에 카드마다 알맞은 그래픽 루틴을 사용

하기 위한 것이다. 구체적으로 말하면 다음과 같다.


     그래픽 카드    BGI 드라이버

      CGA, MCGA      CGA.BGI
      EGA, VGA       EGAVGA.BGI
     허큘리스 카드   HERC.BGI
     AT&T PC 6300    ATT400.BGI
      PC 3270        PC3270.BGI
      IBM 8514       IBM8514.BGI


  자신이 컴퓨터에서 사용되고 있는 그래픽 카드에 맞는 BGI 화일을  현재 프로

그램을 수행 시키는  디렉토리에  존재해야  그래픽이  구동된다.  요즈음은 거의

VGA  그래픽  카드를  쓰므로 EGAVGA.BGI라는 화일이 디렉토리에 존재해야  한다.

이 화일들은 보통 터보 파스칼의 하위 디렉토리인 BGI라는 디렉토리에 존재한다.


    텍스트 모드에서 그래픽 모드로 전환하기     :     INITGRAPH( 1, 2, 3);

     1은 그래픽 드라이버로서 INTEGER형 변수를 넣어 주어야 한다.
     2은 그래픽 모드로서 INTEGER형 변수를 넣어 주어야 한다.
     3은 BGI 화일이 있는 디렉토리.    예)  'C:\TP'

    그래픽 모드에서 텍스트 모드로 전환하기     :     CLOSEGRAPH;

    점 찍기     :   PUTPIXEL(X좌표, Y좌표, 색깔 번호);

    선 그리기   :
              LINE(시점의 X좌표, 시점의 Y좌표, 종점의 X좌표, 종점의 Y좌표);

    원 그리기   :   CIRCLE(중심의 X좌표, 중심의 Y좌표, 반지름);

    직사각형 1  :
         RECTANGLE(시점의 X좌표, 시점의 Y좌표, 종점의 X좌표, 종점의 Y좌표);

    직사각형 2  :
         BAR(시점의 X좌표, 시점의 Y좌표, 종점의 X좌표, 종점의 Y좌표);

    화면지우기  :   CLEARDEVICE;

    색깔바꾸기  : SETCOLOR(색깔 번호);                ⇒ 선 색깔을 바꿈
             SETFILLSTYLE(칠해지는 패턴, 색깔 번호);  ⇒ 칠해지는 색깔을 바꿈

    색칠하기    :   FLOODFILL(X좌표, Y좌표, 경계선 색깔 번호);



                          제 3 장  경륜 게임 만들기


  어떤 프로그램을 만들던지 가장 중요한 점은 그 프로그램의 알고리즘(algorithm)

이다.  알고리즘은 간단하게 말해서 어떤  프로그램이 밟는 유한 단계의 과정이나

순서를 말한다.  프로그램을 막상 작성하려고 할 때 어디서부터 손을 대야 할 지

막막하다는 생각이 든다면 먼저 알고리즘을 염두하길 바란다. 즉,  자신이 작성하

려는 프로그램은 어떤 과정을  거쳐야 만족스러운 결과를 얻을 수 있는 지를 먼저

고려하라는 말이다. 필자가 생각하는 경륜 게임의 알고리즘을 살펴 보겠다. (물론

이 방법 외에도 많은 알고리즘이 있을 수 있다.)


  1. 게임의 타이틀

  2. 단승식, 연승식, 복승식 중에서 하나를 고른다. 단승식이라면 3번,
     연승식이라면 12로 간다.

  3. (단승식) 어떤 자전거를 고를 것인가 선택한다.

  4. 그 말에 얼마의 돈을 걸 것인가 입력한다.

  5. 게임 판을 그린다.

  6. RANDOM으로 조그만 막대 한 칸을 움직일 수 있는 자전거를 임의로 고른다.

  7. 그 선택된 자전거의 막대를 한 칸 그리면서 그 자전거의 x좌표를 증가시킨다.

  8. 그리고 나서 그 움직인 자전거의 x좌표가 골인 지점에 닿았는지 본다.

  9. 만약 닿았으면 10번으로 가고 그렇지 않으면 6번으로 간다.

10. 그 골인한 자전거가 자신이 내기를 건 자전거와 동일하면 배당금을 받는다.
     그렇지 않으면 돈의 합산을 줄인다.

11. 돈의 합산이 0보다 작으면 GAME OVER라는 알림과 함께 게임을 끝낸다.
     그렇지 않으면 다시 2번으로 간다.

12. ...(연승식)...


  위의 알고리즘은 단승식만 기재되어 있는 것이다. 연승식, 복승식도 다만 내기를

거는 자전거의 대수와 골인하는 자전거 중 1등외에도 2등, 3등도 알아내야  한다는

것만 다르고 나머지는 단승식과 비슷하다. 위에선  단승식, 연승식, 복승식을 모두

별개의 루틴으로 프로그래밍 했는데  이 세가지 방법을 하나의 루틴으로 만들 수도

있을 것이다. 이를테면, 하나의 루틴 안에

    if (단승식이면) then .....을 수행한다.
    if (연승식이면) then .....을 수행한다.
    if (복승식이면) then .....을 수행한다.

의 세 가지 경우에 따른 수행 과정을 모두 기술하면 될 것이다.

화면 구성은 이렇게 될 것이다.

(위의 알고리즘에서 말한 조그만 막대 하나를 여기선 *로 표시)

   │                              │
A │*******                       │
B │**                            │도
C │***                           │
D │************                  │착
E │**                            │
F │*                             │지
G │*****                         │
H │****                          │점
   │                              │


  필요한 변수는 얼마나 될까?

  각 자전거의  8개의 X좌표, 게임 방법,  돈의 합산, 얼마를 걸지,  GraphDriver,

GraphicMode를 INTEGER로 선언하는 것은  기본이겠고, 그 밖에 프로그래밍을 하다

보면 필요한 변수를 그 때 그 때 선언해 주면서 사용하면 되겠죠.  변수명을 정할

때, 그 변수명만으로 그 변수의 기능을 알 수 있도록 정하는 것과 항상 주석

( (* -- *) )을 다는 습관이 중요!! 행운을 빌어요!
                                                               from 성욱


                                제 4 장   부   록

  ※ GRAPH UNIT(유닛)에 CONST, 즉 정의 되어 있는 그래픽 드라이버와 모드, 색깔

< 그래픽 드라이버 >

  CONST
        DETECT         =  0;    { 자동 감지 ,  주로 쓴다          }
        CGA            =  1;    { CGA                             }
        MCGA           =  2;    { MCGA                            }
        EGA            =  3;    { EGA                             }
        EGA64          =  4;    { 64KB 비디오 램을 가진 EGA       }
        EGAMONO        =  5;    { EGA 흑백                        }
        IBM8514        =  6;    { IBM 8514                        }
        HERCMONO       =  7;    { 허큘리스 카드                   }
        ATT400         =  8;    { AT&T 6300                       }
        VGA            =  9;    { VGA, 우리가 주로 쓰게 되는 것   }
        PC3270         = 10;    { PC 3270                         }


< 그래픽 모드 > : 이제부터는 VGA 용만 싣겠다.

  CONST
        VGALO         = 0;  { 640 * 200,  16 색,  페이지 4개   }
        VGAMED        = 1;  { 640 * 350,  16 색, 페이지 2개    }
        VGAHI         = 2;  { 640 * 480,  16 색, 페이지 1개,
                                   처음에 이것으로 되어 있다.  }


< 색깔의 정의 >

  CONST
        BLACK                 =   0;          {  검은색       }
        BLUE                  =   1;          {  푸른색       }
        GREEN                 =   2;          {  녹색         }
        CYAN                  =   3;          {  하늘색       }
        RED                   =   4;          {  붉은색       }
        MAGENTA               =   5;          {  보라색       }
        BROWN                 =   6;          {  갈색         }
        LIGHTGRAY             =   7;          {  밝은 회색    }
        DARKGRAY              =   8;          {  진한 회색    }
        LIGHTBLUE             =   9;          {  밝은 푸른색  }
        LIGHTGREEN            =  10;          {  밝은 연두색  }
        LIGHTCYAN             =  11;          {  밝은 하늘색  }
        LIGHTRED              =  12;          {  밝은 주홍색  }
        LIGHTMAGENTA          =  13;          {  분홍색       }
        YELLOW                =  14;          {  노란색       }
        WHITE                 =  15;          {  흰색         }

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 126번
제  목:[강좌] 기초 Graphic Seminar #2                             
올린이:성욱    (최성욱  )    96/03/04 00:02    읽음: 74 관련자료 없음

-------------------------------------------------------------------------
----

                             떴다 !! ZeroPage !!
-------------------------------------------------------------------------
--
-------------------------------------------------------------------------
--
                         Graphic Programming Seminar

                      기초  GRAPHIC  SEMINAR  CLASS #2


                                                        강 사  :  최 성 욱


                      제 1 장  GRAPHIC PROGRAMMING (2)


  지난 시간에 배운 것에 이어 파스칼로 그래픽 프로그래밍할 때 자주 쓰이는

프로시저와 함수들을 소개하기로 한다. 숙제인  경륜 게임 프로그램을 만약

그래픽으로 짠다면 숙제하는  데도 무척 도움이 될 것이다.


    지정한 위치의 좌표로 현재 위치를 옮긴다
        : MOVETO(X좌표, Y좌표);

    현재의 위치에서 지정한 좌표까지 선을 그려 준다.
        : LINETO(X좌표, Y좌표);

    현재의 X좌표를 되돌려 주는 함수 : GETX:INTEGER;

    현재의 Y좌표를 되돌려 주는 함수 : GETY:INTEGER;

    선의 형태를 바꾸어 주는 프로시저
        : SETLINESTYLE(라인 스타일, 패턴, 선의 두께);

    3차원 막대를 그려주는 프로시저
        : BAR3D(시점X, 시점Y, 종점X, 종점Y, 두께, TOP);

    원호를 그리는 프로시저
        : ARC(X좌표, Y좌표, 시작각도, 끝각도, 반지름);
             ⇒ 여기서의 각도는 라디안(호도)이 아니고 그냥 도(。)임.

    타원이나 타원호를 그리는 프로시저
        : ELLIPSE(X좌표, Y좌표, 시작 각도, 끝 각도, X반지름, Y반지름);

    속이 찬 부채꼴을 그려주는 프로시저
        : PIESLICE(X좌표, Y좌표, 시작각도, 끝각도, 반지름);

    속이 찬 완전한 타원을 그려줌
        : FILLELLIPSE(X좌표, Y좌표, X반지름, Y반지름);

    속이 찬 타원 부채꼴을 그려줌
        : SECTOR(X좌표, Y좌표, 시작각도, 끝각도, X반지름, Y반지름);


  만약  그래픽 모드에서  글씨를  쓰려고 한다고  치자. 우리는  TEXT  MODE에서

WRITE나 WRITELN이란 프로시져를 써서 글자를 화면에  출력시켰다. 그런데 BGI와

GRAPH.TPU를 이용한 파스칼 그래픽 모드에서는  WRITE나 WRITELN으로는 화면에

글씨를 출력시킬 수  없다. 그래서 파스칼 내에 이를 해결하는  그래픽 전용 글자

폰트(글자꼴) 들이 있다. 보통 파스칼의  BGI라는 디렉토리 안에 있는데 확장자가

CHR인 화일들이 바로 그것이다.


    글자를 출력해 주는 프로시저
        : OUTTEXTXY(X좌표, Y좌표, '써 주고 싶은 말들');
        : OUTTEXT('써 주고 싶은 말들');  ⇒ 현재의 위치에 출력

    글자 스타일을 조정하는 프로시저
        : SETTEXTSTYLE(폰트, 방향, 폰트 크기);

    정렬 방식을 조정하는 프로시저
        : SETTEXTJUSTIFY(수평선, 수직선);

    원하는 크기로 글자 크기를 조정
        : SETUSERCHARSIZE(가로 확대 배율, 가로 축소 배율,
                          세로 확대 배율, 세로 축소 배율);

    현재 설정된 글자의 높이를 되돌려 주는 함수    : TEXTHEIGHT(스트링):WROD;

    현재 설정된 글자의 폭을 되돌려 주는 함수      : TEXTWIDTH(스트링):WORD;


  자, 이제 단순한 그래픽 프로시저들과  함수들에 대해 간략히 살펴 보았다.

이것들을 잘 이용하면 자신이 원하는 그래픽을 대충은 구현할 수 있을 것이다.

무엇보다 중요한 것은 이 프로시저들과 함수들을 한번씩 실행시켜  보는 일이다.

그렇게 함으로써 자신도 모르는 사이에  조금씩 익혀야만 한다. 이 외에도 이미지

관련 부분이 있으나 그것에 대한 것은 다음 시간에 하도록 하겠다.



             제 2 장  GRAPHIC PROGRAMMING EXERCISE


  지난 시간에 경륜  게임의 알고리즘을 대강 설명했지만  실습을 하지 못했었다.

그래서  숙제로 내주긴 했지만 많은 사람들이 실행해보지 않았으리라 생각되므로

이번 시간에는 강의 계획서에는 없지만 지난 시간에 배운 부분에 대해 실습을 하는

시간을 갖도록 하겠다.

  그에 앞서 프로그래밍을 배우는 사람들이 명심해야 할 좋은 격언들을 소개할까

한다.

  " 프로그래밍을 하려면 끈기와 노력을 가져라!! "

  " 백문이 불여일타이다. 즉 백번 듣고 배우는 것보다 한번 쳐보는게 훨씬 낫다. "

  " 모르는 것은 부끄러운 일이 아니다.
    다만 그 모르는 것을 알려고 하지 않는 것이 부끄러운 일이다."

  " 진정한 배우는 사람이라면 쪽팔림을 버려야 한다. "

  " 모르는 것이 있으면 CTRL+F1을 이용하여라!!! "  ☞ C나 PASCAL 얘기


실습 1. 텍스트 모드에서 엔터를  치면 그래픽 모드로 전환됐다가 다시 엔터를 치면

        텍스트 모드로 전환되면서 프로그램을 종료시키는 프로그램을 작성하여라.

        힌트) INITGRAPH, CLOSEGRAPH, 그리고 READLN; 이나 READKEY를 쓸 것.


실습 2. 그래픽 모드에서  화면 중앙에 CYCLING RACING GAME이라고 쓰여져 있다가

        엔터를 치면 화면이 클리어 되며  텍스트 모드로 전환하면서 프로그램을

        종료시키는 프로그램을 작성하여라. 단, FONT는  TRIPLEX FONT를 써야 하며

        폰트 크기는  4로 하여라. 그리고 색깔은 파란색으로 할 것.

        힌트) SETTEXTSTYLE, OUTTEXTXY, SETCOLOR


실습 3. 화면 중앙에 빨간색으로  칠해진 반지름이 10인 원을 그리고 화면에 제일

        가장자리 선을 연결하여 직사각형을 만들되 테두리를  노란색으로 할 것.

        'A'를 치면 텍스트 모드로  전환되며 프로그램을 끝내고 그렇지 않으면

        계속 그 상태를 유지하는 프로그램을 작성하여라.

        힌트) READKEY, FLOODFILL, SETFILLSTYLE


실습 4. 0부터 10까지의 수 중에서  임의로 3개를 추출한 수를 화면에 출력하여라.

        단, 그래픽 모드여야 하며 폰트는 SANSSERIFFONT를 이용하여라. 폰트

        크기는 5이다.

        힌트) RANDOM, SETTEXTSTYLE, OUTTEXTXY


실습 5. 그래픽 모드에서 (50,200)좌표를 왼쪽 끝 점으로 하는 20*20 크기의

        사각형을 출력하고 1초 마다 한 칸 씩 사각형이 오른쪽으로 붙는, 즉

        막대의 길이가 점점 길어지는 프로그램을 작성하라. 점점 길어지다가

        20번째 사각형이 붙는 순간 프로그래을 종료시켜라. 색깔은 녹색으로

        해야 하며 채워진 사각형이어야 한다.

        힌트) DELAY, BAR, SETFILLSTYLE


실습 6. 자! 이제 완전한 경륜 게임 프로그램을 작성해보자! 경륜 게임의

        알고리즘은 지난 시간에 언급했고 구동되는 주요 엔진은 위에서 푼 것이다.

         이제 무엇이 두려우랴?


  풀다가 의문나는 점이 있으면 언제든지 물어 보길 바라며, 물어 보는 것을

두려워 않기를.... 그리고 항상 옆에 있는 친구에게 물어 보면서 사이좋게

지내기를.... 행운을 빌어요!!
                                                            from 성욱


                             제 3 장   부   록


※ GRAPH UNIT(유닛)에 CONST, 즉 정의되어 있는 LINE STYLE과, FILL PATTERN,

  그리고 그래픽 FONT( 글자꼴)과 글자의 방향

< LINE STYLE ← SETLINESTYLE >

  CONST
        SOLIDLN       =  0;    { 실선           }
        DOTTEDLN      =  1;    { 점선           }
        CENTERLN      =  2;    { 일점 쇄선      }
        DASHEDLN      =  3;    { 은선           }
        USERBITLN     =  4;    { 사용자가 정의하는 모양       }

        NORMWIDTH     =  1;    { 가는 선       }
        THICKWIDTH    =  3;    { 굵은 선       }


< FILL PATTERN ← SETFILLSTYLE >

  CONST
        EMPTYFILL           =   0;          {  배경색으로 채움, 즉 지움     }
        SOLIDFILL           =   1;          {  채움색으로 꽉 채움           }
        LINEFILL            =   2;          {  가로 줄무늬로 채움           }
        LTSLASHFILL         =   3;          {  빗금으로 채움                }
        SLASHFILL           =   4;          {  두꺼운 빗금으로 채움         }
        BKSLASHFILL         =   5;          {  두꺼운 오른쪽 빗금으로 채움  }
        LTBKSLASHFILL       =   6;          {  오른쪽 빗금으로 채움         }
        HATCHFILL           =   7;          {  가는 해칭                    }
        NHATCHFILL          =   8;          {  굵은 해칭                    }
        INTERLEAVEFILL      =   9;          {  회색으로 채움                }
        WIDEDOTFILL         =  10;          {  듬성듬성한 점으로 채움       }
        CLOSEDOTFILL        =  11;          {  조밀한 점으로 채움           }
        USERFILL            =  12;          {  사용자가 정의하는 채움 무늬  }


< 그래픽 글자 FONT와 방향 정의 ← SETTEXTSTYLE >

  CONST
        DEFAULTFONT        =   0;          {  8x8 비트 맵 글자꼴   }
        TRIPLEXTFONT       =   1;          {  TRIP.CHR  }
        SMALLFONT          =   2;          {  LITT.CHR  }
        SANSSERIFFONT      =   3;          {  SANS.CHR  }
        GOTHICFONT         =   4;          {  GOTH.CHR  }

        HORIZDIR           =   0;          {  왼쪽에서 오른쪽으로   }
        VETDIR             =   1;          {  아래에서 위로         }

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 127번
제  목:[강좌] 기초 Graphic Seminar #3                             
올린이:성욱    (최성욱  )    96/03/05 10:37    읽음: 62 관련자료 없음

-------------------------------------------------------------------------
----

-------------------------------------------------------------------------
--
                        GRAPHIC PROGRAMMING SEMINAR
                              떴다! ZeroPage!
-------------------------------------------------------------------------
--

                         GRAPHIC SEMINAR CLASS #3

                                                           강 사 : 최성욱

                제 1 장  GRAPHIC PROGRAMMING  in  C


  지난 시간까지는 PASCAL 언어를  이용한 그래픽 프로그래밍을 했었다. 지금까지

잘해주신 여러분께 거듭 감사드리며 이제부터는 막강한 System 제어 기술을 가진

C 언어로 프로그래밍을 해보는 시간을 갖도록 하겠다. 앞으로도 많은 협조를

바란다.

  결론부터 말하자면 TURBO PASCAL과 TURBO C은 모두 Borland사에서 만들었기

때문에 둘 다 BGI를 사용하며 또한 그래픽  함수의 용례와 쓰임이 거의 같으며

파스칼에서의 GRAPH 유닛 대신에 graphics.h라는 헤더 화일을 이용한다.

  참고로 여러분도  아시다시피 PASCAL에서는  프로시져(PROCEDURE)와 함수

(FUNCTION)라는 것이 있다. 즉, 되돌림 값의 유무에  따라 FUNCTION와 PROCEDURE

으로 나눈 것이다. 그러나  C언어에서는 프로시져와  함수를 구분하지  않고

되돌림  값이  있든 없든  간에 모두  함수(FUNCTION)라고 부른다. 그리고

PASCAL에서는 대소문자 구별이 없는 반면,  C언어에서는 대소문자 구별이 있다.

   C언어에 대해 자신감이 없는 사람이라면 1학기 때 배운 것들을 잘 상기시켜

보고 또한 직접 실습을 해보는 것이 좋을 것이다. 궁금한  사항이 있으면 언제

든지 필자에게 연락하기 바란다.


  ( 최성욱 : 자택 (02) 649-1549,  (Pager) 015-141-1406,
             (나우누리 아이디) : 성욱  )
  ( 인터넷 사이트 : csucom@dragonar.nm.cau.ac.kr  )


자, 이제  본격적인 프로그래밍을 해보도록  하자. PASCAL에서  TEXT MODE에서

GRAPHIC MODE로 전환하는  프로시져는 INITGRAPH였다. C에서도 마찬가지로

initgraph라는 함수가 있다. 다른 점이라면  가로 안에 들어가는 세 가지  인자

중에서 그래픽 드라이버나 그래픽  모드를 integer형으로 선언하여 넣는  것은

PASCAL과 같지만 다만 C에서는 넣어줄  때 그 변수의 주소 값을 넣어 주어야 한다.

  그 외에 기본적인 그래픽 함수들을 나열해 보겠다.

  initgraph     closegraph  line         circle     rectangle  bar
  bar3d         ellipse     putpixel     floodfill  setcolor   setfillstyle
  settextstyle  outtextxy   cleardevice  moveto     lineto

  위에서 소개한 그래픽 함수들은 PASCAL과 모두 같다. 즉,  TURBO PASCAL이나

TURBO C, Borland C는 모두 Borland사에서 만든 언어이기 때문에 공통된  부분이

많다. 그 중, 자체 내장하고 있는 그래픽  함수들은 C와 PASCAL이 거의  모두

같다. 위의 함수들에 들어가는  인자가 잘 생각이 나지 않는 사람은 1회와  2회

세미나 물을 참조하기 바란다. 그렇다면 이제 C로도 간단한 그래픽 프로그래밍을

할 수가 있을 것이다. C도 별거 아니죠?

  자, 이제 2장에서는  image에 관련된 부분이 나오는데 그곳에서는 포인터라는

것이 나온다. 일반적으로 포인터에 대한 막연한 두려움을 갖고 있는 경우가 많은데

그러지 말자. 정 모르겠다 싶으면 일단은 쓰는 방법만 아는 정도로 넘어 가고

나중에 다시 복습하는 방법을 취하는 게 좋다.

  포인터의 쓰임새 =>   *는 값을 나타 내고, &는 주소를 나타낸다.


                 제 2 장   BIT IMAGE GRAPHIC  in  C


  비트 이미지란 화면에 나타난  그림을 그대로 떠낸 데이타를 가리킨다. 다시 말해

화면에 나타나는 그림을 저장하는 비디오  램의 일부분을 그대로 가져온 것이다.

이에 관련된  함수들에는 다음과 같은 것들이 있다.


getimage(시점의 x좌표, 시점의 y좌표, 종점의 x좌표, 종점의 y좌표, 포인터 변수);
putimage(x좌표, y좌표, 포인터 변수, 출력 방식);


  getimage는 지정된 좌표 크기의  화면을 넣어준 포인터 변수에 대응시키며

putimage는  넣어준 포인터 변수에 할당되어 있는 화면을 지정해 준 위치에 지정한

출력 방식으로 뿌려 준다. 하지만 getimage할 때의 그 포인터 변수는 memory

allocation이 되어 있어야 한다. 즉, 그 이미지의 크기만큼이 다른 변수로 부터

침해 받지 않는 독립된 메모리여야  한다는 뜻이다. 그리고 그 이미지의 크기에

맞춰 필요한  메모리를 알아내는 그래픽 함수가 바로 imagesize이다. 말로만으로는

잘 이해가 안 갈 것이다. 다음 예제를 실행시켜 보면서 그 쓰임새를 익혀 보자.

    #include
    #include
    #include
    #include
    #include

    void main(void)
    {
        int gd=DETECT,size,i,j,b;
        char *a;
        initgraph(&gd,&gm,"c:\\lang\\bc\\bgi");
                                  /* 디렉토리는 각자 알맞은 디렉토리로 */
        for(i=0;i<200;i++) {
                j=random(70);
                b=random(25);
                gotoxy(j,i);
                printf("GRAPHICS");
                }
        size=imagesize(100,100,200,200);
        a=(char*)malloc(size);
        getimage(100,100,200,200,a);
        getch();
        cleardevice();
        floodfill(100,100,1);
        putimage(300,300,a,COPY_PUT);
        getch();
        closegraph();
    }

  참고로 이 예제는 TC나 BC++의 컴파일러를 쓰면 무난할 것이다. 그리고 비록

이 예제는 C 언어이지만 PASCAL에서도 비슷한 프로그램으로 같은 효과를 얻을

수 있다. 물론 똑같지는 않다.


                  제 3 장   Keyboard Control  in  C


  자, 이제 각종 기법 등을 알아보자. 이번 시간에는 먼저 키보드 제어 루틴에

대해 알아보겠다. 게임에서 가장 중요한 처리 과정이기도 한  이 부분은 어떠한

키 값이 들어오길 기다리고 있다가 즉, 키보드가  눌리기를 기다리고 있다가

키보드가 눌리면  그 눌린 키에 따라 정해진  과정을 수행하는 루틴이다. 일단

소스를 보기로 한다.

  #include   /* kbhit 함수 때문에 썼음 */
  #include    /* bioskey 함수 때문에 썼음 */
  #include   /* printf 함수 때문에 썼음 */

  #define UP      0x4800   /* 이렇게 define하는 습관을 기르기 바란다. */
  #define DOWN  0x5000   /* 각 키에 대응하는 key board scan code 값 */
  #define LEFT   0x4b00
  #define RIGHT  0x4d00
  #define ENTER 0x1c0d
  #define ESC    0x011b

  void main(void)
  {
  int key;                  /* key를 integer로 정의한다 */
  do{
    if (kbhit()) {
                /* kbhit라는 함수는 키보드로 입력을 받으면 참값을 돌린다 */
        key=bioskey(0);          /* bioskey(0) 함수는 눌린 키에 대응되는 */
        switch(key){       /* keyboard scan code값을 돌리고 버퍼를 비운다 */
            case UP:       /* key에 눌린 키의 keyboard scan code 값이 */
                printf("UP!\n");              /* 들어감 */
                break;
            case DOWN:
                printf("DOWN!\n");
                break;
            case LEFT:
                printf("LEFT!\n");
                break;
            case RIGHT:
                printf("RIGHT!\n");
                break;
            case ENTER:
                printf("ENTER!"\n);
                break;
            case ESC:
                goto Ending;     /* Ending이라는 Label로 간다 */
            }
        }
    }while(1);        /* 무한 루프를 돌린다 */
  Ending:                /* Label */
  printf("The End");
  }

  위에서 kbhit()함수는 bioskey(1)과 같은 역할을 (아마도) 한다.  위에서

define한 keyboard scan code 값은 외울 필요는  없지만 필요할 때마다 그때그때

쓸 수  있도록 노트 등에 메모해 두도록 한다. 자주 쓰이는 keyboard scan code

값은 다음과 같다.

                              ■
    키보드명 ┕키스캔코드값    키보드명   ┕키스캔코드값 
                               
      UP     ┕   0x4800          F1      ┕  0x3b00     
             ┕                           ┕             
     DOWN    ┕   0x5000          F2      ┕  0x3c00     
             ┕                           ┕             
     LEFT    ┕   0x4b00          F3      ┕  0x3d00     
             ┕                           ┕             
     RIGHT   ┕   0x4d00          F4      ┕  0x3e00     
             ┕                           ┕             
     ENTER   ┕   0x1c0d         F10      ┕  0x4400     
             ┕                           ┕             
      ESC    ┕   0x011b        PAGE UP   ┕  0x4900     
             ┕                           ┕             
      TAB    ┕   0x0f09        PAGE DOWN ┕  0x5100     
                              ■

  keyboard scan code 값은 간단한  프로그램을 짜서 알아볼 수도 있고 tools 등의

소프트웨어를 이용하면 알아낼 수 있다.


  자, 이제 즐거운 실습 시간이 돌아 왔습니다. 오늘 배운 것을 실습을 통해

복습해 봅시다.


  실습 1. 위의 두 예제 프로그램을 실행시켜 보아라.


  실습 2. 좌표(300,200)을 왼쪽 윗 끝 점으로 한 50*50 크기의 녹색으로 채워진

          사각형을 그려라. 그리고 키보드의 입력을 받을 때까지 기다리고 있다가

          왼쪽 버튼을 누르면 그 사각형이 왼쪽으로 가고, 오른쪽 버튼을 누르면

          오른쪽으로 가며, 또한 ESC키를 누르면 빠져 나가는 프로그램을

          작성하라.단, image를 쓰지 말 것이며, C로 작성할 것.

          힌트) bar, setfillstyle, kbhit, bioskey


  실습 3. 화면 왼쪽 구석에 CSU라는 영어를 출력하여라. 그리고 아무 키나 누르면

         그 CSU라는 말이 오른쪽으로 움직이는  프로그램을 작성하여라. 단,

         TRIPLEX_FONT를  쓸 것이며, 크기는 4로 한다. C로 작성할 것.

          힌트) settextstyle, outtextxy, imagesize, getimage, putimage, malloc,


                getch


  실습 4. 아래쪽에 조그마한  비행기를 그리고 키보드의 입력을 기다리다가 왼쪽

          버튼을  누르면 왼쪽으로 움직이며, 오른쪽 버튼을 누르면 오른쪽으로

          움직이고, 또한 스페이스 바를 누르면 미사일이 나가는 프로그램을 C로

          작성하여라.  단, 비행기의 모양과 미사일의 모양에는 제한이 없으나

          되도록 이쁘게 그리도록 한다.


  실습 5. 실습 4에서의 비행기 프로그램에서 다음 두가지 사항을 만족시켜라.

         비행기의 위치는 아무리 키를 계속 누르더라도 화면을 벗어나서는 안된다.

         미사일이 발사되어 미사일이 올라 가는 동안 비행기의 좌우 움직임이

         가능하다.


  실습 6. 실습 5의 비행기 프로그램에다가  적을 화면 위부분에 투입 시켜라.

          그리하여 미사일이 적에게 맞았을 때 게임을 종료시키는  일종의 겔러그

          게임을 만들어라. 단, 적은 좌우로 움직인다.


  다음 시간에는 PASCAL에서의 IMAGE PROGRAMMING과 C에서 MOUSE  제어에 
대해

공부하며 간단한 그래픽 에디터를 작성해 보도록 하겠다.

아무쪼록 열심히 해주시길...
                                                              from 성욱

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 128번
제  목:[강좌] 기초 Graphic Seminar #4                             
올린이:성욱    (최성욱  )    96/03/05 11:23    읽음: 59 관련자료 있음(TL)

-------------------------------------------------------------------------
----

-------------------------------------------------------------------------
--
                        GRAPHIC PROGRAMMING SEMINAR
                              떴다! ZeroPage!
-------------------------------------------------------------------------
--

                         GRAPHIC SEMINAR CLASS #4

                                                            강 사 : 최성욱

                     제 1 장   MOUSE CONTROL  in  C


  일단 위의 DOS.H에서 REGS를 쓴다고 main 함수의 앞 쪽에 선언해야 한다.

    union REGS r;

  여기서 r은 레지스터 변수의 집합을 나타내는 것으로서 임의로 이름을 바꿀 수

있다. 그리고 나서 Mouse Driver의 기능에 따라  레지스터를 얻고자 하는 서비스에

맞추어야 한다. 그렇다면, 그 Service는  무엇이고 어떻게 레지스터를 맞추느냐?

  먼저  이걸 알아두세요. C언어에서 Interrupt를 호출해 주는 함수가 있다.

바로 int86이라는 함수이다. 사용법은 다음과 같다.


    int86( int interrupt number, union REGS *in, union REGS *out);


  이것만 보면  솔직히 잘 모르겠죠.  예를 들기로 하죠.  마우스 제어 서비스

Interrupt number는 0x33, 십진수로 51이다. 그리고  위에서처럼 레지스터 변수의

집합을 나타내는 것으로 r을  썼다면 예는 이렇게 된다.


    int86(0x33,&r,&r);


1. Resetting the Mouse (마우스의 초기화 : 마우스가 화면상에 나타남)

    레지스터 ax=0

    사용법 : r.x.ax=0;
             int86(0x33,&r,&r);

    결  과 : 실패 ☞ 마우스 드라이버가 없을 때 ☞ ax=0;
             성공 ☞ ax=0xffff


2. 마우스 커서 표시

    레지스터 ax=1

    사용법 : r.x.ax=1;
             int86(0x33,&r,&r);

    결  과 : 없음 ☞ 무조건 나타남 (단, 마우스 (드라이버) 없을 때 제외)


3. 마우스 커서 지우기

    레지스터 ax=2

    사용법 : r.x.ax=2;
             int86(0x33,&r,&r);

    결  과 : 없음 ☞ 무조건 지워짐 (단, 마우스 (드라이버) 없을 때 제외)


4. 마우스 상태 조사

    레지스터 ax=3

    사용법 : r.x.ax=3;
             int86(0x33,&r,&r);

    결  과 :
          Ⅰ. r.x.bx ☞ 버튼 상태가 들어감

             . r.x.bx=0 : 버튼을 누르지 않았음
             . r.x.bx=1 : 왼쪽 버튼을 눌렀음
             . r.x.bx=2 : 오른쪽 버튼을 눌렀음
             . r.x.bx=3 : 왼쪽과 오른쪽 버튼을 동시에 눌렀음
             . r.x.bx=4 : 가운데 버튼을 눌렀음 (가운데 버튼이 있을 때만)

         Ⅱ. r.x.cx ☞ 현재 마우스의 x좌표가 들어감

         Ⅲ. r.x.dx ☞ 현재 마우스의 y좌표가 들어감



                        제 2 장   Page Programming


  이 부분은 C 언어와 PASCAL에서 모두 동일하게 프로그래밍 할 수 있다.


    640*480*16 Mode  :  Page 한 장   ☞  VGAHI

    640*350*16 Mode  :  Page 두 장   ☞  VGAMED

    640*200*16 Mode  :  Page 네 장   ☞  VGALO


* 원하는 페이지를 화면에 보이게 하는 명령어

                   setvisualpage( int page number );


* 우리가 작업하려는 페이지를 고르는 명령어

                   setactivepage( int page number );


  자, 이제 기다리고  기다리던 실습 시간이 돌아 왔습니다. 실습을  통해

오늘 배운 것을 복습해 봅시다. 특히 오늘 배운 것은 간단하므로 빨리 끝내고

집에 갑시다.

  아참, 그리고 지난 시간에 예고했었던 PASCAL로 BIT IMAGE 구현은 다음 시간에

할께요. 요즘 좀 바빠서요. 히히...

  열심히 하세요. Do your best!
                                                          from. 성욱 과


실습 1. TEXT MODE에서 마우스를 띄워 보아라. 즉, 마우스 커서가 화면에

         나오도록 만들어라.


실습 2. GRAPHIC MODE에서 마우스를 띄워 보아라.  1번과 동일하나 단, 마우스의

         왼쪽 버튼을 클릭하면 프로그램이 종료되어야 한다.


실습 3. 가운데에 SAN SERIF FONT를 이용하여 1만큼의 크기로 COPY라고 쓴 후

        PAGE 기법을 이용하여 그 글씨가  점점 커지는 프로그램을 작성하시오.

        단 최대 크기는 10으로  하고  색깔은 노란색으로 하시오.


실습 4. (100,100)의  좌표에 50*50의 사각형을 그리고 녹색으로  그 안에

        CSU라고 써라. 그리고 마우스를 띄워서 그 안에다 대고 왼쪽 버튼을

        클릭하면 프로그램을 종료시키는 프로그램을 작성하여라. 단, 그 상자

        외의 다른 부분에 마우스를 클릭하면 아무 반응도 보이지 말아야 한다.


실습 5. 그래픽 모드에서 마우스를 띄운 후 한번 마우스 왼쪽 버튼을 누르고

        다른  곳에 가서 또 한번 마우스 버튼을 누르면 처음 마우스를 눌렀던

        부분부터 두번째 눌린 곳까지 선을 그리는 프로그램을 작성하여라.


실습 6. 실습  5의 내용을 계속 반복하다가  ESC를 누르면 프로그램을 종료시키는

         프로그램을 작성하여라.



피에스...위의 강좌를 보니..개념적인 설명이 너무 부족했군요.

         작년 가을, 제가 세미나를 할 당시 좀 바빠서 개념적인 설명은 모두

         세미나 시간에 말로 설명했던 걸로 기억되네요. 워드 치는데 시간이

         오래걸리거든요. 후후...

         제가 나중에 다시 개념적인 것은 자세히 올리지요.

         그럼 도움되세요..건강하시구요..이만 통통...


                                                        여러분의 성욱..

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 129번
제  목:[강좌] 기초 Graphic Seminar #5                             
올린이:성욱    (최성욱  )    96/03/06 11:42    읽음: 56 관련자료 없음

-------------------------------------------------------------------------
----

-------------------------------------------------------------------------
--
                        GRAPHIC PROGRAMMING SEMINAR
                              떴다! ZeroPage!
-------------------------------------------------------------------------
--

                         GRAPHIC SEMINAR CLASS #5

                                                            강 사 : 최성욱

                     제 1 장   BIT IMAGE  in  PASCAL


이번 시간에는 3회 때 C로  했던 BIT IMAGE PROGRAMMING에  이어 PASCAL로 BIT
IMAGE

구현을 알아 보도록 하겠다. 일전에도 말했듯이 원래 우리가 지금 쓰는 TURBO

PASCAL이나 TURBO C, BORLAND C++ 등은 모두 BORLAND라는 회사에서  만든 것
이기

때문에 비슷한 내용들이 아주 많다. 특히 같은 BGI(Borland Graphic Interface)를

쓰는 내장 Graphic Programming의 경우는 거의 같다고 해도 과언이 아니다.

  그렇기 때문에 PASCAL에서의 BIT IMAGE PROGRAMMING도 C와 거의 같다. 다만,

포인터의 기호가 C와 다르다는 점에는 주목할 필요가 있다. C에서 포인터는 보통,


    char *ptr;


이렇게 선언한데 반해서, (다들 PASCAL시간에 배웠겠지만...) PASCAL에서는,


    VAR
        PTR : POINTER;


이렇게 선언해야 한다.

  C에서 getimage, putimage라는 함수를 사용했던 것을 모두 기억할 것이다.

PASCAL에서도 같은 이름인 GETIMAGE, PUTIMAGE라는 프로시져를 사용한다.

(PASCAL에서는 대소문자 구별 없는 거 아시죠?) 다만, 포인터의 기호가 약간

다르기 때문에 아규먼트를 passing해줄 때 주의해야 한다.

  그리고 C에서 getimage를 하기 전에 그 이미지 만큼의 memory allocation을

해주어야 한다는 사실 또한 기억할 것이다. C에서는 malloc이라는 함수를 썼지만,

PASCAL에서는 malloc 대신 GETMEM이라는 프로시져를 쓴다. 그리고 C와 동일하게

이미지 만큼의 memory를 알아내는 함수로 IMAGESIZE라는 함수를 쓴다.

  자, 예를 들기로 한다.

  만약 PASCAL에서 앞에서 처럼 포인터를 선언하고 쓴다면,

    USES
        CRT,GRAPH;

    VAR
        PTR : POINTER;
        SIZE : WORD;

    BEGIN
        .....   (*  그래픽 모드 선언부는 생략했음  *)

        SIZE := IMAGESIZE(100,100,200,200);
        GETMEM(PTR,SIZE);
        GETIMAGE(100,100,200,200,PTR^);
        .....

        PUTIMAGE(150,150,PTR^,COPYPUT);

        ....

    END.


  이런 식으로 쓸 수 있다. 대충 쓰임새를 알 수 있을 것이다. 여기서 포인터를

...포인터명^... 이렇게 꺽쇠를 쓴 것에 주의하라. 참고로 꺽쇠를 앞에다가 붙이면

C에서의 &(주소 참조 연산자)가 된다.

  PUTIMAGE의 마지막 인자인 COPYPUT은 C에서의 COPY_PUT과 동일하다. C와

마찬가지로 PASCAL에도 ORPUT, XORPUT, ANDPUT, NOTPUT 등이 있다.

  위와 같이 프로그램이 GETIMAGE를 이용해 (100,100)를 왼쪽 윗 점으로 하고

(200,200)을 오른쪽 아래 점으로 하는 사각형의 그림을 PTR이라는 포인터 변수에

저장시키고, PUTIMAGE를 이용해 (150,150)의 좌표에 PTR이라는 포인터 변수에

저장된 그림(BIT IMAGE)을 그대로 출력해 준다.



                     제 2 장   부  록


    CONST
        NORMALPUT   =   0;  { 그대로 출력 }
        COPYPUT     =   0;  { 그대로 출력 }
        XORPUT      =   1;  { 배경과 XOR하여 출력   }
        ORPUT       =   2;  { 배경과 OR하여 출력    }
        ANDPUT      =   3;  { 배경과 AND하여 출력   }
        NOTPUT      =   4;  { 이미지를 반전하여 출력}


  이번 회 강의는 무척 간단했다고 생각된다. 하지만, 꼭 복습하길 바라며 이번 회

강의를 마칠까 한다. 항상 열심히 하는 중앙대학교 컴퓨터공학과 학우 여러분이

되셨으면 좋겠다.
                                                             from  성욱
피에스..

                여러분.. 이건 꼭 기억하세요..다들 아시겠지만..

                1 byte = 8 bit

                1 word = 2 byte

        1 nibble = 4 bit

                integer의 범위 : -32768 <= x <= 32767

        unsigned integer의 범위 : 0 <= x <= 65535

                character의 범위 : -128 <= x <= 127

unsigned character의 범위 : 0 <= x <= 255

                1 float = 4 byte = 1 double word

출력이 끝났습니다. [Enter]를 누르십시오.

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 130번
제  목:[강좌] 기초 Graphic Seminar #6                             
올린이:성욱    (최성욱  )    96/03/06 11:43    읽음: 87 관련자료 없음

-------------------------------------------------------------------------
----

-------------------------------------------------------------------------
--
                        GRAPHIC PROGRAMMING SEMINAR
                               떴다! ZeroPage!
-------------------------------------------------------------------------
--

                          GRAPHIC SEMINAR CLASS #6

                                                           강 사 : 최성욱

                    제 1 장   Palette Control  in  C


  VGA Video  Card 안에는  DAC이란 것이  있어 디지탈 신호를  아날로그 신호로

바꾼다. 그 DAC 안에는 Palette와 Look  up table이란 것이 있다. Palette가 바로

우리가 직접  색 번호로 지정했을 때 쓰는 색이다. 즉 16색이란 Palette가 16개

있다는 뜻이다. 그러나 그 Palette 자체에 색이 있는 것은 아니다. Palette는

Look up table이라는 RGB 값의  조정판에서 16가지의 색깔을 대응시켜 보여주는

중간체 역할을  할 뿐이다. Look up table은 빛의 삼원색으로 색깔을  만드는

장소이다. 그림으로 나타내면 다음과 같다.



           ┌────┐  Lookuptable  ┌───┬───┬───┐
Palette   │   o    │---------+  ☞ │  R   │  G   │   B  │
       ☞  ├────┤         |     ├───┼───┼───┤
           │   1    │------+  +-----│  0   │  0   │   0  │ -+
           ├────┤      |        ├───┼───┼───┤  |
           │   :    │      +--------│  ?   │  ?   │   ?  │  +- 아래로
           │   :    │               ├───┼───┼───┤  |   256개
           ├────┤   +-----------│ 63   │  63  │   63 │  |
  모니터<--│  15    │---+           ├───┼───┼───┤  |
           ├────┤               │  :   │  :   │   :  │ -+
           │        │               │      │      │      │


이와 같이  되어있다. 그러므로 잘  만 하면 256  color의 효과도 낼  수 있는

것이다.  왜냐하면 Look up table 의 수치도 바꿀 수 있고 Palette 지정도 임의로

바꿀 수 있기 때문이다. 위의  63은 RGB 각각 6비트 씩 잡았을 때의 최대치이다.

왜냐구요?  2^6 = 64 니까..

예)  연두색 : R31 G63 B31
     하늘색 : R31 G31 B63
     회  색 : R31 G31 B31
     노란색 : R63 G63 B0

참, 일반 EGAVGA.BGI에서는  16 color 이상은 안됨.  하지만 Super VGA용 BGI가

있다고 함. 모드를 소개 하자면 다음과 같음.


     640 X 480 X 256
     800 X 600 X 256
    1024 X 768 X 256


자, 그럼 다시 프로그래밍의 세계로....

앞의 그림에서 보았듯이 팔레트와  룩엎 테이블은 1대 1대응 (수학에서의 개념과

다름) 으로  되어 있다. 그럼 그  팔레트와 룩엎 테이블과의 관계를 바꾸는 명령은

.....  바로 setpalette이다. 용례는 다음과 같다.


예) setpalette( palette number, look up table number );


그리고 Look up table에서  RGB 값을 바꾸는 명령은 무엇일까?

바로 setrgbpalette이다.  용례는 다음과 같다.


예) setrgbpalette( look up table number, r value, g value, b value);


그런데 True color( 2^24가지 색≒약 1677만 가지  색)는 동시에 1677만 가지

색이 가능한데 어떨까? Palette가 1677만개  있을까? 그럼 메모리가 도대체 얼마나

필요한거야?! 해답은 여기. True color에서는 Palette나 Look up table이 없다.

방식이 다른 모양.... 자세한 건 각자 공부하시길....


                  제 2 장   320*200*256 Mode Programming


  이 모드는 말 그대로 가로 320개의 점,  세로 200개의 점, 그리고 한 점당

나타낼 수 있는 색깔의 가지 수는 256개 중 하나를 표현할 수 있는 모드이다.

모드 변호는 13h이다. 화려한 색상을 표현하기 위해 게임 프로그래밍에 자주

쓰이는 모드이다. 가장 좋은 예로 'DOOM'이라는 오락을 들 수 있겠다. 이  모드는

Borland사에서 만든 BGI가  제공하는 모드가 아니기 때문에 Graphics.h를 쓸 수

없다. 그러므로 점을 찍는 명령부터 우리가 모두  만들어서 사용해야 한다. 즉,

지금껏 우리가 배운 여러 가지 그래픽  함수들을 쓸 수 없다. 이 모드에서

프로그래밍을 하려면  기본적인 하드웨어의 제반 사항들을 알고 있어야 한다.


* Screen Mode를 전환시키는 함수
        void screen_mode(char mode)  /* mode : 0x3  -- Text Mode           */
        {                            /*       : 0x13 -- 320*200*256 Mode   */
                union REGS r;
                r.h.ah=0x0;
                r.h.al=mode;
                int86(0x10,&r,&r);
        }

* 화면을 지우는 함수 (즉, 화면을 원하는 색으로 칠해준다.)
        void clear_screen(unsigned char color)
        {
                unsigned char far *nowpage=(char*)0xa0000000;
                _fmemset(nowpage,color,64000L);
        }

* 원하는 좌표에 점을 찍는 함수
        void pixel(int x, int y, insigned char color)
        {
                unsigned char far *nowpage=(char*)0xa0000000;
                char far *address;
                if(y>199) y=199;
                address=(char far*) nowpage+x+(y<<8)+(y<<6);
                *address=color;
        }

* 원하는 좌표에 찍혀 있는 점의 색깔을 읽어서 되돌리는 함수
        unsigned char get_pixel(int x, int y)
        {
                unsigned char far *nowpage=(char*)0xa0000000;
                char far *address;
                address=(char far*) nowpage+x+(y<<8)+(y<<6);
                return *address;
        }


   <<  즐거운 실습 시간  >>


실습 1. graphics.h를 이용하여 640*480*16 모드에서  무지개(빨주노초파남보)

        모양의 띠를 만들어 보아라.

        힌트 : setpalette, setrgbpalette


실습 2. 화면  전체가 검은색에서 자연스럽게 노란색으로  바뀌는 이른바 Fade-in

        기법을  구현해 보라. 단, 화면에는 아무 것도 없어도 된다.

        힌트 : setpalette, setrgbpalette


실습 3. screen mode를 320*200*256으로 전환하고 화면을 95번 색깔로 지워 보아라.


실습 4. screen mode를 320*200*256으로 전환하고 임의의  좌표에 임의의 색깔의

       점을 찍어서 우주 공간의 효과를 내 보아라.


실습 5. graphics.h를 이용하여  640*480*16 모드에서 Mouse를 띄우고 마우스가

       가리키는 좌표의 위치를 왼쪽 구석에 printf를 이용하여 출력하여라.

       단 ESC를 누르면 빠져 나가야 한다.

       ESC의 Keyboard scan code는 0x011b이다.

       힌트 : gotoxy, int86, REGS, kbhit, bioskey


  그 동안 별 볼일없는  강좌를 들어 주시느라 수고하신 여러분께 감사드린다.

이번  강좌를 마지막으로 기초 그래픽 세미나를  마칠까한다. 원래 애당초 목표는

Assembly를 포함해서  갖가지 기교나 실제 내부적으로 비디오  카드 내의 그래픽

레지스터들을 이용한 low level 프로그래밍이었으나 너무 어려울 뿐만 아니라

필자의 능력상 무산되고 말았다.  정말 이번 세미나를 통해 필자도 깨달은 바가

무척  크다. 즉, 아는 것과 가르치는 것은  다르다는 점과 아직도 필자는

풋내기이고 모르는 것과 공부할 것이 너무 많다는 점이 바로 그 것들이다.

  그러나 우리에겐 아직 많은  시간들이 있다. 우리는 아직 늦지 않았을뿐만

아니라  이제부터 시작이라는 사실을 잊지 말아야  한다. 급변하는 사회와

컴퓨터를 잘하는 정말 수많은  사람들과 대적하기 위해서 우리는 열심히 노력해야

함을 명심하자. 행운을 빈다. 열심히 하자!!

                                                               from 성욱

『중앙대 컴퓨터공학과-프로그래밍 (go ACKIPS)』 131번
제  목:[덧붙임] Graphic Seminar를 돌이켜보며...                   
올린이:성욱    (최성욱  )    96/03/06 13:52    읽음: 54 관련자료 없음

-------------------------------------------------------------------------
----
안녕하세요..

아래에 제가 가을에 했던 Graphic Seminar 자료를 다 올렸는데요..

참, 엉성하기 짝이 없군요..후후..

애당초 목표였던 VGA 비디오 카드 프로그래밍은 커녕...

PCX 화일 구조나 선그리기 알고리즘 조차 없네요..후후..

작년 가을...

벌써 4개월이 흘렀네요..

그동안 제가 뭘 했나를 돌이켜 볼 때...

함께 공부했던 친구들...

그리고 많은 도움을 주신 김 선배님...박 선배님..한 선배님 ...고 선배님..
                        ~~~~~~~~~
기타 많은 분들의 도움에 힘입어...                     (정말 감사드려요~~)

포기하지 않고 여기까지 오게 된 것 같아요..

아는 것도 거의 없고..생판 모르는 것 투성이지만..

저도...여러분 들도 열심히 함께 뛰었으면 좋겠네요..

앞으로 발전하는 컴공을 위해...뛰어야 한다는 자각을 해야 겠습니다..

정보도 공유하면서...

사실...빌게이츠나...어떤 굉장한 프로그래머도..

처음 태어날 때부터 프로그램의 도사는 아니었겠죠..

모든 것은 노력 여하에 달렸다고 믿어 의심치 않습니다..

물론 1%의 영감(insperation)이 있긴 하지만요..

얼마 전 토이스토리라는 컴퓨터 그래픽 영화를 보면서..

참으로 감탄과 좌절(?)을 금치 못했죠..

하지만 나름대로 열심히 노력하는 모습을 보여야 겠어요..

젊음이란 좋은거죠..헤헤...

앞으로도 우리 과..아니..우리 나라의 Computer Graphic 분야에

많은 발전이 있기를 기원하며...

go scom 3하시면...시지프스라는 동호회가 나옵니다..

거기에 30번란인 강의실에 VGA graphic에 관련된...

상당히 좋은 자료들이 정말 널려있는데...

꼭 참고 하셨으면 좋겠네요..

그럼 건강하세요..

이만 통통..

                                                여러분의 성욱 올림..

+ -

관련 글 리스트
19 BGI Graphic Seminar (Q/A에서 복사) 남병철.레조 17817 2007/04/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.