김형준 GIS 연구소 (for Developers)  
Front Page
Notice | E-Mail | Admin | Write Article   
 
프로그래밍에 해당하는 글 233건
2011/12/27   [Java] URL을 통한 Binary 데이터 받기
2011/12/17   크롬(Chrome)에서 플래시 디버거 기능 않될때 조치 (2)
2011/12/13   모바일 플래시 업데이트
2011/12/09   [Flex] SparkSkin을 통한 버튼 디자인
2011/12/08   [Flex] FXG(Flash XML Graphic Format)으로 이미지 그리기
2011/11/19   [Java] 배열로부터 바로 ArrayList 객체 생성하기
2011/11/03   C#은 너무 친절해... (2)
2011/10/26   [Android] 맨날 까먹는 버튼 클릭 이벤트 핸들러 코드
2011/10/21   마이크로소프트사의 딥줌 이미지(Deep Zoom Image)포맷
2011/10/19   [OpenMP] 이해가 않되는 스레드 흐름 (4)
2011/09/18   [Android] GPS 기능 관련 API 예제 (6)
2011/09/15   [Java] 타원체간의 경위도 좌표계 변환 오픈소스 라이브러리 (4)
2011/09/14   Win7 홈(Home)에서 원격데스크탑 기능 추가시키기 (2)
2011/09/07   [Java] 가벼운 좌표 변환 오픈소스
2011/08/30   [Android] OpenGL ES에서 텍스쳐맵핑용 비트맵 생성 (1)
2011/08/17   [Android] 사용자 정의 이벤트 추가
2011/08/03   [Java] 사용자 정의 이벤트 추가하기
2011/08/02   [Android] 3D API, OpenGL ES - 2 : 폴리곤 렌더링
2011/08/01   [알고리즘] 선이 이루는 각도 구하기 (1)
2011/07/30   [Android] 텍스트에 외곽선 효과주기 (2)
2011/07/27   [Android] 3D API, OpenGL ES - 1 : 초기화 (10)
2011/07/04   ActionScript 코드 최적화 항목 (2)
2011/05/13   SHP와 SHX 파일 해석(파싱)시 주의할 점
2011/05/12   JTS Geometry Class Diagram
2011/04/25   단위기능 테스트(이동/확대/축소/회전 조작)
2011/04/15   GeoTools를 이용해 SHP, DBF 파일 읽기 (2)
2011/03/22   에자일 프랙티스
2011/03/02   [C++] STL 함수 객체(functor)
2011/03/01   [C++] STL 알고리즘 기본
2011/02/13   정삼각형의 좌표 구하기


2011/12/27 10:22 2011/12/27 10:22
[Java] URL을 통한 Binary 데이터 받기

자바에서 서버가 제공하는 바이너리 데이터를 받아 저장해 주는 코드입니다. 필요할 때 찾아 보기 쉽도록 정리해 봅니다.

위의 코드는 사용해 보니 문제가 있습니다. 이유는 6번 코드를 통해 서버로부터 받은 데이터의 크기가 항상 옳바르지 않다는 것입니다. 예를 들어 데이터가 클 경우.. -1이 반환되기도 합니다. 이러한 이유로 위의 코드는 사용하면 않되고.. 아래의 코드를 사용하시기 바랍니다.

Tag :
2011/12/17 15:13 2011/12/17 15:13
크롬(Chrome)에서 플래시 디버거 기능 않될때 조치
크롬에서 플래시 빌더를 통해 개발을 할때 디버깅이 않되는 문제가 있습니다. 이에 대한 해결책입니다. 먼저 크롬을 실행하고 주소창에 about:plugins 을 입력하여 아래 창을 표시합니다.

사용자 삽입 이미지

Flash라고 되어 있는 부분에서 사용 중지를 클릭하여 해당 플러그인의 사용을 비활성화 시킨 후.. 다시 Flash PlugIn Debug를 다운받아 설치합니다. 요지는.. 개발자에게 잇어서 Flash는 2가지 버전이 있는데 하나는 Release용이고 하나는 Debug용입니다. 이중 Release는 사용하지 않고 오직 Debug용만 사용한다는 것입니다. 이렇게 하면 Flash Builder에서도 Chrome을 통해 디버깅이 가능해 집니다.
2011/12/13 09:03 2011/12/13 09:03
모바일 플래시 업데이트
모바일 웹에서 플래시를 더 이상 지원하지 않겠다고 했던 어도비가 안드로이드 디바이스에서는 아직도 여전히 웹 기반 플래시를 지원하고 있습니다. 어제 새롭게 릴리즈된 플래시 버전 11.1.111.5입니다.

사용자 삽입 이미지

또한 안드로이드나 iOS에서는 플래시를 이용해 앱으로 개발할 수 있는 AIR는 3.1로 버전업되었습니다. 버전업으로 향상된 기능을 살펴보면.. 속도 향상과 보안 및 안정성에 대한 버그 수정이 이뤄졌다고 하니... 한번 테스트 해봐야겠습니다.

단 한번의 개발로 PC에서.. 그리고 Android, iOS 그리고 BlackBerry에서 모두 구동 가능한 앱 개발이 가능한 어도비의 플래시입니다.
2011/12/09 18:04 2011/12/09 18:04
[Flex] SparkSkin을 통한 버튼 디자인
플랙스에서 컴포넌트의 스킨을 디자인하는 가장 쉬운 방법은 이미지를 이용하는 것입니다. 예를 들어 버튼의 경우.. 버튼의 up, over, down, disabled 상태에 따라 각기 다른 이미지를 만들어 주고 지정해 주면 됩니다. 디자이너의 역량에 따라 매우 높은 퀄리티를 낼 수 있습니다.

이 글은 이미지를 이용하는 방식이 아닌.. 각 상태에 따라 직접 그려주는 방법에 대한 설명입니다. 이렇게 이미지가 아닌 직접 버튼의 스킨을 그려주는 방식에 대한 장점은... 버튼의 크기가 변경이 되어도 스킨이 깨지않고 자연스럽게 표현할 수 있다는 점입니다.
사용자 삽입 이미지
설명을 위해 제가 테스트 해 본 것은 버튼을 Aqua Style로 표현해 보는 것입니다. 위의 이미지가 실제 제 스스로 만들어본 버튼에 대한 Aqua 스킨입니다. SparkSkin 클래스의 파생 중에서 버튼에 대한 스킨은 SparkButtonSkin입니다.

일반적으로 SparkSkin은 레이어라는 개념으로 스킨을 입히게 됩니다. 여기서 직접 만들어 볼 버튼의 Aqua Style은 다음과 같은 레이어로 구성되어져 있으며 위의 이미지에 대한 버튼이 바로 아래의 레이어로 구성되어져 있습니다.
  1. border
  2. aqua
  3. labelDisplay
  4. blaze
좀더 고급스러운 Aqua 스타일을 제공하기 위해서는 더 많은 레이어가 필요하겠지만.. 간단이 이 정도의 레이어만을 구성해 봄으로써 Aqua 스타일의 스킨을 버튼에 입혀 보겠습니다. 위의 레이어 중 labelDisplay는 반드시 존재해야 하는 id 명으로써 버튼의 텍스트 라벨이 적용될 것으로 실제 Label 컴포넌트로 구성됩니다. 또한 위의 4개의 레이어의 순서 역시 중요합니다. 즉 가장 밑에 border가 존재하고 그 위에 aqua가.. 그리고 labelDisplay가 위치하며 가장 위에 blaze가 나타납니다.

먼저 실제 border 에 대한 FXG 코드입니다. 플렉스는 스킨에 대해 FXG(Flash XML Graphic)를 이용해 그려줍니다.

위의 FXG 코드는 다음과 같은 결과를 그려냅니다.

사용자 삽입 이미지

다음은 aqua 에 대한 FXG입니다.

위의 FXG 코드에 대한 결과는 다음과 같습니다.

사용자 삽입 이미지

그리고 라벨 텍스트를 표현할 코드는 다음과 같습니다.

텍스트를 표현해기 위해 Label 컴포넌트를 사용했습니다. 결과는 다음과 같습니다.

사용자 삽입 이미지

끝으로 blaze 레이어에 대한 FXG 코드는 다음과 같습니다.

이 레이어 만을 하얀색 배경의 화면상에서 보면 보이지 않는데요. 이 레이어는 버튼 위에 광택 효과를 주는 것으로 Aqua 버튼의 최정 결과를 보시면 딱! 아실 겁니다. ^^

뭐... 글로 아무리 길게 장황하게 써도.. 해당 스킨에 대한 전체 코드를 다음 url을 통해 다운로드 받으실 수 있으니 실제 플렉스에서 적용해 보시기 바랍니다.

참고로.. SparkSkin을 통한 스킨 적용은 Flash Builder 4.0 이상에서만 적용된다는 점에 유의하시기 바랍니다. 최근 4.6까지 나왔지요? 저는 4.5 버전을 쓰고 있습니다만.... 여튼.. 위의 스킨을 실제 버튼에 적용하기 위한 방법은 3가지가 있는데.. 그 중에 한가지에 대한 코드는 다음과 같습니다.

