'프로그래밍/TrueType Font'에 해당되는 글 3건

  1. 2009.06.30 Cubic Bezier Curve 일반식
  2. 2009.05.29 베지어 커브 (Bezier curve) 3
  3. 2008.01.13 FreeType 을 이용한 TrueType Font 파일 읽기 4
3차 베지어 커브 일반식 유도

혹자는 왜 하필이면 3차 베지어 커브이냐 ... 라고 궁금증을 가질 수도 있지만,
대부분의 폰트는 3차 이하의 베지어 커브들로 구성된다는 점,
3차 베지어 커브이면 원에 가까이 근사할 수 있다는 점 등이 그 이유일 것이다.
실제로 베지어 커브로는 완벽한 원을 만들 수 없다.

따지고 보면 1차 베지어 커브(사실은 직선)로도 원하는 모양을 만들 수 있긴 하다.
물론 이건 매우 비효율적이다. 어차피 픽셀로 표현되는 컴퓨터 나라에서 곡선이란 게 무의미 할 수도 있다.
아무튼 그건 그거고 ...

3차 베지어 커브의 일반식을 유도하기 위한 조건은 다음과 같다.
1. 컨트롤 포인트는 4개이다. (P0, P1, P2 and P3)
2. 곡선은 첫번째 포인트와 마지막 포인트를 지난다.
3. 곡선의 첫 지점에서의 기울기는 P0P1 을 이은 직선의 기울기의 3배이다.
4. 곡선의 마지막 지점에서의 기울기는 P2P3 을 이은 직선의 기울기의 3배이다.


위 사실에 근거하여,
3차 식을 다음과 같이 u에 대한 3차 식으로 두고,

사용자 삽입 이미지





이놈을 매트릭스로 표현하면,
사용자 삽입 이미지






즉,
사용자 삽입 이미지





그리고 미분한 식은 다음과 같다.
사용자 삽입 이미지





위 조건 1,2,3,4 를 적용하여 보면,
사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지





사용자 삽입 이미지
이 식에서

사용자 삽입 이미지
로 치환하면, 다음과 같다.

사용자 삽입 이미지



조건 1,2,3,4 로부터 유도된 식으로부터
사용자 삽입 이미지

사용자 삽입 이미지
를 구할 수 있고, 값은 다음과 같다.

사용자 삽입 이미지
사용자 삽입 이미지









사용자 삽입 이미지
라고 치환하면,

사용자 삽입 이미지
이렇게 되고,

고로,
사용자 삽입 이미지
다음을 통해서 b(u) 를 구할 수 있다.








이제 다 끝났다.
사용자 삽입 이미지


이었으므로, 다음과 같은 일반항이 도출된다.
사용자 삽입 이미지







references :
http://en.wikipedia.org/wiki/B%C3%A9zier_curve
Interactive Computer Graphics 2nd Edition (Addison Wesley) p434-436

수식 편집 :
http://www.codecogs.com/


아놔 심플 ~ 수학 공식 쓰기 캐노가다 ㅜㅜ


:

베지어 커브 (Bézier curve)

베지어 커브는 1962년 프랑스 엔지니어인 Pierre Bézier에 의해 만들어 졌는데,
이 커브는 그가 자동차 차체를 디자인 하기 위한 목적으로 사용한 커브였다.

이 커브는 몇 개의 조절점(Control points)들로 구성되며,
조절점들은 a parametric mathematical function에 의해 커브 모양을 결정한다.
커브의 차수는 "조절점의 개수-1"차로 결정되는데, 다음 공식에 의해
커브를 구성하는 점들의 위치가 결정된다

사용자 삽입 이미지








조절점 중 처음과 끝 점은 곡선을 지나가고, 나머지는 어느 곡선과 만나지 않는다.
곡선은 조절점으로 이루어진 다각형을 벗어나지 않는다.
조절점이 하나 뿐이면 그냥 점이다.
조절점이 두 개이면 직선이다.

조절점이 3 개인 경우는 다음과 같이 2차식이 된다.
B(t) = P0 * ( 1 - t ) 2 + P1 * 2 * t ( 1 - t ) + P2 t2

