블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

Gradient에 대한 정리

Programming 2009/01/07 10:17 귀차니스트

  일전에 Gradient에 대한 기능을 구현하였는데, 최근 몸 상태도 그렇고 마무리되지 않은 다른 부분도 있어 포스팅을 차일피일 미루어 왔습니다. 일단 간단한 Gradient는 색이 차츰차츰 변해가는 그런 것을 지칭하게 되는 데요. 이 기능에 대해서는 여러가지 방법이 존재할 수 있습니다.

  먼저 그리는 방법에 대해서 알아보자면 간단하게 하나의 방향을 향해가면서 색이 점점 변하는 경우를 볼 수 있습니다. 다른 경우는 원형의 경우도 존재할 수 있겠고, 하나의 방향을 향해가면서 절반 정도에 이르러 색이 완전히 다 변하였다 다시 복구 되는 경우도 존재할 수 있겠죠.

  가장 간단한 기울기가 없는 방향성 Gradient를 정리하면 다음과 같습니다.( 예로써 Left 방향을 선택해 보죠. )

Gradient (Language : cpp)
  1. 색상1 = Red;
  2. 색상2 = Blue;
  3. for( int i = 0; i < Width; ++i )  {
  4.  
  5.    double Percent = static_cast<double>(i) / Width;
  6.    
  7.    색상Put = RGB( 색상1.Red * ( 1.0 - Percent ) + 색상2.Red * Percent ),
  8.                           색상1.Green * ( 1.0 - Percent ) + 색상2.Green * Percent )
  9.                           색상1.Blue * ( 1.0 - Percent ) + 색상2.Blue * Percent )
  10. }

  와 같이 구현할 수 있습니다. 색상Put는 Width 에 해당하는 i 에 대한 출력 값이 되는 셈이죠. 결국 0 ~ Width를 0% ~ 100%에 대한 Blend 비율로써 생각을 하면 됩니다.

  그럼 기울기가 존재하는 경우를 한 번 생각해 봅시다. 속도를 위해서는 4가지의 경우를 먼저 생각을 해봐야 합니다. 어떤 경우냐면 기울기가 - 인지 + 인지에 따라서 2분류가 먼저 나눠지게 되고, 기울기에 대한 값이 0.5 보다 큰지 작은지에 따라서 각각 또 나눠주어야 합니다.

  왜냐하면 기울기가 한 쪽에 대해서만 처리를 해야 되는 경우를 생각해보면 0.5 이하일때와 0.5 이상일때를 먼저 살펴보도록 하겠습니다. 0.5 이하일때는 선을 하나 그릴 경우 가로로 무척 길게 뻗어나가게 됩니다. Windows GDI 상에서는 화면 좌표의 원점이 좌측 상단이라는 것을 먼저 생각하고 보면,

  위 두 가지의 경우를 살펴보면 (X, 0)좌표에서 (X + 기울기, 높이)로 선을 긋는게 한 쪽에 비효율적이라는 것을 알 수 있습니다. 밑의 경우는 X 좌표를 증가시켜가면서 선을 그려도 많아봐야 2X 만큼의 선을 그리게 되는 반면 위의 경우는 기울기가 0에 가까워 질수록 거의 무한대로 선을 그려야 하기 때문이죠.
  그리하여 위의 경우는 Y 축의 좌표를 증가시켜가며 선을 그리면 됩니다. (0, Y)좌표에서 (너비, Y + 기울기) 처럼 말이죠. 물론 - 기울기의 경우도 동일하게 처리하면 됩니다.

  그리고 저의 경우 MoveToEx 와 LineTo 를 이용하여 Gradient를 구현하였는데, 실제 이 부분에 대해서 처음 고민을 약간 하였습니다. 혹시나 선을 그리는 DDA 알고리즘이 처리하지 못하는 빈 픽셀이 생기면 어떻게 하지 하고 말이죠. 하지만 이 경우도 사실 고민할 경우는 없습니다.
  처음에 기울기에 대해서 먼저 계산을 하여 높이 또는 너비에 대한 X, Y 축 증가량을 미리 구한 뒤 천편일률적으로 목적지에 + 를 하면 되게 됩니다. 왜냐면 선을 그리는 알고리즘에 있어서 기울기가 완전 동일 하다면 위치가 약간 좌우 혹은 상하로 이동했을 뿐 그리는 순서 또한 동일하기 때문입니다.

  그리고 원형 Gradient의 경우도 존재합니다. 이 경우는 상당히 까다로운 경우라고 할 수 있습니다. 피타고라스의 정리를 사용하여 목적지와 원점의 거리를 계산하여 색상을 Blend하면 되긴 하지만 그 것 보다는 원을 그리는 함수로 원을 그리면 됩니다. 물론 Pen에 대해서는 Width가 2로 지정이 되어야 합니다. 1로 지정이 되었을 경우 빈 공간이 차츰차츰 크기가 작아져가면서 그리는 원에 대해서 빈 공간이 사라지고 Gradient가 작성되기 때문이죠.