스킨을 만드는 작업은.. 코드의 길이에 비해 상당히 많은 시간이 소요되는 작업이라고 생각합니다. 또한 제대로 스킨을 만들려면 디자인 감각까지 갖춰야 하는 매우 고난위도의 작업입니다. 하지만 일단 한번만 만들어 놓으면 지속적으로 활용할 수 있으니... 스킨 제작 작업은 시간과 비용이 소요되더라도 꼭 제대로 해두는 것이 최종 프로젝트 산출물의 가치를 배가 시킬 수 있을 거라 확신합니다.
Tag :
2011/12/08 13:12 2011/12/08 13:12
[Flex] FXG(Flash XML Graphic Format)으로 이미지 그리기
플래시 빌더가 4.0으로 업그레이드 되면서 컴포넌트의 스킨을 SparkSkin 클래스를 통해 만들게 됩니다. 이때 컴포넌트의 모양을 그리기 위해 FXG(Flash XML Graphic Format)를 사용합니다. 컴포넌트의 모양 뿐만 아니라 채움이나 선 모양과 색상 등을 포함해 텍스트, 이미지 표현까지 모든 그리기에 대한 방법입니다.

좀더 체계적이고 정리된 프로젝트 진행을 위해 기존에 알고 있는 다소 돌아가는 방법이 아닌 표준화된 방법을 이용해 컴포넌트의 스킨을 세련되게 입히고자 하는 생각에서 FXG에 관심을 가지고 살펴보던 중에.. 실제 컴포넌트에 스킨으로 입힐 이미지를 FXG를 통해 표현하는 코드를 정리해 봅니다.

FXG에서 비트맵 이미지를 표현하기 위한 방법은 2가지입니다. 첫째는 BitmapImage를 이용해 이미지를 그대로 그리는 방법과 BitmapFill를 이용해 대상이 되는 도형에 비트맵을 채워 넣는 방법입니다. 아래의 코드가 바로 위의 2가지 방법에 대한 예제 코드입니다.

아래의 화면은 위의 코드를 통한 실제 결과 화면입니다.
사용자 삽입 이미지
Tag :
2011/11/19 18:00 2011/11/19 18:00
[Java] 배열로부터 바로 ArrayList 객체 생성하기

자바의 순수한 배열이 있다고 할때.. 이 배열을 다른 객체에 넘기기 위해서 ArrayList 타입으로 변환할 필요가 있는 경우가 있습니다. 이때 배열을 바로 ArrayList 타입으로 변경하는 코드입니다.

잊어 먹지 말자는 의미에서 기록 남깁니다..

Tag :
2011/11/03 12:06 2011/11/03 12:06
C#은 너무 친절해...

C#은 너무 친절해... 그래서 짜증나... 므니다.. 무슨 말씀인고 허니.. C#에서 URL을 통해 웹페이지를 호출하는 코드가 있습니다.. 예를 들어서..

뭐.. 대충 위와 같은 식으로 url을 날렸더니.. url을 구성하는 문자중 |을 자동으로 %7C로 인코딩 해주십니다.. 와우~ 너무 친절하시네.. 하지만 내가 원하는 것은 그냥 | 문자를 고대로 서버로 날려야 합니다. 해서 찾아보니.. url을 문자열 그대로 날리지 않고 Uri라는 클래스를 통해 날리는 방법이 있더군요. 그래서 다음처럼 코딩했습니다.

새롭게 추가된 2번 코드가 바로 그 녀석입니다. Uri 클래스 객체를 생성자의 두번째 인자값을 true로 주면 자동으로 |를 %7C 따위로 인코딩해주지 않아.. 제가 원하는 방법입니다. 근데 이 방식이 Deprecated 된 방식이랍니다. ㅡOㅡ;; 그럼 이와 동일한 기능을 하면서 권장하는 방식이 무엇이냐? 라고 열심히 구글링을 해봤지만 모르겠네요.. 아시는 분 계시나요?

여튼.. C#은 내부적으로 자동으로 처리해 주는 것들이 제법 있습니다. C#은 너무 친절합니다.. 그래서.. 가끔씩 맘에 않듭니다..

2011/10/26 13:19 2011/10/26 13:19
[Android] 맨날 까먹는 버튼 클릭 이벤트 핸들러 코드

맨날 까먹어 책 찾아 보고.. 인터넷 뒤져보고.. 해서 이 기회에 버튼에 대한 클릭 이벤트 핸들러 코드를 작성하는 것에 대해 정리를 해 놔야겠습니다. 머리가 나쁘니.. 손이 좀 고생을 해야겠지요..

레이아웃에 두개의 버튼이 있다고 가정하겠습니다. id는 각각 viewMode, editMode라고 하면.. 클릭 이벤트에 대한 핸들러 코드를 작성하는 방법에는 2가지가 있습니다. 물론 따져보면 둘다 동일한 방식이기는 하지만 코드 모냥새가 다르므로 다르다고 치겠습니다.

첫번째 방식입니다. 다수의 버튼들에 대한 이벤트 코드를 한자리에 가족같은 분위기로 다스리는 치국평천하 방식이라고 할 수 있겠습니다..
두번째 방식입니다. 이 방식은 각 버튼마다 이벤트 처리 코드를 따라 분리해 두는 방식입니다.

앞서도 말씀드렸지만.. 첫번째나 두번째나 결국 똑 같은 방식입니다..

Tag :
2011/10/21 19:37 2011/10/21 19:37
마이크로소프트사의 딥줌 이미지(Deep Zoom Image)포맷
사용자 삽입 이미지

위의 툴은 딥줌 이미지 데이터를 만들어주는 마이크로소프트 사의 Deep Zoom Composer입니다. 여기서 말하는 Deep Zoom이란.. 매우 큰 크기의 이미지를 인터넷 상에서 빠르게 보여주도록 하는 형식입니다.

딥줌 형식으로 이미지를 구성해 놓으면 .NET을 이용해 인터넷에서 쉽게 방대한 크기의 이미지를 빠르게 서비스할 수 있기 때문에.. GIS 분야에서 지도 서비스에 응용해 볼만한 기술로 생각됩니다. 비록 지도 좌표계의 개념이 없고.. 방대한 크기라고는 하나.. 크기에 제약이 있는 것으로 판단되는 단점이 있기는 하지만 말입니다.

GIS에서는 이미 타일맵이라는 형식으로 이 딥줌의 기술을 대체해.. 아니 딥줌보다 그 이전부터 사용되어 왔습니다. 하지만.. 딥줌은 마이크로소프트에서 최적화된 뷰어 자체를 제공하며 SilverLight를 통해 인터넷으로 쉽게 서비스할 수 있다는 매우 큰 장점을 가지고 있다고 생각됩니다.

이 글은.. 위에서 보여드린 Deep Zoom Composer를 통해 딥줌 이미지들을 만드는 것이 아닌.. Deep Zoom Composer가 없을지라도 딥줌 이미지들을 만들어 내기 위해 딥줌 이미지들의 구조를 파악해 보는 글입니다. 딥줌 이미지의 구조이므로.. Deep Zoom Composer가 만들어 낸 결과 샘플을 가지고 설명해 보겠습니다.

사용자 삽입 이미지

결과로 만들어진 딥줌의 폴더 구조입니다. 폴더 2개와 4개의 파일이 만들어 집니다. 이 구조는 어떠한 입력 이미지에 대해서도 항상 동일합니다. 그럼 다시 2개의 폴더 내부를 살펴보겠습니다. 먼저 dzc_output_files 폴더 구조입니다.

사용자 삽입 이미지

dzc_output_files 폴더 내부의 서브 폴더입니다. 역시 어떠한 입력 이미지에 대해서도 항상 동일하게 9개의 폴더가 만들어 집니다. 9개에 대한 모든 폴더, 즉 0 폴더에서 8번 폴더 안에는 0_0.png(또는 jpg)라는 이름의 이미지 파일 하나만이 존재합니다. 옵션을 지정하지 않았다면 256x256 크기의 이미지로 0 펄더에는 입력 이미지를 1x1 픽셀 크기로 만들어 놓은 것이고 2폴더는 2x2 픽셀 크기의 이미지가 3번 폴더는 4x4, 그리고 4번 폴더는 8x8 크기의 이미지와 같은 식으로 존재합니다. 다음은 dzc_ouput_images입니다. 이 폴더의 내부 내용은 다음과 같습니다.

사용자 삽입 이미지

입력 이미지 파일명으로 조합된 폴더 하나의 xml 파일 하나입니다. 먼저 xml 파일의 내부를 살펴보면 다음과 같습니다.

사용자 삽입 이미지

매우 단순한 내용이지만 중요한 정보를 담고 있는데요. 타일이미지의 크기와 이미지 형식 그리고 입력 이미지의 전체 크기에 대한 정보 등을 담고 있습니다. 이제 폴더 내부(02726_purplemurmur_2560x1440_files)를 살펴보겠습니다.

사용자 삽입 이미지

이 폴더는 흔히 GIS에서의 타일 구조 형식입니다. 0 폴더 안에는 1x1 픽셀 크기의 이미지 하나가 존재하며 최종적으로 12폴더에서는 입력 이미지를 256x256 크기의 타일 이미지들로 구성해 놓고 있습니다. 타일 이미지의 이름은 Row_Column.png(또는 jpg)로써 예를 들어 아래와 같이 구성되어져 있습니다.

사용자 삽입 이미지

여기서 Row 인덱스 0의 기준은 입력 이미지의 좌상단입니다. 이상으로 간단히 마이크로소프트사에의 딥줌 이미지의 포맷에 대해 설명드렸습니다.
2011/10/19 20:39 2011/10/19 20:39
[OpenMP] 이해가 않되는 스레드 흐름

이 코드는 스레드를 2개 사용하고 있습니다. 즉 section 지시어를 통해 13~18번 코드를 실행하는 스레드 하나와 20~24번 코드를 실행하는 스레드 하나입니다. 10번 코드에서 lastprivate(a)라는 보조 지시어를 통해 2개의 스레드에서 연산한 결과 a가 복사됩니다. 14번 코드에 Sleep 함수를 호출함으로써 두개의 스레드 중 a에 2를 할당한 스레드가 가장 마지막에 끝나도록 했습니다. a에 2를 할당한 스레드가 마지막에 종료되니.. 이 2개의 스레드가 끝나면 a 값은 항상 2가 될거라 예상됩니다.

사용자 삽입 이미지

근데.. 보는 바와 같이 a의 최종값이 3이라고 합니다.. ㅡOㅡ;; 실행 흐름을 봐도 가장 먼저 a 수정값으로 3을 할당하고 다음 실행으로 a 수정값으로 2를 할당하는 순서입니다. 실행 순서는 예상과 같은데.. 결과는 반대입니다.. ㅡOㅡ;; 아직 OpenMP를 학습하는 단계인지라.. 이해가 떨어져서 그런 것인지.. 아니면 OpenMP의 BUG인지... 모를 일입니다.. 누구 아시는 분 코칭 부탁드립니다.

2011/09/18 15:20 2011/09/18 15:20
[Android] GPS 기능 관련 API 예제
모바일이 이미 충분히 대중화되었음으로 해서.. GIS 분야 중 하나인 LBS(Location Based System; 위치 기반 시스템)을 활용할 수 다양한 앱이 꽃을 피울 기회를 맞이 한지 이미 꽤 오래되었습니다.

이에 안드로이드가 탑재된 모바일 기기의 GPS를 통해 현재 자신의 위치를 얻을 수 있는 안드로이드 API를 활용하는 샘플 코드를 공유해 봅니다. 아래는 샘플 코드에 대한 스크린 샷입니다.

사용자 삽입 이미지

위치(WGS84 타원체에 대한 경위도)는 물론이고 현재 이동 속도과 위치 정확도(휴대용 GPS의 경우 최고의 정확도 오차는 10m로 제한됨) 등을 얻어와 화면에 표시하고 있습니다. 또한 GPS의 원체 데이터 형식인 NMEA0183을 표시하고 있습니다.

GPS에게 위치데이터 힌트를 제공하는 인공위성의 수 역시 제공하고 있는데요. 이 인공위성의 수는 NMEA0183 데이터로부터 얻어올 수 있습니다. 긴 설명보다는 실제 실행 가능한 예제 코드 샘플을 공유합니다.


인터넷 상에서 공유되고 있는 다양한 소스를 취합하여 이 하나의 예제 샘플을 제작했습니다. 안드로이드에서 GPS로부터 위치 데이터 등을 취득하고자 하시는 개발자 분들에게 조금이라도 도움이 되시길 바랍니다.

GPS로부터 수신받은 좌표(WGS84 타원체의 경위도 좌표)를 다른 좌표계로 변환하기 위한 방법은 다음 URL을 통해 살펴보시기 바랍니다.
Tag : ,
2011/09/15 18:01 2011/09/15 18:01
[Java] 타원체간의 경위도 좌표계 변환 오픈소스 라이브러리