조절점이 4 개인 경우,
B(t) = P0 * ( 1 - t )3 + P1 * 3 * t * ( 1 - t )2 + P2 * 3 * t2 * ( 1 - t ) + P3 * t3


references
http://www.moshplant.com/direct-or/bezier/
http://en.wikipedia.org/wiki/Bernstein_blending_function
http://cagd.cs.byu.edu/~557/
 

:
FreeType 을 이용한 TrueType Font 파일 읽기

FreeType 다운로드
참조 : http://freetype.sourceforge.net/index2

혹시 파일을 받으려고 헤메다가 못 받으신 분은 ... -_-;;
여기서 받으세요. (FreeType 2.3.5)
http://sourceforge.net/project/showfiles.php?group_id=3157 


여기서는 비주얼 스튜디오 6.0 을 기준으로 만든 예제입니다.
물론 다른 버전을 사용하더라도 별 차이는 없습니다. : )
원본을 보시려면 다음을 참조하세요.
http://freetype.sourceforge.net/freetype2/docs/tutorial/step1.html




우선 freetype 라이브러리를 다운 받고 적당한 곳에 압축을 풀고, VS 실행.
라이브러리 세팅.

사용자 삽입 이미지






















[Tools] > [Options ...] 를 선택하면 다음과 같은 다이얼로그가 뜬다. 여기서 세팅

사용자 삽입 이미지

























[Directories] 탭을 선택하고 "Show directories for:" 항목에서 "Include files" 를 선택한 후
아까 압축을 풀었던 freetype 라이브러리의 경로를 추가한다. (include 디렉토리를 서택하면됨)
... freetype-2.3.5\include

마찬가지로
"Show directories for:" 항목에서 "Library files" 를 선택하고 objs 폴더 경로를 추가한다.
... freetype-2.3.5\objs


[Project] > [Settings ...] 를 선택하고

사용자 삽입 이미지














다음과 같이 ... freetype-2.3.5\objs 폴더에 있는 lib 파일의 이름을 추가한다.

사용자 삽입 이미지




드디어 세팅 끝 -_-;;


소스 파일에 다음과 같이 FreeType 헤더를 추가한다.

#include <ft2build.h>
#include FT_FREETYPE_H

폰트를 로딩하는 함수는 다음과 같이 .
// fontFilePath : TTF file path.
// code : unicode of character which is loaded
bool LoadFont(const char* fontFilePath, int32 code)

    FT_Library  library;   /* handle to library     */
    FT_Face     face;      /* handle to face object */

    if ( FT_Init_FreeType( &library ) ) {
        return false;
    }

    if( FT_New_Face( library, fontFilePath, 0, &face) ) {
        return false;
    }

    if( FT_Set_Pixel_Sizes( face, BITMAP_WIDTH, BITMAP_HEIGHT) ) { 
        return false;
    }

    if( FT_Load_Char( face, code, FT_LOAD_RENDER ) ) {
        return false;
    }
}

위와 같이 TrueType Font 파일의 경로와 로딩하려는 문자의 유니코드를 파라미터로 받아
함수를 실행하면 다음과 같이 face 에 데이터가 로딩된다.
(다음 예제는 굴림 폰트의 'a' 를 읽은 결과이다)

사용자 삽입 이미지









































읽은 글자에 대한 베지어 커브 컨트롤 포인트 리스트는 다음을 보면 된다.
face->glyph->outline

여기는 컨투어 개수와 컨트롤 포인트 리스트가 있다.
글자의 외곽선 정보 뿐만 아니라 비트맵 이미지도 읽을 수 있다.

face->glyph->bitmap

각 데이터 형에 관한 자세한 내용은 FreeType 페이지를 참조하라.



베지어 커브를 그릴 수 있는 적절함 함수를 추가하여서 그림을 그려보면 대략 다음과 같이
예쁜 그림을 얻을 수 있다. 이건 직접 해 보셈 -_-;

사용자 삽입 이미지

: