블로그는 귀차니즘

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

재귀적 합성이랄지..

Program 2008/10/13 11:54 귀차니스트
  어제 단순히 사놓았던 디자인 패턴에 대한 책을 다시 한 번 읽게 되었습니다. 이름은 "GOF의 디자인 패턴"이구요. 여러번 읽었던 것이 아니라 딱 한 번 그 것도 반쯤 읽다가 덮어둔 책인지라 다른 책들과 같이 제대로 끝장을 보기 위하여 책을 펴들었죠.
  처음에 나오는 부분은 Late 인가 하는 어떤 에디터 편집기 부분이었습니다. 물론 단순히 텍스트만 취급하느냐 하면 그 것도 아니고 이미지, 이미지 와 텍스트의 합성등 흔히 Windows 환경에서 볼 수 있는 Rich EditorBox 와 그나마 비슷하다고 할까요? 문단 형식지정은 물론이고 다양한 기능을 지원하는 에디터를 예로 들어 구현이 아닌 단순한 구현에서 설계의 예시를 간략하게나마 보여주더군요.
  이 부분을 읽다보니 제가 예전에 프로젝트를 하면서 사용했던 방식과 아주 비슷하다는 생각이 들더군요. 완전히 동일한 것인지는 모르겠지만 어차피 디자인 패턴이라는 것이 수정을 적게 하기위한 코딩방법들이 모여 만들어진것이다보니 어느정도 비슷하다는 생각이 들더군요.
  그래서 프로젝트를 하면서 사용했던 방식을 간략하게 구현을 해봤습니다. 내용은 자기가 닫힐 때, 별 어려운 방법을 사용하지 않고 부모같이 지정했던 창을 숨기거나 보여주는 창입니다. 이 것이 어디에 사용되었냐면 버튼을 누르고 검색을 하게 되었을 때 검색을 선택하거나, 다른 부분에서 해당 정보를 선택했을 때 자기는 닫히면서 부모는 보여주고 그런 형태였죠. 문제는 ShowDialog를 쓰려니 최상위 다이얼로그가 아니었기 때문에 에러가 발생했기 때문에 Show로 처리하다 보니 그랬습니다.

Form1.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication2
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.  
  19.         private void button1_Click(object sender, EventArgs e)
  20.         {
  21.             DlgBase Base = new DlgBase();
  22.             Base.Show();
  23.         }
  24.     }
  25. }
  26.  

  위와 같이 DlgBase 를 버튼을 클릭했을 때 나타나도록 수정합니다. 단순히 ShowDialog 로 처리하는 것은 바로 그 다음 처리를 할 수도 있기 때문에 그냥 Show로 처리를 해봅니다.

DlgBase.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication2
  11. {
  12.     public partial class DlgBase : Form
  13.     {
  14.         private DlgBase m_OwnForm = null;
  15.  
  16.         public DlgBase OwnForm
  17.         {
  18.             get
  19.             {
  20.                 return m_OwnForm;
  21.             }
  22.             set
  23.             {
  24.                 m_OwnForm = value;
  25.             }
  26.         }
  27.  
  28.         public DlgBase()
  29.         {
  30.             InitializeComponent();
  31.         }
  32.  
  33.         protected override void OnVisibleChanged(EventArgs e)
  34.         {
  35.             base.OnVisibleChanged(e);
  36.  
  37.             if (OwnForm != null)
  38.                 OwnForm.Visible = !Visible;
  39.         }
  40.  
  41.         private void button1_Click(object sender, EventArgs e)
  42.         {
  43.             ShowDlg();
  44.         }
  45.  
  46.         protected virtual void ShowDlg()
  47.         {
  48.             DlgChild1 Form1 = new DlgChild1();
  49.             Form1.OwnForm = this;
  50.             Form1.Show();
  51.         }
  52.     }
  53. }
  54.  

  OwnForm 이라는 Property로 부모(?)로 지정할 폼을 설정할 수 있도록 한 다음 DlgBase에 버튼을 하나 배치하여 그 버튼을 클릭하면 ShowDlg라는 함수를 호출하도록 하였습니다. 물론 ShowDlg는 가상함수로 되어있어 서브클래스에서 override 할 수 있죠. 그리고 자기의 Visible이 바뀔 때, OwnForm의 Visible또한 바꾸어 줍니다.

DlgChild1.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. namespace WindowsFormsApplication2
  10. {
  11.     public partial class DlgChild1 : WindowsFormsApplication2.DlgBase
  12.     {
  13.         public DlgChild1()
  14.         {
  15.             InitializeComponent();
  16.         }
  17.  
  18.         protected override void ShowDlg()
  19.         {
  20.             MessageBox.Show("마지막");
  21.         }
  22.     }
  23. }
  24.  

  그런 다음 DlgChild를 ShowDlg override 하여 그냥 단순히 메시지를 뿌리도록 합니다. 계속된 중첩도 가능하나, 버튼을 눌러서 종료된 시점과 자식창이 닫혔을 때, 부모에게 통지하여 모드를 설정할 수 있도록 하여야 2번 이상 들어갔을 때, 제일 첫 번째의 창이 다시 보이지 않기 때문에 단순화 한 이 코드로는 간단하게 간만 보도록 하겠습니다.

  이렇게 되면 작동이 어떻게 되느냐 하면 일단 프로그램을 실행 시켰을 때, 창이 하나 보이고 가운데 버튼이 있습니다. 그런데 버튼을 클릭하면 DlgBase 창이 뜨게 되지요.
  그런데 DlgBase 에서 존재하는 버튼을 또 클릭하게 되면 DlgBase 창은 사라지고, DlgChild1 창이 나타나게 됩니다. 물론 DlgChild1에서 원하는 작업을 수행하고 마친 뒤, 창을 닫게되면 DlgChild1창이 사라짐과 동시에 숨겨져있던 DlgBase창이 다시 나타나게 됩니다. 물론 닫는 다는 이벤트를 여기서는 구현하지 않았기 때문에 버튼을 누르게 되면 액션으로 Hide를 하는 작업으로 진행을 하여야 합니다.

  약간 뭔가 불편한 것 같은 방식으로 제가 구현을 한 것 같지만 나름대로 코드의 큰 수정 없이 많은 폼들을 잘 컨트롤 한 것 같습니다. 사실 폼마다 따로따로 코드를 작성하여 작동을 하도록 만들었다면 정말 많이 복잡해졌을 겁니다. 왜냐하면 폼이 정말 많은 것은 아니지만 기능상 사소한 불편함이 발생하지 않도록 여러가지 케이스를 고려해주어야 했기 때문이죠.
  이 것 보다 더 좋은 방식이 없지 않을거라는 것 또한 생각을 하고는 있는데, 언젠간 웹 서핑을 하다가 혹은 코딩의 문제점을 해결하기 위한 검색을 하다 볼 수도 있겠죠^^. 그 땐 더욱 확실하게 좋은 디자인을 제 것으로 만들어 보고 싶습니다. 이상한 예지만 복잡한 상황에서 도움이 되길 바라며 이만 글을 줄이겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Program" 분류의 다른 글

\r\n 과 \n 차이 때문에 생기는 문제 (0)2008/04/15
Bitmap Filtering - 비트맵 필터링 (0)2008/04/04
PangCal - 팡야계산기 (0)2008/02/16
War 3 Axis - 워크래프트3 후킹 프로그램 (0)2008/02/16
2008/10/13 11:54 2008/10/13 11:54
TAG 디자인패턴, 재귀적합성
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

\r\n 과 \n 차이 때문에 생기는 문제