Radial (Language : cpp)
  1. for( int i = 0; i < Radius; ++i )   {
  2.    
  3.     double Percent = static_cast<double>(i) / Radius;
  4.     Ellipse(hDC, i, i, 2*Radius - i, 2*Radius - i);
  5. }

  간단하게 적는다면 위와 같은 코드가 작성될 수 있겠군요^^. 타원에 대해서는 Ellipse 함수가 Rect 크기에 대해서 Drawing 이 가능하므로 연구를 개인적으로 하면 가능할 듯 합니다. 실제 구현은 했지만 올리는 것은 금전적 문제의 여지가 많은 듯 합니다^^.

  이 Gradient를 작성하면서 논문을 무척 많이 찾아본것 같습니다. 결국 찾기는 찾았지만 적용은 하지 못하고 그냥 구현하게 되었지만요. 그런 것을 보면서 참 많은 노력이 있었고 그로 인한 속도의 발전이 있지 않았나하는 생각이 많이 들더랍니다. 다른 분야도 마찬가지겠지요. 저도 그런 사람의 하나가 되길 기원하면서 이만 글을 줄이도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming" 분류의 다른 글

Script Interpreter - boost::spirit (0)2010/03/09
한게임 자동테트리스 Ver 0.6 (40)2008/11/15
한게임 자동테트리스 Ver 0.2 (27)2008/11/03
Read Sector From Floppy (0)2008/07/17
어제 무작정 맹글어봤던 것입니다.. (2)2008/07/16
2009/01/07 10:17 2009/01/07 10:17
TAG Gradient
받은 트랙백이 없고, 댓글 2개가 달렸습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/113

댓글을 달아 주세요

  1. kkamagui 2009/04/29 01:30  댓글주소  수정/삭제  댓글쓰기

    와우~ 후배~ 요즘은 블로깅 안하냐?
    너무 뜸해서 함 와본다 ㅋㅋ
    잘 지내고 있지?

    • 귀차니스트 2009/05/21 17:33  댓글주소  수정/삭제

      ㅋㅋ 넹.. MSN 에서 뵈었잖아용 ㅋㅋ 이캄서..
      음.. 뭐 한 1월 부터 갑자기 뭐 쫌 그렇게 됐죠 ㅋㅋ

      슬슬 다시 시작을 해야 되는데 ㅜㅜ 너무 오래 끊은듯 해용

Gradient 작성중에 있습니다.

Small Talk 2008/12/18 12:45 귀차니스트
  이번 달은 왠지 저녁에도 시간이 나지 않아서 제대로 포스팅을 못하고 있군요. 사실 어떤 곳에서 한 가지 일을 받아 하고 있는 중이라 그렇습니다. 일의 내용은 바로 Gradient와 + @를 작성하는 것인데요. Gradient 가 실질적으로 주목표라고 할 수 있습니다.

  자 Gradient란 무엇인가 하면.. 다들 써보셨으리라고 생각하는 포토샵, 그 포토샵에 보시면 색깔이 점점 변해가면서 색이 섞이는 기능을 써보셨을 것이라 생각합니다. 굳이 그 것이 아니더라도 미술시간에 배우는 구체의 광원 표현등을 컴퓨터에서 표현할 때 Gradient 효과라고 지칭하죠.

  위 그림과 같은 그림입니다. 대충 감이 오시죠?? 사실 포토샵에서는 처리가 아주 간단하게 드래그 한 번으로 모든 것이 끝나지만 코드를 통한 프로그램으로는 간단하지가 않습니다. 물론 원리는 무척 쉽지만 속도가 제대로 나도록 하기 위해서 계산을 최적화 해야 되는것이죠^^.

  간단한 1 To 1 Color Gradient 같은 경우도 있고, 1 To Many Color Gradient 같은 경우도 있을텐데, 후자 같은 경우는 색 추출에 계산시간을 더 허비해야 됩니다. 고로 속도의 문제점이 더 중요해 지겠죠. 제가 하고 있는 쪽은 후자 쪽을 진행하고 있고, 일반 진행, 반복진행, 타원(원)형의 Gradient를 제작하기 떄문에 제작이 끝나게 되면 코드 그 자체가 아닌 간략한 방법을 정리해서 포스팅 해보도록 하겠습니다.



