2011-11-29 4 views
6

벡터 이미지를 래스터 화하는 일반적인 알고리즘은 무엇입니까? 선, 원, 베 지어 곡선 등의 래스터 화 알고리즘을 많이 찾았습니다. 그러나 일반적으로 어떻게해야합니까? 단순히 벡터 그림에서 foreach 벡터 그림을 가져 와서 픽셀을 가져 와서 래스터 이미지에 넣으시겠습니까? 또는 다른 것?벡터 이미지를 래스터 화하기위한 일반 알고리즘

또 다른 질문은, 어떻게 동시성을 사용하여 처리 시간을 향상시킬 수 있습니까? 예를 들어 벡터 수치를 분리하고 동시에 픽셀을 얻을 수 있습니다. 하지만 다른 방법이있을 수 있습니까?

+1

현재 어떤 그래픽 환경을 사용하고 있습니까? 내가 아는 모든 프레임 워크에는 래스터 화 문제를 해결하기 위해 벡터 그래픽을 화면이나 래스터 비트 맵에 그리는 기성품 솔루션이 있습니다. –

+0

@DocBrown에 동의합니다. 기존의 모든 가능한 옵션을 시도한 다음, 수많은 사람들이 이미 수행 한 작업을 가능한 한 많이 사용하여 가능한 한 작은 범위에서 다시 작업하지 않는 한 휠을 재발 명하지 마십시오. 질문의 특징 인 – cdeszaq

+0

은 구체적인 벡터를 래스터화할 필요가 없으며 구체적인 프레임 워크를 사용하지 않습니다. 이론적 인 질문입니다. 흥미 롭습니다.이 프레임 워크가 사용하는 알고리즘은 무엇이며 어떻게 병행 성으로 이러한 알고리즘을 개선 할 수 있습니까? – medvedNick

답변

3

일반적인 래스터 화 알고리즘은 이미지의 각 다각형에 대한 것입니다.

(폴리곤은 직선 세그먼트와 파라 메트릭 스플라인으로 구성된 하나 이상의 닫힌 커브로 정의됩니다. 보통 2 차 (원뿔 이명 2 차) 및 3 차 (3 차) 베 지어 스플라인입니다. 커브가 가로 지르면서 내부가 항상 왼쪽에 있으므로 일반 모양이 반 시계 방향으로 실행되고 구멍이 시계 방향으로 실행되도록 정의됩니다.)

(i) (투영) 다각형을 다음과 같은 좌표 시스템으로 변환합니다. 목적지 비트 맵 해상도가 동일 할 필요는 없으며 앤티 앨리어스가 적용된 이미지의 경우 종종 더 커집니다. 예를 들어 FreeType은 64 번째 픽셀을 사용합니다.

(ii) (Y에서 단조롭게 만들기) 필요한 경우 다각형의 각 세그먼트를 연속적으로 위 또는 아래로 움직이는 작은 세그먼트로 분할하십시오. 이 단계는 곡선 세그먼트에만 필요하며 베 지어 스플라인을 사용할 때 상대적으로 쉽습니다. 일반적인 방법은 단조가 성취 될 때까지 반복적으로 이등분하는 것입니다. 모든 수평 세그먼트를 버립니다.

(iii) (실행 한계 표시) 각 세그먼트를 임시 비트 맵에 그립니다. 직선에 Bresenham의 알고리즘을 사용하십시오. 커브의 경우, 선이 실제 커브의 1/8 픽셀 이상이 될 때까지 등분합니다. 그런 다음 처음부터 끝까지 직선을 사용하십시오. 그림을 그릴 때 픽셀을 표시하여 (a) 런의 시작 또는 끝인지 여부 - 아래쪽 선이 시작이고 위쪽 선이 끝임을 나타냅니다. (b) 범위 - 모양 안에있는 픽셀의 비율. 알고리즘의 세부 사항이 다르며 권선 규칙 (non-zeroeven-odd)이 구별되는 부분입니다.

(iv) (스캔) 임시 비트 맵을 행 단위로 탐색합니다. 각 행에 대해 왼쪽에서 오른쪽으로 스캔하십시오. 비트 맵에 저장된 번호를 저장된 번호에 추가하여 현재 위치가 모양 안에 있는지 여부를 나타내는 상태를 유지 관리합니다. 단순한 흑백 래스터 라이 제이션에서 이전 단계에서 작성된이 숫자는 모서리를 도형을 통과 할 때 +1이되고 도형에서 나오면 -1이됩니다. 같은 상태에있는 픽셀의 누적을 누적하십시오. 실행을 드로잉 모듈로 보냅니다. 예를 들어, FreeType은 Y 좌표, 시작 및 종료 X 좌표 및 0에서 255까지의 범위로 구성된 런을 내 보냅니다. 드로잉 모듈은 현재 도면 색상에 적용된 알파 값으로 적용 범위를 사용할 수 있습니다 , 또는 텍스처에 적용된 마스크로 사용할 수 있습니다.

위의 내용은 지나치게 단순화되었지만 일반적인 생각을 제공합니다.

대부분의 오픈 소스 프로그램은 다음과 같은 프로젝트 중 하나에서 파생 된 래스터 코드를 사용 : - 독립형 상대적으로 사용하기 쉬운 모노 및 안티 앨리어싱 모두 래스터 라이저 모듈을 포함하는 글꼴 래스터 라이저 -

FreeType을 그 글꼴을위한 것이 아니라 모든 모양을위한 것입니다. 필자는이 시스템을 여러 상용 C++ 프로젝트에서 성공적으로 사용했습니다.

FreeType의 시스템은 Raph Levien의 Libart에서 영감을 얻었습니다.

Anti-Grain은 또 다른 인기 있고 영향력있는 C++ 라이브러리입니다.

Kiia Kallio가 구현 한 scan-line edge flag system도 있습니다.이 버전은 유망 해 보이며 안티 그레인보다 빠릅니다.

대부분의 라이브러리가 2 차 및 3 차 베 지어 스플라인과 직선 세그먼트로 이루어진 모양을 허용하지만 전부는 아닙니다. 그렇지 않은 사람 (예 : K. Kallio의 도서관)은 직선형 폴리곤 만 사용합니다. 그러나 커브를 실제 커브에서 원하는 최대 거리보다 가까운 일련의 선분으로 '평평하게'만드는 것은 매우 쉽습니다. FreeType은 내부적으로 그렇게하며 필요에 따라 코드를 빌려올 수 있습니다.

+0

질문은 "도서관이하는 일"에 관한 것이 아니라 "어떻게이 일을 하는가"에 관한 것이다. 그러나 대답을 주셔서 감사합니다 – medvedNick

+0

네 말이 맞아. 나는 이것을 간단한 방법으로 치유하려고 노력했다. 그러나 래스터 라이 제이션 알고리즘은 속도가 매우 빠르기 때문에 매우 복잡해지며 Google을 통해 더 자세한 설명을 찾는 것이 좋습니다. –

관련 문제