Program 2008/04/15 22:07 귀차니스트

  POSIX 운영체제와 윈도우즈 환경을 왔다갔다 사용하셨던 분은 아마도 똑같은 문제를 한 번쯤 겪어보셨을 것이라고 생각합니다. 무엇이냐구요? 아마도 주로 텍스트 쪽에서 생기는 문제일겁니다. 어떤땐 php소스를 업로드 했다가 다운로드 받았더니 그런 적도 있었습니다.



  바로 위와 같은 현상들!! 이제 아~ 아시는 분이 계시진 않는가요? 아니면 이미 눈치채셨을지도 모르겠군요. 이 현상의 원인은 뉴라인에 대한 데이터가 달라서 생기는 문제입니다. 노트패드에서는 "\r\n"이 들어와야만 새줄로 취급을 하게 되죠. 워드패드나 좀 고급스러운 기능을 지원하는 글 편집기에서 열어보시면 아마도 이와 같은 문제는 보이지 않을겁니다.
  이게 대학교 1학년 말쯤인지, 2학년 1학기 쯤인지는 잘 모르겠지만 데이터를 읽다가 이런 현상을 보게 되었고 그 때 간단하게 프로그램도 만들어서 썼습니다. GUI는 아니더라도 콘솔로 만들어 썼습니다.
  첨부한 파일을 실행하면 됩니다. 굳이 어렵지 않게 그냥 exe파일을 어디에 둔 다음 원하는 변환 파일을 exe파일 위로 드래그앤 드롭하시면 됩니다. 지금와서 굳이 GUI로 만드는 것도 왠지 아닌것 같고, 복잡한 코드가 아닌 아주 간단한 코드기에 그냥 올립니다.

Convert.cpp (Language : cpp)
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. void remakeName( char *srcName, char *dstName );
  7.  
  8. int main( int argc, char **argv )
  9. {
  10.     char OutFilename[ 256 ] = {0};
  11.  
  12.     if( argc <= 1 ) {
  13.         return 0;
  14.     }
  15.  
  16.     for( int i = 1; i < argc; i++ ) {
  17.  
  18.         ifstream inFile;
  19.         ofstream outFile;
  20.  
  21.         memset( OutFilename, 0, sizeof( OutFilename ));
  22.         inFile.open( argv[i], ios::in );
  23.         remakeName( argv[i], OutFilename );
  24.  
  25.         if( inFile.is_open() )
  26.         {   
  27.             cout << argv[i] << " -> " << OutFilename << endl;
  28.             outFile.open( OutFilename , ios::out );
  29.  
  30.            
  31.             while( inFile.peek() != -1 )
  32.             {
  33.                 char inChar = inFile.get();
  34.                
  35.                 if( inChar == 10 )
  36.                     inChar = '\n';
  37.  
  38.                 outFile.put( inChar );
  39.             }
  40.  
  41.             outFile.close();
  42.             inFile.close();  
  43.         }
  44.     }
  45.  
  46.     return 0;
  47. }
  48.  
  49. void remakeName( char *srcName, char *dstName )
  50. {
  51.     char *indexDot = strchr( srcName, '.' );
  52.     int cpChar = indexDot - srcName;
  53.    
  54.     strncpy( dstName, srcName, cpChar );
  55.     strcat( dstName, "_1" );
  56.     strcat( dstName, indexDot );
  57. }

  예전에 C++ 코드로 C 스타일 코딩을 했던건데, 그냥 어떻게 이루어졌는지만 대충 훑으시면 됩니다. 파일 명이 들어오면 _1 을 덧붙여서 저장해주는 것으로 되어있습니다. 굳이 다른건 어려운 것도 아니니 프로그램이 혹시 필요하시면 사용하시면 됩니다.

LinToWin.rar

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

"Program" 분류의 다른 글

재귀적 합성이랄지.. (0)2008/10/13
Bitmap Filtering - 비트맵 필터링 (0)2008/04/04
PangCal - 팡야계산기 (0)2008/02/16
War 3 Axis - 워크래프트3 후킹 프로그램 (0)2008/02/16
2008/04/15 22:07 2008/04/15 22:07
TAG Linefeed, Newline, \r\n
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

Bitmap Filtering - 비트맵 필터링

Program 2008/04/04 23:01 귀차니스트
  작년 9월쯤, 어떻게 하다보니 회사 내부 아는 분들의 부탁으로 작성했었던 프로그램입니다. 그냥 과제를 해야 하는데 프로젝트 때문에 시간이 없다보니 제가 하게 되어 만들었던 프로그램이죠. 비트맵이라는 것이 실질적으로 그림정보를 들고 있는 것이기 때문에 아주 복잡한 기능은 적용하지 않고 간단한 기능들을 추가해보았습니다.



  프로그램 모습은 위 그림과 같습니다. 대충 메뉴를 소개하자면 아래와 같습니다.



  기능은 간단하게 1명당 1개의 기능으로 구성을 했었기 때문에 명도, 블러, 경계값, 반전, 모자이크 기능을 넣었었죠. 그럼 기능을 수행하면 어떻게 되는지 한 번 살펴보겠습니다.



  명도를 선택하면 다음과 같이 RGB 전체의 값을 일정 크기만큼 증가시키는 기능으로 구현했습니다. 코드는 다음과 같죠. 실제적으로 명도를 증가시키려면 HSI 로 나눈 뒤, 작업을 해야 할 것입니다.