얼마전에 가벼운 좌표변환 오픈소스 라이브러리를 소개한 글(http://www.gisdeveloper.co.kr/738)을 올렸습니다. 상당히 가볍고 매우 다양한 좌표계 투영이 가능한 라이브러리이지만 서로 다른 타원체 간의 좌표 변환에 있어서 제약이 있는 라이브러리였습니다.

이 글은 그에 대한 해결책으로 서로 다른 타원체 간의 경위도 좌표계 간의 변환을 지원합니다. 먼저 소개해 드린 라이브러리와 이 글에서 소개해 드릴 라이브러리를 조합하면 상당한 정확한 좌표 변환 성과를 얻으실 수 있으리라 확신합니다.

먼저 이 라이브러리를 구성하고 있는 클래스(총 4개)들의 관계도를 살펴보면 다음과 같습니다.

사용자 삽입 이미지

보시면.. Ellip2Ellipsoid라는 클래스만이 나머지 클래스와 관계를 맺고 있고 나머지는 독립적입니다. 관계를 맺고 있지 않은 클래스를 먼저 살펴보는 것이 순서이므로.. 순서대로 하나 하나 살펴보면.. 먼저 Ellipsoid는 타원체를 나타냅니다. 장반경과 편평도로 타원체 하나를 정의할 수 있습니다. 그리고 Parameters7은 타원체간의 경위도 좌표 변환을 위한 변환 계수로써 7 Parameters를 의미합니다. Vaues3는 단순히 3개의 값을 담고 있는 클래스로써 경위도값과 높이값을 담는데 사용합니다. 이 클래스는 타원체간의 경위도 좌표 변환의 입력값고 결과값의 타입으로 사용합니다. 끝으로 이 세 클래스와 유일하게 관계를 맺고 있는 Ellip2Ellipsoid는 2개의 상이한 타원체 간의 경위도 좌표를 7개의 변환 계수를 사용해 변환해 주는 주요 클래스입니다.

이제 이 클래스들을 이용하여 실제로 Bessel1841 타원체와 WGS84 타원체 간의 경위도 좌표 변환의 코드를 예로 살펴보겠습니다.

1번와 2번 코드에 앞서 언급했던 2개의 타원체를 정의하고 있습니다. 타원체 정의는 장반경과 편평도값을 통해 가능합니다. 3번 코드는 타원체 간의 변환을 위한 변환계수로써 X, Y, Z의 3개 축에 대한 이동량 그리고 또 3개의 축에 대한 회전량 끝으로 축척차값입니다. 타원체 간의 경위도 좌표 변환은 단번에 이루어지는 것이 아니라 중간 단계로 지심좌표계라는 X, Y, Z축 좌표계로 변환하게 되는데 다시 지심좌표계를 또 다른 타원체로 변환하기 위해 지심좌표계 자체를 3축에 대해 이동하고 회전하며 크기를 조절하는 과정에서 이 7개의 변환 매개변수가 사용됩니다. 9번 코드를 통해 이렇게 생성한 2개의 타원체와 변환 매개변수로써 Ellip2Ellipsoid를 생성합니다. 그리고 11번 코드부터는 실제 각 타원체간의 경위도 좌표계의 변환입니다. 결과는 아래와 같습니다.

사용자 삽입 이미지

만약 다른 프로그램 등을 통해 좌표변환을 수행했을때 위의 결과와 차이를 보인다면 변환 매개변수값으로 다른 값을 사용했기 때문입니다. 즉 위의 코드에서 3번 코드의 Parameters7 클래스의 생성시 사용한 인자값들에 해당합니다. 위의 3번 코드에서 사용한 변환 매개변수를 현재 한국에서 사용하도록 권장하고 있는 매개변수로써 대다수의 좌표변환 툴에서 사용하고 있는 매개변수입니다. 끝으로 본 오픈소스에 대한 다운로드는 아래의 링크를 통해 받으시기 바랍니다.

끝으로 궁금하신 점은 댓글을 통해 남기시면 최대한 답변해 드리겠습니다. 또한 이 오픈소스 라이브러리는 지오서비스에서 개발했으며 LGPL 라이센스를 따릅니다.
Tag :
2011/09/14 16:11 2011/09/14 16:11
Win7 홈(Home)에서 원격데스크탑 기능 추가시키기
Win7 홈 에디션에는 원격데스크탑 기능이 없습니다. 개발자에게 원격데스크탑은 매우 유용한 기능입니다. 물론.. 이 기능이 없다면 자리에서 자주 일어나 이 PC 저 PC로 옮겨다니며 역동적으로 일을 할 수 있겠지만 말입니다.

여튼.. 이 유용한 원격데스크탑 기능을 Win7 홈 에디션에 직접 추가시키는 방법입니다. 저 같은 경우 Windows 7 Home Premium 64 bits 입니다.

먼저 시스템 속성의 원격 탭에서 이 컴퓨터에 대한 원격 지원 연결 허용을 활성화 시킵니다.

사용자 삽입 이미지

다음으로 첨부 파일을 다운받아 압축을  풀고 Install.cmd를 실행해 주면 됩니다. 참고로 이 첨부파일은 Win7의 서비스팩1이 적용된 경우에만 가능합니다.

2011/09/07 10:59 2011/09/07 10:59
[Java] 가벼운 좌표 변환 오픈소스

오픈소스를 검색하고 사용할만하다.. 라는 항목 중에 하나가 "가볍다"입니다. 필요한 기능은 "딱" 하나인데.. 이 하나의 기능을 사용하기 위해 다른 라이브러리가 덕지 덕지 붙어야만 하는 라이브러리는 아무리 기능이 좋아도 사용할 수 없는 상황(모바일 GIS 개발)입니다..

GPS로부터 받은 WGS84 경위도좌표를 우리나라에서 흔히 사용하는 좌표계로 변환하기 위한 자바 기반의 오픈소스를 검색하던 중.. 가벼운 녀석을 찾았고.. 다시 몇일 동안의 검증을 통해 사용하기로 결정된 좌표변환 오픈소스가 바로 Java Map Projection Library입니다.

이 오픈소스가 참조하고 있는 또 다른 오픈소스 라이브러리는 행렬계산을 위한 Jama라는 오픈소스 라이브러리입니다. Jama는 이미 행렬계산을 위해 제가 예전부터 사용하고 있던터라.. 문제가 없었습니다. 아래는 간단히 경위도 좌표를 카텍 좌표계로 투영하는 코드의 예입니다.

경도 128, 위도 38이 (400000, 600000)으로 투영되는 카텍좌표 투영에 대한 정보에 대한 인자로써 7~16라인의 코드에 params라는 문자 배열로 정의하고 있습니다. 이러한 인자값은 C언어 기반의 PROJ.4의 인자.. 바로 그것입니다. PROJ.4를 유용하고 사용하고 있는 저에게는 매우 반가운 방법입니다. 실제로 투영을 위한 Projection이라는 클래스의 객체를 생성하는 코드는 18번으로 앞서 정의한 인자값을 인자로 받습니다. 그리고 경도 128, 위도 38에 대한 좌표 변환은 20번 코드이고.. 21번 코드를 통해 화면에 출력해 확인하고 있습니다.

사용자 삽입 이미지

네, 위의 화면이 실행결과입니다. 그런데 석연치 않은 부분이 있습니다. 바로 20번 코드의 transform의 입력 인자로 받은 경도 128, 위도 38에 해당하는 타원체가 무엇인지에 대한 것입니다. WGS84 타원체일까... 아니면 Bessel 타원체 일까... 답은 Bessel인데요. 이유는 Projection 클래스의 객체를 생성하기 위해 정의했던 인자들 중 11번째 코드의 +ellips=bessel에 따릅니다. 그렇다면 앞서 말씀드렸던 목표.. GPS에서 수신받은 좌표체계인 WGS84 경위도가 아니라는 것입니다.

그렇다면 WGS84 경위도좌표계를 Bessel 경위도좌표계로 변환하고 이렇게 변환된 경위좌표를 카텍으로 변환해 주면 되겠군요. 하지만 여기서 문제는 이 Java Map Porjection 오픈소스가 타원체 간의 경위도 좌표 변환을 지원하지 않는다는 점입니다. 여기에 대한 해결점은 또 다른 포스팅(http://www.gisdeveloper.co.kr/740)을 통해 공유해 드리겠습니다.
2011/08/30 09:43 2011/08/30 09:43
[Android] OpenGL ES에서 텍스쳐맵핑용 비트맵 생성
몇일전.. 안드로이드에서 OpenGL ES의 텍스쳐 맵핑을 살펴보고 실습을 해보면서.. 아무리 해도 텍스쳐가 맵핑되지 않았습니다.. 일단 OpenGL에서 텍스쳐맵핑을 위한 OpenGL의 API의 사용순서에 문제가 있겠거니.. 하며 문제를 파악해 나갔지만.. 도통 모르겠다 싶었구요.. 그러던중.. 문제를 해결.. ㅜㅜ

텍스쳐 맵핑을 하기위한 준비 과정으로 먼저 Bitmap 객체를 하나 생성해야 하는데.. 아래의 코드를 통해 Bitmap 객체를 생성했었습니다.

이 한줄로 비트맵을 포맷에 상관없이 읽을 수 있는 안드로이드의 API에 감탄을 했던것같은데.. 바로 문제는 여기에 있었습니다.. 이 코드를 아래 코드로 변경해야 텍스쳐가 맵핑됩니다.

감탄했던 단 한줄의 코드 대신.. 원시 데이터로써 비트맵을 읽어 스트림을 만들고 이 스트림을 통해 비트맵을 만드는 제법 복잡다단한 방법이 바로 옳바른 방법이였습니다.. 아래는 그토록 보고 싶어라 했던 텍스쳐가 맵핑된 화면 결과...

사용자 삽입 이미지

흠.... 답답했던 때가 언제었냐는듯.. 눈이 맑아집니다.. ㅎㅎ 만약 첫번째 방식으로 하여 텍스쳐맵핑이 않되시는 분이 계시다면 두번째 방법으로 접근해 보시기 바랍니다.
2011/08/17 16:09 2011/08/17 16:09
[Android] 사용자 정의 이벤트 추가

자바에서 사용자 정의 이벤트를 추가하는 방법에 대한 글(http://www.gisdeveloper.co.kr/734)을 남긴 적이 있습니다. 그 글에서 소개한 사용자 정의 이벤트 추가 방식은 안드로이드에서는 추천하지 않는다는 글로 정리를 했습니다.

안드로이드에서는 어떤 식으로 사용자 정의 이벤트를 남기면 좋을까에 대한 것이 이 글의 주제입니다. 일반적인 자바에서 사용자 정의 이벤트는 이벤트 리스트에 여러개의 이벤트를 등록하게 됩니다. 예를 들어서 특정한 뷰에 대한 마우스 클릭에 대한 이벤트라면.. 여러개의 이벤트를 등록하게 하는 방식입니다. 하지만 안드로이드라는 환경은 한정된 리소스를 가지고 있음으로 해서.. 예로 든 특정 뷰에 대한 마우스 클릭에 대한 이벤트에 대해 '하나'만을 등록하는 방식이 더 적당하다고 할 수 있습니다. 물론... 필요하다면 자바에서 일반적인 사용자 정의 이벤트를 추가하는 방식을 안드로이드에서 사용해도 됩니다. 그럼.. 안드로이드에서 적합한 사용자 정의 이벤트를 추가하는 방식에 대해 정리해 보겠습니다.

먼저 새롭게 추가할 이벤트가 무엇인지 확인해 봅니다. 예를 들어 맵엔진 개발에 있어서 맵의 축척이 변경되었을때 발생하는 이벤트를 추가하는 예를 통해 살펴보겠습니다. 1개의 클래스와 또 다른 한개의 인터페이스를 추가해야 하는데.. 새롭게 추가할 클래스는 이벤트 객체에 대한 클래스이며 새롭게 추가할 인터페이스는 이벤트 리스너입니다. 이 둘은 일반적인 자바에서의 사용자 정의 이벤트에 대해서 동일한 내용입니다. 다른게 없습니다.

아래는 축척 변경 이벤트에 대한 이벤트 객체 클래스 소스입니다.
이벤트 객체는 이벤트를 발생시킨 주체(getSource 매서드를 통해 반환됨)를 기본적인 내용으로 하며 그외 더 필요한 정보를 담을 수 있습니다. 다음으로 이벤트 리스너에 대한 인터페이스입니다.

이벤트 리스너 인터페이스에는 여러개의 이벤트를 넣을 수 있는데.. 이 경우 맵축척 변경에 대한 이벤트만이 있습니다. 이제 축척 변경에 대한 이벤트에 필요한 클래스와 인터페이스가 준비되었습니다.

그럼 맵엔진 단에서 맵 축척이 변경되었을때 이벤트를 발생시키는 것에 대해 코드를 통해 살펴보겠습니다.

보시는 것처럼.. 이벤트 리스너에 대한 변수와 이 이벤트 리스너를 할당시키기 위한 매서드 끝으로 실제 이벤트가 발생될때 이벤트 리스너를 실행해 주는 코드로 구성되어 있습니다. 여기까지가 일반적으로 안드로이드에서 사용자 정의 이벤트를 만들어 주는 방식입니다. 그럼.. 이 맵축척이 변경되었을때 발생하는 이벤트에서 원하는 코드를 작성해보는 샘플 코드는 어떻게 될까.. 아래 코드를 통해 살펴보시기 바랍니다.

map은 앞서 XrMap 클래스에 대한 변수입니다. 축척이 변경될때마다 화면에 SCALE CHANGED라는 메세지를 토스트를 통해 띠웁니다.. 끝으로 안드로이드에서 버튼을 클릭했을 때 이벤트를 할당하는 코드를 살펴보고.. 위의 맵축척 변경 이벤트 할당 코드와 비교해 보시기 바랍니다.

보시는 것처럼.. 이벤트를 할당하는 두개의 구조가 모두 동일함을 알 수 있습니다. 이상으로 안드로이드에서 사용자 정의 이벤트를 할당하는 방법에 대한 정리를 마치도록 하겠습니다.

Tag :
2011/08/03 15:24 2011/08/03 15:24
[Java] 사용자 정의 이벤트 추가하기

컴포넌트는 시스템을 구성하는 하나의 부품으로 자신을 운용하는 시스템이나.. 또는 자신과 관계를 가지는 다른 컴포넌트와 상호 통신을 위한 효율적인 방안으로 이벤트라는 개념을 가지고 있습니다. 자바(Java)에서 어떤 컴포넌트를 개발하였고.. 이 컴포넌트에 사용자 정의 이벤트를 추가하는 방법에 대한 설명입니다. 이벤트를 추가하기 위해 새롭게 정의해야 할 클래스는 총 2가지입니다.

  • 이벤트에 대한 정보를 담고 있으며 EventObject를 상속받는 클래스
  • 이벤트에 대해 실행해야할 코드를 정의할 수 있는 방법을 제공하며 EventListener를 확장하는 인터페이스

먼저 EventObject를 상속받으며.. 이벤트에 대한 정보(이벤트를 발생시킨 객체 등)를 담고 있는 클래스에 대한 예를 들어보겠습니다.

이벤트를 발생시킨 객체에 대한 정보를 위해 생성자에서 Object 타입의 source를 인자로 받습니다. 만약 이벤트에 대한 다른 정보가 필요하다면 이 클래스에 추가하면 됩니다.

다음으로 EventListener 인터페이스를 확장하며 이벤트에 대해 실행해야할 코드를 정의할 수 있는 길을 열어주는 인터페이스에 대한 예를 들어 보겠습니다.

이 인터페이스의 매서드인 customEvent에 이벤트가 발생했을때 어떤 코드를 실행할지를 정의하게 됩니다. 이렇게 사용자 정의 이벤트를 추가하기 위해 필요한 2개의 클래스를 정의했으므로 이제.. 컴포넌트에 이벤트를 코드를 살펴보겠습니다. 컴포넌트의 클래스는 CustomComponent이라고 하고 이벤트에 관련된 코드만을 살펴보면 다음과 같습니다.

자바는 하나의 이벤트에 대해서도 여러개의 이벤트 처리 코드(핸들러)를 담을 수 있습니다. 이 이벤트 핸들러를 담을 수 있는 컨테이너가 필요한데.. 그 컨테이너가 바로 4번 코드에서 EventListenerList 타입의 listenerList 변수입니다. 그리고 가장 앞서 언급한 새로운 이벤트를 추가하고 제거 하는 매서드가 6번과 10번 코드의 addCustomEventListener과 removeCustomEventListener입니다. 그리고 14번 코드인 fireCustomEvent 매서드는 이벤트가 발생해야할 적당한 시점에서 이벤트를 발생을 위해 '호출' 해주는 매서드입니다. 이 매서드가 private로 선언된 이유는 이벤트가 발생하는 시점은 컴포넌트 안에서 정의하는 것이고 외부에서 그 시점을 컨트롤 해서는 않되기 때문입니다.

이상으로 자바에서 사용자 정의 이벤트(Custom Event)를 정의하는 방법에 대해 설명드렸습니다. 하지만 여기서 EventListenerList 클래스는 자바의 swing 패키지에 정의된 클래스로 swing은 안드로이드에서는 제공하지 않는 패키지입니다. 해서 안드로이드에서는 EventListenerList 클래스를 직접 개발자가 정의해 주어야 합니다. EventListenerList 클래스는 아래 다운로드를 통해 받으시기 바랍니다.

왜 안드로이드에서 EventListenerList를 제공하지 않는지에 대한 고민해 해보시기 바랍니다. 만약 제가 안드로이드에서 어떤 컴포넌트를 개발할때 새로운 이벤트를 정의해야할 필요가 있다면.. EventListenerList를 사용하지 않을 겁니다. 이에 대한 이야기는 다음 기회에 말씀드리로 하겠습니다.
Tag : ,
2011/08/02 18:47 2011/08/02 18:47
[Android] 3D API, OpenGL ES - 2 : 폴리곤 렌더링

이전 글을 통해 안드로이드에서 OpenGL ES에 대한 초기화에 대해 살펴보았습니다. 이 글은 간단한 폴리곤을 화면상에 렌더링해 보는 API에 대해 살펴보겠습니다. 간단한 폴리곤에 대한 렌더링을 위해 먼저 폴리곤을 구성하는 데이터에 대한 개념을 살펴보도록 하겠습니다. (OpenGL ES를 보시기 전에 먼저 OpenGL을 선행 학습하시면 훨씬 쉽게 이글을 이해할 수 있습니다.)

정점(Vertex) : 정점은 3D 모델을 구성하는 최소 단위입니다. 정점은 2개 이상의 모서리(Edge)가 만나는 점입니다. 3D 모델에서 정점은 모든 연결된 모서리나 면(Face) 그리고 폴리곤 사이에 공유됩니다. 또한 정점은 카메라나 광원의 위치를 나타내는데도 사용됩니다.

모서리(Edge) : 모서리는 두개의 정점을 잇는 선분입니다. 모서리는 면이나 폴리곤의 외곽선입니다. 3D 모델에서 모서리는 2개의 인접한 면이나 폴리곤 사이에 공유됩니다. OpenGL ES에서는 선분을 정의한다라는 개념보다는 정점을 이용해 면을 정의한다고 합니다. 면은 최소 3개의 모서리로 구성됩니다.

면(Face) : 면은 삼각형입니다. 면은 3개의 정점으로 구성되며 3개의 모서리로 둘러 싸여졌습니다. 면의 구성을 변환하면 모든 연결된 정점과 모서리 그리고 폴리곤에 영향을 받습니다. 면을 구성하는 정점의 지정 순서에 따라 면의 앞면과 뒷면에 대한 정의가 달라집니다. 앞면과 뒷면이 중요한 이유는 퍼포먼스에 있습니다. 뒷면은 눈에 들어나지 않으므로 렌더링에서 제외될 수 있기 때문입니다. 정점의 지정 순서에 대해 앞면이냐 뒷면이냐를 정의할 수 있는데 glFrontFace 매서드를 통해 가능합니다. 정점의 지정순서는 삼각형에 대해 반시계 방향 순서(CCW)냐 시계 방향 순서(CW)냐입니다. OpenGL ES는 기본적으로 반시계 방향이 앞면을 의미합니다.

폴리곤(Polygon) : 폴리곤은 하나의 3D 모델이라고 생각하면 됩니다. 폴리곤을 구성하기 위해서는 정점들의 데이터와 이 정점들 중 3개를 이용해 면을 구성하기 위한 정점 인덱스 정보를 통해 이뤄집니다. 폴리곤을 화면에 렌더링하는 매서드는 glDrawArrays와 glDrawElements입니다. 이 두 함수의 첫번째 인자는 정점과 인덱스를 통해 구성할 모델의 형태입니다. 다음과 같이 총 7가지 모드가 존재합니다.

1. GL_POINTS : 정점을 개별적인 포인트로 렌더링한다.

사용자 삽입 이미지

2. GL_LINE_STRIP : 정점을 지정된 순서대로 이어 라인을 구성해 렌더링한다.
사용자 삽입 이미지

3. GL_LINE_LOOP : GL_LINE_STRIP와 동일하고 첫번째와 마지막 정점을 잇는다.
사용자 삽입 이미지

4. GL_LINES : 정점 2개씩 연속적으로 묶어 개별적인 선분 하나씩 구성해 렌더링한다.
사용자 삽입 이미지

5. GL_TRIANGLES : 정점 3개씩 연속적으로 묶어 개별적인 삼각형을 구성해 렌더링한다.
사용자 삽입 이미지

6. GL_TRIANGLE_STRIP : 처음은 제공되는 3개의 정점으로 삼각형을 구성하고 다음 정점 하나를 통해 또 다른 삼각형을 구성한다. 구성되는 삼각형들은 모두 동일한 면 방향을 갖도록 구성하게 된다.
사용자 삽입 이미지

7. GL_TRIANGLE_FAN : GL_TRIANGLES_STRIP와 비슷하지만 처음 제공되는 정점을 중심으로 팬(Fan) 형태로 삼각형을 구성해 렌더링한다.
사용자 삽입 이미지

이제 이러한 기본 지식을 토대로 OpenGL ES를 통해 안드로이드에서 간단한 사각형 폴리곤 모델을 렌더링 해보는 코드를 작성해 보겠습니다. 기반이 되는 코드는 이전 글의 초기화에서 작성했던 프로젝트를 기반으로 합니다. 변경될 부분은 MyRenderer 클래스와 Square라는 새로운 클래스 추가입니다. 먼저 Square이라는 새로운 클래스를 추가합니다.

이 클래스는 앞에서 언급했던 사각형 폴리곤 모델에 대한 정점과 정점 인덱스 정보를 담고 있으며 렌더링하는 코드가 존재합니다. 구성할 사각형 폴리곤의 정점 좌표와 인덱스 정보는 다음과 같습니다.

사용자 삽입 이미지

즉.. 총 4개의 정점으로 존재하며 총 2개의 삼각형 면으로 구성되어 있습니다. 2개의 삼각형면을 구성하기 위해 사용할 정점에 대한 인덱스가 필요할텐데.. 이에 대한 정보를 클래스에 코드로 추가합니다.

vertices가 정점에 대한 정보를 담고 있으며 indices가 삼각형 면을 구성할 정점에 대한 인덱스 정보를 담고 있습니다. 이제 Square의 생성자에서 이 정보를 OpenGL ES에서 사용할 수 있도록 Buffer로 저장하는 코드를 작성합니다.

자바의 NIO를 이용해 배열을 ByteBuffer에 담아 정점에 대한 버퍼는 FloatBuffer 타입의 vertexBuffer로 정점 인덱스에 대한 버퍼는 ShortBuffer 타입의 indexBuffer에 담아 놓습니다. 이제 3D 모델에 대한 정의는 끝났고.. 이 모델을 렌더링해주는 코드를 Square에 추가해 보면 다음과 같습니다.

먼저 2번 코드는 앞면은 정점 지정 순서가 반시계 방향으로 지정한 것이고 3번 코드와  4번 코드를 통해 뒷면은 렌더링되지 않도록 합니다. 6번 코드는 정점 배열을 통해 모델을 렌더링하겠다고 지정한 코드이며 7번 코드는 모델의 정점 배열을 지정해 주는 코드입니다. 8번은 실제로 렌더링 시키라는 코드로 이 함수에 정점 인덱스 배열이 인자로 들어갑니다. 9번 코드는 정점 배열과 정점 인덱스 배열의 지정이 끝났음을 알립니다. 이제 이렇게 만들어진 Square 클래스를 사용하는 일이 남았습니다.

MyRenderer 클래스에 Square 클래스에 대한 필드 변수를 추가하고 onSurfaceCreated 매서드에서 생성합니다.

onSurfaceCreated 매서드를 보면 Square 변수를 생성하는 코드 이외에도 OpenGL ES의 다양한 값들을 지정해 주는 코드가 존재합니다. 다음으로 MyRenderer 클래스의 onDrawFrame 매서드에서 square를 그리는 코드를 작성합니다.

화면상에 사각형 모델이 보이도록 5번 코드에서 Z축으로 -10만큼 이동하였습니다. 이에 앞서 투영 행렬과 모델뷰 행렬을 지정해 줘야 하는데.. 이 코드는 MyRenderer의 onSurfaceChanged 매서드에서 실행됩니다.

이제 실행해 보면 다음과 같은 결과를 얻을 수 있습니다.

사용자 삽입 이미지

Tag : ,
2011/08/01 15:13 2011/08/01 15:13
[알고리즘] 선이 이루는 각도 구하기
사용자 삽입 이미지
위의 그림에서 보는 것처럼 x축은 오른쪽으로 증가하고 y축은 아래쪽으로 증가하는 축에 대한 2점이 이루는 각도를 구하는 방법입니다. 각도는 60분법이며 편의상 0도 ~ 359.999999도로 산출됩니다. 딱히 말로써 설명드릴 것은 없을듯하고.. 코드 바로 나갑니다. 코드는 Java 입니다.

퍼포먼스를 고려한다면 9번 코드는 불필요합니다. -45도나 315도나 동일한 각도이니까요.
2011/07/30 21:34 2011/07/30 21:34
[Android] 텍스트에 외곽선 효과주기
안드로이는 2D Drawing API가 상당히 뛰어납니다. 일반 PC에서 제공하는 API 수준.. 그 이상인데요. 안드로이에서 제공하는 2D Drawing API 중에서 텍스트에 외곽선 효과를 주는 코드에 대해 간단히 소개해 드리겠습니다. 결과를 먼저 보여드리면 다음과 같습니다.

사용자 삽입 이미지

위의 시스템은 지오서비스에서 현재 개발중인 지적도 현장 검색 시스템으로.. 항공사진과 지적도를 표현하고 있습니다. 지적도의 특성상 라벨로.. 지번을 텍스트로 표현해야 합니다. 텍스트를 그냥 표현하게 되면 지도와 텍스트가 섞여 라벨이 눈에 잘 들어오지 않게 됩니다. 해서.. 라벨에 외곽선을 그려주게 되면 라벨의 가독성이 향상됩니다. 위의 그림에서처럼 글자는 하얀색으로 하고 외곽선은 검정색으로 하는 코드는 다음과 같습니다.

위의 코드에서 보시는 것처럼.. 하얀색의 글자와 외곽선의 검정색에 대한 Paint 객체를 2개 만듭니다. 즉 글자 자체의 하얀색에 대한 textPaint와 검정색 외곽선에 대한 strokePaint 변수가 바로 그 것입니다. 이렇게 만들어진 Paint 객체를 다음의 텍스트 그리기 함수에서 사용합니다.

텍스트 그리기 한번 그리고 외곽선 그리기 한번.. 이렇게 총 2번을 그려서 텍스트의 외곽선을 표현해 줄 수 있습니다. 외곽선의 굵기를 원하는 만큼 지정할 수 있는데요. 방법은 strokePaint의 setStrokeWidth 매서드에 원하는 굵기만큼 값을 주면 쉽게 원하는 바를 얻을 수 있습니다.
Tag :
2011/07/27 14:58 2011/07/27 14:58
[Android] 3D API, OpenGL ES - 1 : 초기화

안드로이드에서 3차원 그래픽을 위한 API는 OpenGL ES입니다. 꽤 오래전부터 3차원 그래픽 API인 OpenGL에 대해 관심이 많은 저로써는 모바일에서 3D API인 OpenGL ES에 대해서도 관심이 많았습니다. 해서 모바일 OS 중의 하나이면서.. 모바일 OS 중에서 가장 관심이 많은 안드로이드에서 3D API인 OpenGL ES에 대한 글을 체계적으로 남겨 보려고 합니다. 그중 가장 먼저 초기화입니다.

이 글의 대상은 안드로이드에 대한 기본적인 내용(Activity, View의 개념)에 대해 알고 있는 개발자 분입니다. 이클립스에서 새로운 안드로이드 프로젝트를 생성할 수 있으며 애뮬레이터이든.. 가지고 계시는 디바이스에서든.. 실행해 그 결과를 살펴보실수 있는 분에 한합니다. 아울러 OpenGL ES가 토대로 하고 있는 OpenGL API를 알고 있다면 매우 쉽게 이 글을 이해하실 수 있을 것입니다. OpenGL ES를 보시기 전에 먼저 OpenGL을 선행 학습하시면 이글을 훨씬 쉽게 이해할 수 있습니다.

먼저 Android Project를 생성합니다. 나타나는 대화상자에서 입력해야할 곳에 아래 그림을 참조해 입력하시기 바랍니다.

사용자 삽입 이미지

위와 같이 입력한 뒤에 Finish 버튼을 클릭하면 OpenGLES_Tutorial1Activity 라는 클래스가 생성됩니다. 여기서 다음과 같이 필드 변수 하나와 onCreate 매서드의 코드를 수정합니다.

MyView라는 View 파생 클래스를 하나 생성할 것인데.. 생성했다고 가정하고 일단 필드로써 정의해 onCreate에서 생성하고 setContentView로 지정했습니다. 여기까지는 안드로이드에서 일반적인 프로젝트를 생성하고 코딩하는 내용입니다. OpenGL ES의 내용은 아직 언급되지 않았구요. 이제 MyView 클래스 작성에서부터 OpenGL ES가 시작됩니다. MyView라는 새로운 클래스를 생성합니다.

사용자 삽입 이미지

상속받을 Superclass는 android.opengl 패키지의 GLSurfaceView라는 점이 중요합니다. 이 클래스는 View라는 클래스를 상속받는 클래스로 다음과 같은 책임을 가지는 클래스입니다.

  • OpenGL ES와 View 시스템을 연결
  • 서페이스에 OpenGL이 렌더링 될 수 있도록 EGLS Display를 관리함
  • Activity의 라이프 사이클과 함께 OpenGL ES가 작동하도록 함
  • 적당한 프레임버퍼의 픽셀 포맷 선택을 쉽게 해줌
  • 렌더링에 대한 별도의 스레드를 만들어 줌
  • OpenGL ES API 호출과 에러에 대한 검사를 위한 디버깅 도구 지원

MyView 클래스에 하나의 필드 변수를 추가하고 생성자를 다음과 같이 코딩합니다.

MyRenderer라는 앞으로 추가할 또 다른 새로운 클래스에 대한 내부 필드를 선언했고 생성자에서 이 필드를 생성한 후 setRenderer로 렌더러로써 지정했습니다. 새롭게 추가할 MyRenderer라는 클래스를 생성합니다.

사용자 삽입 이미지

구현할 Interface를 지정해야 하는데.. android.opengl.GLServiceView 클래스의 Inner Interface인 Renderer 인터페이스를 추가합니다. Finish를 클릭합니다. 이 Renderer 인터페이스에서 구현해 줘야 하는 매서드는 총 3가지입니다.

  • onSufaceCreated - 초기화 코드 부분으로 렌더링 될때 변경되지 않는 것에 대한 설정 코드가 실행되면 적합하다. 화면을 지울 배경 색이나 z-buffer에 대한 활성화 여부 등등
  • onSurfaceChanged - 화면이 가로로 회전될때 등과 같이 화면의 크기가 변경될때 이와 관련된 코드가 실행되면 적합하다. 예를 들어서 Viewport의 크기 지정이라든지 카메라의 재설정 코드 등등
  • onDrawFrame - 프레임을 그리는 코드가 오면 적합하다.

구현해야할 매서드에 대해 내용을 파악했으니.. 이제 MyRenderer에 대한 코드를 작성해 보겠습니다. 색상에 대한 RGB값을 위해 3개의 float 변수를 추가하고 앞의 3개의 메서드를 구현해 보면 다음과 같습니다.

일단.. 이해를 쉽게 하기 위해 단순히 화면을 red, green, blue 필드값으로 지정된 색상으로 지우는 것이 그리는 것의 전부입니다. 즉 onDrawFrame에서는 배경을 Clear할 색상을 지정하기 위해 glClearColor 매서드를 사용했고 실제 지우는 함수는 glClear 입니다. 그리고 onSurfaceChanged에서는 뷰포트의 크기를 지정하는 glViewport를 호출하고 있습니다. onSurfaceCreated에서는 특별하 무엇가를 그리는 것이 없기 때문에 별다른 코드는 존재하지 않습니다. 하지만 무언가 3D 오브젝트를 그릴때 이 부분에 코드가 필요할 것입니다. 실행해 보면 다음과 같은 결과가 나타나게 됩니다.

사용자 삽입 이미지

여기에 잠시 응용을 해보겠습니다.. 사용자가 화면에 손을 대고 스크롤하면 색상이 스크롤한 내용에 따라 변경되게 말입니다. 색상에 대한 값이 MyRenderer에 정의되어 있고.. 사용자의 스크롤에 대한 이벤트는 MyView에서 발생하니.. MyRenderer의 색상값을 변경할 수 있는 매서드를 MyRenderer에 추가해해 줘야 합니다.

이제 MyView에 터치 이벤트를 작성합니다.

네.. 화면에 손을 터치하면 터치된 좌표값을 통해 색상값을 재설정합니다. OpenGL에서 색상값은 0~1.0까지이므로 이 값의 범위에 맞춰주고 있습니다. 실행해서 손을 터치하거나 스크롤해보면 색상값이 그에 따라 변하는 것을 살펴볼 수 있습니다.

Tag : ,
2011/07/04 13:42 2011/07/04 13:42
ActionScript 코드 최적화 항목
이번 핑거아이즈의 속도 개선을 위한 전반적인 코드 리팩토링 시에 고려했던 최적화 항목입니다. 위의 항목중 2/3정도만 반영되었고.. 나머지는 반영하지 못했습니다. 코드 최적화 작업 시간을 따로 마련해 놓지 말고.. 코드 작성 시에 미리 미리 고려해 적용해 놓아야한다는 당연한 진리를 새삼 깨닫게 되었습니다.
  1. 가능하다면 Sprite 대신에 Shape 사용하기
  2. cacheAsBitmap 적절히 사용하기
  3. 라벨에 대해 TextField 보다는 FTE(Flash Text Engine) 사용하기
  4. 가능하다면 mouseChildren, mouseEnable을 false 지정하기
  5. Array 대신 Vector.<type> 사용하기
  6. 드로잉 API(drawPath, drawGraphicsData, drawTriangles) 사용하기
  7. object cache 전략 사용하기
  8. 폴리곤 내부 판정은 hitTestPoint보다 직접 구현해 사용하기
  9. 파생될 일이 없는 클래스는 final로 지정하기
  10. floor, ceil은 int 형변환으로 대체하기(floor(1.5) -> int(1.5), ceil(1.5) -> int(1.5)+1)
  11. abs보다는 직접 -1을 곱하는 방식으로 처리하기
  12. for 반복문 대신 for each 문 사용하기

여하튼... 위의 최적화 코드등을 통해 기존 속도 대비 10%정도 향상된듯합니다만... 체감하기는 어려운 향상인지라 다소 아쉬움이 많이 남습니다.

2011/05/13 15:32 2011/05/13 15:32
SHP와 SHX 파일 해석(파싱)시 주의할 점
SHP의 레코드 헤더와 SHX의 레코드 헤더는 각각 Content Length와 Offset, Content Length라는 Integer 타입의 값이 있습니다. 물론 SHP와 SHX에 대한 Content Length는 동일합니다. 여기서 주의할 점은 이 값이 BYTE 개수가 아닌 WORD 개수라는 점입니다. 예를 들어서 Content Length가 100이라고 할때 레코드 내용의 길이가 100 BYTES가 아닌 2배 길이인 200 BYTES라는 것이지요.

사용자 삽입 이미지

ESRI에서 제공하고 있는 문서에.. 잘(?) 나와 있네요.  길이니 당연히 BYTE 개수겠지 하고 술렁 술렁 넘어갔더랬는데.. 이런 복병이.. 대학원 다닐때 SHP 파일 해석하는 것을 구현했던 적이 있었는데.. 그땐 문제없이 잘했더랬는데.. 초심자의 마음으로 문서를 정밀하게(?) 읽고 구현했던 시절이였으니 지금의 실수가 없었겠지 않나 싶습니다. 여튼.. SHP파일 파싱할때 요점 주의하시기 바랍니다.. 초심의 잃지 말아야한다.. 라는 각오를 새롭게 다져봅니다.
Tag :
2011/05/12 16:01 2011/05/12 16:01
JTS Geometry Class Diagram
사용자 삽입 이미지
JTS는 자바로 잘짜여진 지오메트리 공간연산 기능을 제공하는 오픈소스입니다. 세상에 나온지 수년이 지났고 워낙 잘짜여진터라 C언어로도 포팅되졌습니다. 위의 UML을 그려본 이유는 최근에 자바언어로 ESRI의 SHP 파일과 DBF 파일을 읽고 쓸 수 있는 라이브러리를 오픈소스 차원에서 개발할때 JTS에서 제공하는 Geometry 타입을 사용하기 위함입니다. 자바언어로 SHP와 DBF 파일을 읽는 오픈소스를 찾아보았으나 너무 다른 라이브러리에 깊이 관계를 맺고 있어 최적화시켜 사용하기가 제겐 부담이 되어 이번 기회에 새롭게 만들어 오픈소스 형태로 공유해볼 생각입니다.
Tag :
2011/04/25 14:08 2011/04/25 14:08
단위기능 테스트(이동/확대/축소/회전 조작)
안드로이드 기반의 모바일 GIS 솔루션으로 블랙(BlackPoint)라는 제품을 개발하고 있습니다. 개발에 앞서 몇가지 단위 기능을 구현하고 있는데요. 이번에 구현한 기능은 지도에 대한 이동/확대/축소/회전입니다. 아래는 이러한 지도 회전을 포함해 구현해본 블랙포인트 개발을 위한 단위 테스트에 대한  시연 화면 입니다.


지도의 회전/이동/크기조정은 행렬을 사용하면 쉽게 구현할 수 있습니다. 사실.. 처음 쉽게 구현할 수 있다라는 생각으로 접근했다가 여러가지 문제에 만나.. 제법 어렵게 구현한 기능입니다. 지도 자체에 대한 이동/회전/크기 조정은 다음과 같은 조건을 충족시켜야.. 추후 완전한 제품으로써 개발할때 어려움이 없습니다.
  1. 이동/회전/크기조정에 대한 변환 후에도 원본 데이터는 변경되지 않아야 한다.
  2. 이동은 항상 수직/수평으로만 가능해야 한다.
  3. 회전은 항상 화면 중심에 대해서 이뤄져야 한다.
  4. 크기 조정은 항상 화면 중심에 대해서 이뤄져야 한다.

제가 지금까지 개발해 왔던 2D 맵엔진은 기본적으로 지도를 회전시켜주는 기능은 제공하지 않았습니다. 이유는 퍼포먼스 문제와.. 지도 자체를 꼭 회전시킬 필요가 없었기 때문이였습니다. 그러나 모바일 환경은 디바이스를 사용자가 자유롭게 가지고 다니면서 단말기 자체를 이리 저리 회전시켜 볼 수있으므로 지도 자체를 회전시키는 기능 자체가 매우 중요하게 작용합니다.

끝으로... 블랙포인트는 Xr 솔루션을 구성하는 제품 중 모바일 파트를 담당하고 있는 GIS 엔진입니다. 모바일 GIS로써 갖춰야할 제반 기능을 전반적으로 충족시킬 수 있도록 하는 것이 첫번째 목표입니다.

Tag :
2011/04/15 19:05 2011/04/15 19:05
GeoTools를 이용해 SHP, DBF 파일 읽기

GeoTools(http://www.geotools.org)는 자바 기반의 GIS 시스템을 구축할 수 있는 다양한 기능을 갖춘 오픈소스입니다. 제가 처음 GeoTools에 관심을 가졌던 이유는 SHP 파일을 읽기 위한 자바 라이브러리가 필요해서 였는데요. 이 기능을 파악하기 위해 테스트로 작성했던 코드를 공유해 봅니다.

먼저 SHP 파일에서 좌표를 읽어 들이는 코드입니다.

다음으로는 DBF 파일에서 값을 읽어 들이는 코드입니다.

Tag : ,
2011/03/22 15:59 2011/03/22 15:59
에자일 프랙티스

Agile Practice (원문 cafe.naver.com/gisdev에서 김지윤님)

1. 비난은 버그를 수정하지 못한다.
손가락질 하는 대신, 가능한 해결책을 제시하라 중요한 것은 긍정적인 결과이다.

2. 땜질식 수정에 빠지지 말자
깔끔하고 모든 것이 드러나도록 코드에 정력을 쏟자.

3. 사람이 아니라 아이디어를 비평하라.
누구 아이디어가 더 나은지를 입증하는 것이 아니라 해결책에 도달하는 데에 자부심을 가져라

4. 올바른 일을 하라
정직하라. 그리고 진실을 얘기할 용기를 가져라. 때론 이렇게 한다는 것이 어려울 수도 있지만 그렇기 때문에 용기가 필요한 것이다.

5. 기술 변화를 따라가라.
모든 분야에서 전문가가 될 필요는 없지만, 업계가 어디로 가는지 알고 있어야 하고, 그에 맞춰서 계획을 세워야 한다.

6. 여러분 자신과 팀에 대한 기대치를 높여라
도시락 회의를 통하여 모든 사람의 지식과 숙련도를 올리고 사람들이 화합하게 하자. 즉, 팀이 흥미를 보이는 기술이나 프로젝트를 이롭게 할 기술을 도입하자.

7. 새로운 기술을 배우고 예전 기술을 버려라
새기술을 배울 때, 여러분을 방해 할 낡은 습관을 버려라. 결국 구형차보다 새차가 훨씬 낮다.

8. 계속 왜냐고 물어보라
여러분이 들은 얘기들을 액면 그대로 받아 들이지 마라. 쟁점이 되는 내용의 핵심을 이해할 때까지 계속 질문하라

9. 일이 쌓이기 전에 부딪쳐라
사건들 사이에 꾸준하고 반복적인 간격을 유지해야 일상적으로 되풀이 되는 일을 해결하기 쉽다.

10. 고객이 결정하도록 하라.
개발자, 관리자, 비즈니스 애널리스트가 비즈니스에 치명적인 결정을 내려서는 안된다. 사업주가 이해할수 있는 언어로 세부 내용을 설명하고 사업주가 결정할 수 있도록 한다.

11. 좋은 설계는 지도다.
설계는 바른 방향으로 인도한다. 그것은 허물 수 없는 경계가 아니다. 특정한 방식을 강요 해서는 안된다. 여러분은 설계(혹은 설계자)에게 인질로 잡혀서는 안된다.

12. 필요에 따라 기술을 택하라
먼저 무엇이 필요한지 정하라. 그리고나서 특별한 문제에 기술 사용 여부를 판단하라. 어떤 기술의 사용에 결정적인 질문을 하고 진실하게 답해 보라

13. 프로젝트를 항상 릴리즈 가능하게 하라
프로젝트를 항상 컴파일 할 수 있고, 실행할 수 있으며, 테스트 하고 당장에 배치 할 수 있게하자.

14. 일찍, 자주 통합하라.
코드 통합은 주요 위험요인이다. 이 위험을 완화 시키려면, 일찍 통합하고 규칙적으로 계속 통합해야 한다.

15. 시작부터 어플리케이션을 자동 배치하라
의존성 테스트를 위해 다양한 구성의 머신에 어플리케이션을 설치 할 때, 자동배치를 사용하라. 품질보증은 어플리케이션 뿐 아니라 배치를 테스트 해야 한다.

16. 분명히 보이게 하라.
어플리케이션이 개발도중 항상 눈에 띄게 하고, 고객이 마음에 들게 하라. 고객과 접촉하고 매주 또는 2주에 한번씩 데모를 사용하여 피드백을 미리 구하라

17. 점진적으로 개발하라
최초의 유용한 기능단위로 묶어서 제품을 릴리스 하라. 각 추가 기능의 개발에 1~4주 정도의 반복주기를 사용 하라

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. 다른 사람에게 계속해서 알리자
여러분이 조사한 좋은자료나 자신의 상황. 아이디어를 발표하자. 다른 사람이 일의 상황을 물을 때까지 기다리지 말자

2011/03/02 00:35 2011/03/02 00:35
[C++] STL 함수 객체(functor)

STL에서 제공하는 함수 중 for_each라는 녀석이 있습니다. 컨테이너에 담긴 데이터 하나하나에 대해 처리해야할 연산을 지정해 주는 함수인데.. 이 for_each는 세개의 인자를 갖습니다. 첫번째 인자와 두번째 인자는 컨테이너에 저장된 데이터의 범위이고 세번째가 데이터 하나하나에 대해 수행될 연산인데.. 함수나 함수 객체를 인자로 받습니다. 예를 들어 list 컨테이너에 다음과 같은 데이터를 담아 보는 것으로 시작해 보겠습니다.

총 4개의 데이터가 저장된 상태인데.. 이 4개의 데이터 각각에 값 10을 더해 주는 연산을 for_each 함수를 이용해 만들어 보면...

여기서 한발짝 더 나아가.. 재활용을 고려해 10이라는 값의 증가가 아닌 그때 그때 마다 원하는 값만큼 증가시키고자할때.. 함수 객체를 사용하면 매우 유연하게 활용할수있습니다.

즉, 어떤 함수를 만들어 놓고.. 증가하고자 하는 값을 클래스에 대한 필드로 가지도록 하고 () 연산자의 기능을 재정의해줌으로써 클래스 객체를 마치 함수처럼 사용할수있도록 했습니다.

끝으로 함수 객체말고도.. 가장 처음 언급한 함수를 템플릿으로 정의함으로써 원하는 값만큼 증가시키는 기능의 구현도 가능한데.. 아래와 같습니다.

STL.. 기본만 알아도 무척 편리한데.. 좀더 알면 알수록.. 재미있습니다. 손맛이라고 해야 하나.. C++ 참.. 손맛 나는 언어입니다..

2011/03/01 21:41 2011/03/01 21:41
[C++] STL 알고리즘 기본

STL을 사용함에 있어서 STL을 자료구조로써만 바라봤고 자료구조로써만 사용했습니다. 견고하면서 빠르며 융통성이 뛰어난 자료구조로써 말입니다. 이 자료구조에 대한 연산, 즉 알고리즘에 대해서는 간과했고.. 필요한 연산은 STL에서 제공해주고 있다는 것을 알고 있음에도 그냥 제 스스로 코드를 만들 써 왔습니다.

예를 들어서 자료구조로써 링크드 리스트(Linked List)는 STL에서 list 입니다. 자료구조로써 아래와 같이.. 저에겐 매우 익숙한 코드로 데이터를 저정합니다.

링크드 리스트라는 자료구조가 필요했고.. 매우 효율적이면서도 매우 견고한 링크드 리스트의 구현체로써 STL을 사용해 데이터를 저장합니다. 여기서 저장된 데이터 중 가장 큰 값이 필요할 경우 저는 의례 다음처럼 코딩을 해왔습니다.

실제로.. 이렇게 사용해 왔는데요. 아마도 STL을 저보다 더 잘 사용하시는, 대부분 그러하시겠지만.. 정말 이렇게 코딩을 했다고? 하며 실소를 금치 못하실거라 생각됩니다. 네.. 반성중입니다. 다시 초심으로 돌아가서.. 이러한 무지를 버리고 STL에서 제공하는 본연의 기본 알고리즘을 활용하려기에 이 글을 작성해 봅니다.

그렇다면 위의 최소값을 얻기 위한 STL의 방식은 무엇일까요? 아래와 같이 최적화되었으며 빠르며 명확한 방법을 제공합니다.

최소값이 아닌 최대값을 구하는 함수는 max_element입니다.

이외에도 어떤 값을 갖는지를 판단하는 함수의 경우는 다음 코드와 같습니다.
STL에서는 이처럼 매우 효율적인 방식의 알고리즘 함수를 많이 제공하지만 끝으로 정렬 함수를 소개하면서 마무리 하고자 합니다.

이제.. 이렇게 블로그를 통해 정리를 해 놓았으니 향후 STL을 이용해 자료구조로써 뿐만 아니라 알고리즘 연산에 대해서도 최대한 STL을 사용해 봐야겠습니다.

2011/02/13 06:34 2011/02/13 06:34
정삼각형의 좌표 구하기
사용자 삽입 이미지
BLOG main image
 Notice
DuraMap-Xr 소개 및 다운로드
[오픈소스] SimpleSHP v0.1
FingerEyes-Xr 소개 및 다운로드
OpenGL Tutorials
 Category
전체 (532)
GIS 개발 (146)
프로그래밍 (233)
스치는 생각들 (130)
번역 또는 집필 (3)
 TAGS
GIS Xr OpenGL Shader FingerEyes BlackPoint Algorithm Java Map Engine WPF
 Calendar
«   2012/02   »
      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      
 Recent Entries
맥북에어 6개월간 사용한...
[FingerEyes] 지오메트리...
[FingerEyes] Geometry로...
[FingerEyes] FID 리스트...
[FingerEyes] UPDATE, INS...
 Recent Comments
Shape를 분할시키는 프로...
은빛소나기 - 02/08
이런... 윗댓글에 오해가...
김형준 - 02/08
영어 잘하는 방법좀 부탁...
1 - 02/08
정말 감사한 댓글이네요.. ^^
김형준(Dip2K) - 02/08
답장 메일 드렸습니다.....
김형준(Dip2K) - 02/08
아 정말 눈물이 나오도록...
앙 - 02/08
소스코드 그대로 써보아도...
인현환 - 02/07
글의 예제 코드의 숫자들...
김형준 - 02/07
안녕하세요. 포스트 잘 보...
인현환 - 02/07
메일로 답변드렸습니다....
김형준 - 02/01
 Archive
2012/02
2012/01
2011/12
2011/11
2011/10
2011/09
2011/08
2011/07
2011/06
2011/05
2011/04
2011/03
 Link Site
Adobe Flex 3 Help
Cartograph 2.0
GADM
GIS 위키디피아
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OSGeo 한국 지부
Paul Bourke Site
Wikipedia
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
네이버 과학
대한측량협회
류광님의 블로그
이민파님의 공간분석과 리...
지오서비스(GeoService)
 Visitor Statistics
Total : 930598
Today : 67
Yesterday : 645
태터툴즈 배너
rss