작업이 대 부분 진행된 스크린샷 입니다. 꽤 괜찮나요^^?

크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Small Talk" 분류의 다른 글

VirtualHttpServer - 가상URL 처리 서버 (1)2010/02/22
최근의 동향과 동방환상마작 한글화 (1)2009/08/21
게임&인터랙티브 애플리케이션을 위한 수학 (0)2008/11/27
또 오랜기간의 공백을... (0)2008/10/12
남의 소스를 보는 것은 어렵습니다. 그리고... (2)2008/09/27
2008/12/18 12:45 2008/12/18 12:45
TAG Gradient
받은 트랙백이 없고, 댓글 3개가 달렸습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/112

댓글을 달아 주세요

  1. kkamagui 2008/12/19 01:18  댓글주소  수정/삭제  댓글쓰기

    오오~ 꽤나 멋진걸~ ;)

    예쁘게 잘 나왔네 ㅎㅎ

    • 귀차니스트 2008/12/21 13:26  댓글주소  수정/삭제

      ㅋㅋ 속도 튜닝의 무서움 ㅜㅜ이 아직 남았네요 ㅋㅋ

  2. 준호씨 2008/12/23 10:28  댓글주소  수정/삭제  댓글쓰기

    멋있네요 ㅎㅎ

◀ 이전페이지 1 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (118)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (21)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (33)
    • Document (4)
    • OS Develope (4)

최근에 올라온 글

  • Script Interpreter - b....
  • VirtualHttpServer - 가.... (2)
  • 음.. 여러가지 일이 있.... (2)
  • 어후.. 드디어 인터럽트....
  • Kernel Image에 어이없....

최근에 달린 댓글

  • 헠 ㅋ 다음에도 들러주세용 ㅋㅋ. 귀차니스트 03/09
  • ㅎㅎ RSS로 첨 온 글이네.ㅋ. 당구리 02/22
  • 음.. 한글화 파일 0.5 버젼은.... 귀차니스트 02/22
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/30
  • 어떤 의미이신지 잘 모르겠네.... 귀차니스트 01/23

달력

«   2010/03   »
일 월 화 수 목 금 토
  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      

링크

  • kkamagui 프로그래밍 세상.
  • runner님의 이글루.
  • 당구리의 마굿간.
  • 동우fly.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 한게임 테트리스 인공지.... 고니's Life 2009
  • ACM 706 (Uva ID) : LCD.... 알고리즘 트레이닝 : Oh... 2009
  • 문제 4 : LCD 디스플레.... 최익필의 이름없는 블로그 2009
  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2010/03 (1)
  • 2010/02 (1)
  • 2010/01 (1)
  • 2009/12 (3)
  • 2009/08 (1)

태그목록

  • 병렬처리
  • Borland
  • 개발일지
  • 1.35
  • 공백
  • 디코드
  • Filtering
  • IPangYa
  • DP
  • 해로
  • 디자인패턴
  • ASM
  • std::copy
  • Linux
  • Pangya
  • Interface
  • istreambuf_iterator
  • RCW
  • High Precision Event Timer
  • Secure
  • auto_ptr
  • Warcraft3
  • 홈브류
  • Code
  • Compiler
  • ICPC
  • Assassin's Creed
  • boost::shared_ptr
  • 어쌔신 크리드
  • HTML

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net