CBrightness.cpp (Language : cpp)
  1. void CBrightness::Convert2Filter( DWORD *inData, DWORD *OurData, int RawWidth, int RawHeight )
  2. {
  3.     this->ImgWidth  = RawWidth;
  4.     this->ImgHeight = RawHeight;
  5.  
  6.     // 설정 창을 표시 하고 BlurFactor 에 세팅한 다음 작업한다.
  7.    
  8.     if( -150 <= InputFactor && InputFactor <= 150 ) {
  9.  
  10.         AtomFactor = InputFactor / 3;
  11.  
  12.         for( int i = 0; i < RawHeight; i++ )    {
  13.             for( int j = 0; j < RawWidth; j++ ) {
  14.                 ColorUnion ColorData = GetBrightnessPixel( inData, j, i );
  15.                 SetPixel( OurData, j, i, ColorData );
  16.             }
  17.         }
  18.     }
  19. }
  20.  
  21. ColorUnion CBrightness::GetBrightnessPixel( DWORD *inData, int X, int Y )
  22. {
  23.     ColorUnion ColorData = GetPixel( inData, X, Y );
  24.     int Red = ColorData.ColorPixel.Red, Green = ColorData.ColorPixel.Green, Blue = ColorData.ColorPixel.Blue;
  25.  
  26.     Red  += AtomFactor;
  27.     Green   += AtomFactor;
  28.     Blue    += AtomFactor;
  29.  
  30.     if( Red < 0 )
  31.         Red = 0;
  32.     else if( 254 < Red )
  33.         Red = 254;
  34.  
  35.     if( Green < 0 )
  36.         Green = 0;
  37.     else if( 254 < Green )
  38.         Green = 254;
  39.  
  40.     if( Blue < 0 )
  41.         Blue = 0;
  42.     else if( 254 < Blue )
  43.         Blue = 254;
  44.  
  45.     return MakePixel( 0xFF, Red, Green, Blue );
  46. }

  복잡한것 같지만 32비트 이미지를 1바이트 마다 나누어 RGB 값을 일정 크기만큼 더해주는 기능입니다.



  다음은 블러기능입니다. 보통 포토샵을 보면 뽀샤시 효과를 위해서 자주 사용하는 필터죠. 사실 블러에는 가우시안 블러, 모션 블러를 비롯해서 많은 종류가 존재하지만 위 같은 경우엔 그냥 뿌옇게 흐리는 기능만을 구현했죠.

CBlur.cpp (Language : cpp)
  1. void CBlur::Convert2Filter( DWORD *inData, DWORD *OurData, int RawWidth, int RawHeight )
  2. {
  3.     this->ImgWidth  = RawWidth;
  4.     this->ImgHeight = RawHeight;
  5.  
  6.     // 설정 창을 표시 하고 BlurFactor 에 세팅한 다음 작업한다.
  7.    
  8.     for( int i = 0; i < RawHeight; i++ )    {
  9.         for( int j = 0; j < RawWidth; j++ ) {
  10.             ColorUnion ColorData = GetBlurPixel( inData, j, i );
  11.             SetPixel( OurData, j, i, ColorData );
  12.         }
  13.     }
  14. }
  15.  
  16. ColorUnion CBlur::GetBlurPixel( DWORD *inData, int X, int Y )
  17. {
  18.     int Red = 0, Green = 0, Blue = 0;
  19.     ColorUnion OriginalColor = GetPixel( inData, X, Y );
  20.  
  21.     for( int i = Y - InputFactor; i <= Y + InputFactor; i++ )   {
  22.         for( int j = X - InputFactor; j <= X + InputFactor; j++ )   {
  23.            
  24.             if( IsContain( j, i ) ) {
  25.                 ColorUnion ColorData = GetPixel( inData, j, i );
  26.  
  27.                 Red  += ColorData.ColorPixel.Red;
  28.                 Green   += ColorData.ColorPixel.Green;
  29.                 Blue    += ColorData.ColorPixel.Blue;
  30.             }
  31.             else    {
  32.                 Red  += OriginalColor.ColorPixel.Red;
  33.                 Green   += OriginalColor.ColorPixel.Green;
  34.                 Blue    += OriginalColor.ColorPixel.Blue;
  35.             }
  36.         }
  37.     }
  38.  
  39.     int DividerNumber = static_cast< int >( std::pow( 2 * InputFactor + 1, 2.0 ) );
  40.  
  41.     Red  /= DividerNumber;
  42.     Green   /= DividerNumber;
  43.     Blue    /= DividerNumber;
  44.    
  45.     return MakePixel( 0xFF, Red, Green, Blue );
  46. }

  일정 범위의 픽셀에 대하여 RGB값을 서로 더하여 평균값을 구하는 것인데 물론 모자이크 필터가 아니다보니 가중치를 주어 원래 자기의 색이 다른 픽셀의 값에 밀리지 않도록 구현을 해주어야 합니다.


  이 것 또한 포토샵에서 볼 수 있는 Threshold 필터 입니다. 이 것은 어떠한 점에 존재하는 픽셀값이 일정 값 이상이면 하얀색 아닐 경우 검은색으로 표시하는 기능입니다. 보통 이미지패턴 처리를 위하여 자주 사용하는 기본 필터이기도 하죠.

CThreshold.cpp (Language : cpp)
  1. void CThreshold::Convert2Filter( DWORD *inData, DWORD *OurData, int RawWidth, int RawHeight )
  2. {
  3.     this->ImgWidth  = RawWidth;
  4.     this->ImgHeight = RawHeight;
  5.  
  6.     // 쓰레숄드 값 세팅 입력 받고
  7.  
  8.     for( int i = 0; i < RawHeight; i++ )    {
  9.         for( int j = 0; j < RawWidth; j++ ) {
  10.            
  11.             ColorUnion ColorData = GetThresholdColor( inData, j, i );
  12.             SetPixel( OurData, j, i, ColorData );
  13.         }
  14.     }
  15. }
  16.  
  17. ColorUnion CThreshold::GetThresholdColor( DWORD *inData, int X, int Y )
  18. {
  19.     int AvgData = 0;
  20.     ColorUnion ColorData = GetPixel( inData, X, Y );
  21.    
  22.     AvgData = ( ColorData.ColorPixel.Red + ColorData.ColorPixel.Green + ColorData.ColorPixel.Blue ) / 3;
  23.    
  24.     if( AvgData >= InputFactor )
  25.         ColorData = MakePixel( 0xFF, 0xFF, 0xFF, 0xFF );
  26.     else
  27.         ColorData = MakePixel( 0x00, 0x00, 0x00, 0x00 );
  28.  
  29.     return ColorData;
  30. }


  Invert 필터입니다. 바로 반전 기능이죠. 뭔가 느낌이 그로테스크 하지 않나요?^^ 사실 이 기능은 위 쓰레숄드 만큼이나 구현하기 쉽습니다. 왜냐하면 RGB 값을 바로 ~ 연산 취하면 되기 때문이죠.

CInvert.cpp (Language : cpp)
  1. void CInvert::Convert2Filter( DWORD *inData, DWORD *OurData, int RawWidth, int RawHeight )
  2. {
  3.     this->ImgWidth  = RawWidth;
  4.     this->ImgHeight = RawHeight;
  5.  
  6.     for( int i = 0; i < RawHeight; i++ )    {
  7.         for( int j = 0; j < RawWidth; j++ ) {
  8.            
  9.             ColorUnion ColorData = GetPixel( inData, j, i );
  10.  
  11.             ColorData.ColorPixel.Red    = ~ColorData.ColorPixel.Red;
  12.             ColorData.ColorPixel.Green  = ~ColorData.ColorPixel.Green;
  13.             ColorData.ColorPixel.Blue   = ~ColorData.ColorPixel.Blue;
  14.  
  15.             SetPixel( OurData, j, i, ColorData );
  16.         }
  17.     }
  18. }
  19.  


  마지막으로 모자이크 필터입니다. 이 것 또한 대충 구현하는 방법이 짐작되시죠?^^ 위에 언급한 블러 필터에서 모자이크 필터 얘기가 나왔으므로 아마 다들 짐작하실 것으로 생각합니다. 약간의 응용만 하시면 됩니다.

CMosaic.cpp (Language : cpp)
  1. void CMosaic::Convert2Filter( DWORD *inData, DWORD *OurData, int RawWidth, int RawHeight )
  2. {
  3.     this->ImgWidth  = RawWidth;
  4.     this->ImgHeight = RawHeight;
  5.  
  6.     // 모자이크 팩터 입력 받고
  7.  
  8.     for( int i = 0; i < RawHeight; i += InputFactor )   {
  9.         for( int j = 0; j < RawWidth; j += InputFactor )    {
  10.            
  11.             ColorUnion ColorData = GetMosaicPixel( inData, j, i );
  12.  
  13.             for( int YIdx = i; YIdx < i + InputFactor; YIdx++ ) {
  14.                 for( int XIdx = j; XIdx < j + InputFactor; XIdx++ ) {
  15.  
  16.                     if( IsContain( XIdx, YIdx ) )
  17.                         SetPixel( OurData, XIdx, YIdx, ColorData );
  18.                 }
  19.             }
  20.         }
  21.     }
  22. }
  23.  
  24. ColorUnion CMosaic::GetMosaicPixel( DWORD *inData, int X, int Y )
  25. {
  26.     int Red = 0, Green = 0, Blue = 0;
  27.     ColorUnion OriginalColor = GetPixel( inData, X, Y );
  28.  
  29.     for( int i = Y; i < Y + InputFactor; i++ )  {
  30.         for( int j = X; j < X + InputFactor; j++ )  {
  31.            
  32.             if( IsContain( j, i ) ) {
  33.                 ColorUnion ColorData = GetPixel( inData, j, i );
  34.  
  35.                 Red  += ColorData.ColorPixel.Red;
  36.                 Green   += ColorData.ColorPixel.Green;
  37.                 Blue    += ColorData.ColorPixel.Blue;
  38.             }
  39.             else    {
  40.                 Red  += OriginalColor.ColorPixel.Red;
  41.                 Green   += OriginalColor.ColorPixel.Green;
  42.                 Blue    += OriginalColor.ColorPixel.Blue;
  43.             }
  44.         }
  45.     }
  46.  
  47.     int DividerNumber = static_cast< int >( std::pow( InputFactor, 2.0 ) );
  48.  
  49.     Red  /= DividerNumber;
  50.     Green   /= DividerNumber;
  51.     Blue    /= DividerNumber;
  52.  
  53.     return MakePixel( 0xFF, Red, Green, Blue );
  54. }
  뭔가 복잡한 것 같지만 이러한 이미지 처리를 하는 것으로 다양한 결과물을 만들어 낼 수 있습니다. 게임 같은 경우 텍스쳐 또한 각도에 따라서 이미지 크기를 변경시키고 회전시켜 좌표에 맵핑을 하는 것이죠. 그래서 실제 게임 플레이어같은 경우엔 어떠한 형태를 가진 물체로 인식하게 하는 것입니다.
  이 글을 보신분 이미지 크기를 변경시키는 Resizing 기능을 구현해보시는 것은 어떻습니까?^^
=뱀다리=
std::pow를 사용하는 것을 생성자에 집어넣고 하여 최적화를 시켜야 할 여지가 존재합니다. 다만 당시 빠르게 작성하느라 못했기 때문에 최적화는 필요하신 분이 하셔서 사용해보세요^^
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Program" 분류의 다른 글

재귀적 합성이랄지.. (0)2008/10/13
\r\n 과 \n 차이 때문에 생기는 문제 (0)2008/04/15
PangCal - 팡야계산기 (0)2008/02/16
War 3 Axis - 워크래프트3 후킹 프로그램 (0)2008/02/16
2008/04/04 23:01 2008/04/04 23:01
TAG C++, Filtering, Image, Image Processing, 이미지 프로세싱
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

PangCal - 팡야계산기

Program 2008/02/16 23:47 귀차니스트

  2006년 여름 당시 팡야( http://www.pangya.com/ )를 플레이하게 되었습니다. 예전부터 알고는 있었지만 게임 자체가 캐시아이템의 운영방식을 가지고 있었기 때문에 돈이 없는 학생으로썬 대단히 부담이 되었었죠. 그런데 그때엔 어느 정도 플레이도 해보고, 친구의 부추김도 있었고, 홀인원의 재미도 느껴봤기 때문에 캐시를 충전하게 되었습니다.
  그러다 보니 필연적으로 계산이라는 것이 따라다니게 되더군요. 홀인원을 하기 위한 수치계산 말입니다. 간단하게 게임을 감으로 하는 것으로 알고 있었는데, 그게 아니라 쉽게는 cos, sin, tan에서 부터 어렵게는 공학함수까지 사용하여 이동 범위와 파워를 계산하더군요.
  하지만, 암산을 그 짧은 시간 내에 계산하기 쉽지만은 않았습니다. 때로는 허겁지겁 시간에 쫓겨 제대로 치지도 못하는 일도 많았죠. 그래서 결국 또 전공의 힘을 빌어 프로그램을 만들었습니다.

PCal

  위의 프로그램을 만들 때 한 가지 모토가 존재하였는데, 그 부분은 팡야홀릭( http://www.pangyaholic.com/ )을 비롯하여 많은 팡야 사이트들에 올라오는 각종 계산기는 모두 수식이 고정되어있다는 점이었습니다. 그래서 "변수를 입력할 수 있듯이 수식도 입력하자!"라는 것을 구현하게 되었습니다. 그리고 유용하게 사용했었죠.
  프로그램에 대한 소스를 팡야홀릭 자유게시판에 공개를 했지만 블로그를 이전하는 김에 같이 정리하여 올리는 것이 낫다는 생각이 들어 제대로 다시 올립니다.

프로그램 사용법
  1. 프로그램을 실행합니다.
  2. 수식을 입력합니다. 수식은 장판계산식과 파워계산식으로 나뉩니다.
    1. 수식의 입력방법은 단순한 대치방식으로 사용합니다.
    2. 만약 장판계산식이 ( 비거리 - 남은거리 * 0.45 + ( -1 * 커브 ) ) 라는 공식일 경우, 장판계산식에 ( [B] - [U] * 0.45 + ( -1 * [V] ) ) 라고 입력하고 나서, 위 입력 값 부분에서 해당 값들을 입력하고 계산버튼을 누릅니다.
    3. 만약 cos, sin, tan 함수를 사용하고 싶을 때 각종 대치변수의 앞에 C, S, T 문자를 붙여주면 됩니다. 예를 들어 [B] 대신 [CB]를 사용하게 되면 수학적 공식으로 cos( B ) 의 결과 값이 사용되게 됩니다.
  3. 프로그램이 종료될 때에는 이전 수식을 setting.ini 파일로 저장했다 재실행시 다시 로드하게 됩니다.

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

"Program" 분류의 다른 글

재귀적 합성이랄지.. (0)2008/10/13
\r\n 과 \n 차이 때문에 생기는 문제 (0)2008/04/15
Bitmap Filtering - 비트맵 필터링 (0)2008/04/04
War 3 Axis - 워크래프트3 후킹 프로그램 (0)2008/02/16
2008/02/16 23:47 2008/02/16 23:47
TAG Pangya, 팡야, 팡야계산기
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

War 3 Axis - 워크래프트3 후킹 프로그램

Program 2008/02/16 22:43 귀차니스트

  대학교 1학년 2학기 시절, Warcraft3 배틀넷에서는 래더게임 뿐만 아니라 Chaos 라는 AOS 종류의 유즈맵이 성행하고 있었습니다. 여기서 AOS 란 "Aeon of Strife"의 줄임말로 공성전략시뮬레이션의 장르입니다. 이 장르는 스타크래프트의 Aeon of Strife 라는 맵에서 시작된 것이라고 합니다. 그 인기에 걸맞게 친구들과 저 또한 이 게임을 플레이 하고 있었습니다.
  그 맵이라는게 필연적으로 상대방 영웅, 몹들을 사냥하면서 레벨업과 강력한 아이템들을 맞춰가는 것이 목표이다 보니 한 순간의 실수로 인해 내 영웅이 죽을때도 많았고, 그 때문에 영웅이 부활하기 까지 많은 시간을 기다려야 했습니다.
  명색이 컴퓨터 전공이다 보니 머리가 이런 쪽으로 돌아가더군요. 지금 생각하면 잘 돌아간것인지 잔머리인지는 잘 모르겠습니다. 그래서 단순히 윈도우 메시지 후킹 API를 이용한 프로그램을 만들게 되었습니다.

war3axis



  결국, 위의 그림과 같은 프로그램이 만들어졌고 친구들과 공유하여 많이 유용하게 사용했습니다. 웹 쪽도 조금은 퍼졌던 것으로 알고 있습니다. 나름 사람들이 내 프로그램을 사용한다는 재미도 생겨나더군요.
  하지만, 그 때는 제가 퍼트린 것이 아니었기 때문에 설명도 부진했고, 현재 Map이 어떻게 변화되어있는지는 모르기 때문에 현재도 적용이 가능한 것인지는 잘 모르겠습니다. 그래도 하드디스크 한쪽 구석에 썩혀두는 것 보다는 나을 것 같아 제대로 올립니다. 원래의 첫 원본은 ( http://pointer.egloos.com 에 존재합니다. )

  1. Encampment
      이 부분은 진영을 선택하는 부분입니다. 실제 게임을 플레이 할 시에는 진영이 센티넬, 스콜지로 나뉘어져 있기 때문에 자동포탈을 사용하고자 할 때에는 어떤 위치를 사용해야 할지 판단이 불가능하기에 존재하는 것입니다.
  2. Control
      이 부분은 아이템을 제외한 기타 단축키들을 설정하는 부분입니다. Locking Windows Key Action은 이름 그대로 보다시피 Alt, Ctrl 키 사이의 윈도우 키로 인한 Process Switch 문제를 방지하기 위해 삽입을 하였습니다. 그 외 Portal, 용기, 애교는 해당 액션을 단축키 하나로 지정해놓은 것입니다.
  3. NumPad Shortcut
      프로그램을 만들었던 가장 큰 이유로써 캐릭터의 단축키는 대부분 왼쪽에 위치한 반면 아이템 단축키는 오른쪽 넘버패드였기 때문에 그 불편함을 감수하고자 만들었던 부분입니다.


War 3 Axis.rar

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

"Program" 분류의 다른 글

재귀적 합성이랄지.. (0)2008/10/13
\r\n 과 \n 차이 때문에 생기는 문제 (0)2008/04/15
Bitmap Filtering - 비트맵 필터링 (0)2008/04/04
PangCal - 팡야계산기 (0)2008/02/16
2008/02/16 22:43 2008/02/16 22:43
TAG Chaos, Warcraft III, Warcraft3
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

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

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

카테고리

  • 전체 (108)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (19)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (29)
    • Document (4)

최근에 올라온 글

  • 한게임 자동테트리스 Ve....
  • Intel 64 And IA32 Arch.... (1)
  • 한게임 자동테트리스 Ve.... (18)
  • 재귀적 합성이랄지...
  • 또 오랜기간의 공백을....

최근에 달린 댓글

  • 오오~ 멋진데 :) 좋은 일 하.... kkamagui 11/17
  • .. 그렇군요;;.. 사실 뭐 저.... 귀차니스트 11/16
  • 고생은하셨다만.. 벌써 프로.... 뉴올리언스 11/16
  • 이 부분은 본문에 명시되어.... 귀차니스트 11/15
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 11/15

달력

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

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 05/16
  • Maximum sum. 티스토리 지점 04/09

글 보관함

  • 2008/11 (3)
  • 2008/10 (2)
  • 2008/09 (3)
  • 2008/08 (5)
  • 2008/07 (13)

태그목록

  • 파티션
  • 6GB
  • 개인정보유출
  • 버퍼 오버플로우
  • Logitech
  • 전위연산
  • 뻘글
  • 계발
  • 디자인
  • 난수
  • SSD
  • 알고리즘 트레이닝
  • ATL
  • Iterator
  • 해로
  • 오보에
  • Warcraft3
  • PSP
  • boost::Tokenizer
  • Linux
  • Image
  • OpenMP
  • interface design guide
  • COM
  • 한글표현
  • iterator_traits
  • priority_queue
  • Graphi
  • 개발
  • DP

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