부록 B: 구현 참고 사항

B.1. 소개

다음 참고 사항에서는 소프트웨어 개발자가 SVG 언어의 기능에서 요구하는 형식으로 콘텐츠를 변환하거나 변환할 때 사용할 수 있는 알고리즘 및 기타 전략을 설명합니다.

B.2. 타원 호 매개변수 변환

다른 경로 세그먼트 표기법과 일관성을 유지하기 위해, SVG 경로의 호는 곡선의 시작점과 끝점 기준으로 정의됩니다.

타원 호의 이러한 매개변수화는 끝점 매개변수화라고 부릅니다. 끝점 매개변수화의 장점 중 하나는 모든 경로 명령이 새로운 "현재 점"의 좌표로 끝나는 일관된 경로 문법을 허용한다는 점입니다.

그러나 이것만이 소프트웨어나 수학에서 호의 기하를 기술하는 방법은 아닙니다. 이 섹션에서는 대안인 중심 매개변수화와, SVG의 끝점 매개변수화와 상호 변환하는 방법을 설명합니다.

B.2.1. 타원 호 끝점 문법

SVG 경로 명령에서 표현되는 타원 호는 다음과 같은 순서로 매개변수로 설명됩니다:

(x1, y1)은 경로의 현재 지점의 절대 좌표로, 이전 경로 명령의 마지막 두 매개변수에서 얻습니다.

rxry는 타원의 반지름(반장축 및 반단축)입니다.

φ는 현재 좌표계의 x축에서 타원의 x축까지의 각도입니다.

fA는 큰 호 플래그로, 180도 이하의 호가 선택되면 0이고, 180도를 초과하는 호가 선택되면 1입니다.

fS는 스윕 플래그로, 중심에서 호까지의 선이 각도가 감소하는 방향으로 스윕하면 0, 증가하는 방향으로 스윕하면 1입니다.

(x2, y2)는 호의 마지막 지점의 절대 좌표입니다.

B.2.2. 매개변수화 대안

타원 호 위의 임의의 점 (x, y)은 다음과 같은 2차원 행렬 방정식으로 표현할 수 있습니다:

(eq. 3.1)
( x y ) = ( cos φ - sin φ sin φ cos φ ) · ( r x cos θ r y sin θ ) + ( c x c y )
    x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx
    y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
  

(cx, cy)는 타원의 중심 좌표입니다.

rxry는 타원의 반지름(반장축 및 반단축)입니다.

φ는 현재 좌표계의 x축에서 타원의 x축까지의 각도입니다.

θ는 아크 위의 점 (x, y)이 위치한 아크 주위의 각도이며, 다음 범위 내에서 변합니다:

타원을 늘리고 회전시킨 원으로 생각한다면, θ1, θ2, Δθ는 각각 늘리기 및 회전 전 아크의 시작 각도, 끝 각도, 스윕 각도입니다. 이는 그래픽 API에서 흔히 사용되는 대안적 매개변수화로, 중심 매개변수화라고 부릅니다. 다음 섹션에서는 중심 매개변수화와 끝점 매개변수화 간의 변환 공식이 나옵니다.

B.2.3. 중심에서 끝점 매개변수화로의 변환

다음 변수들이 주어졌다고 가정합니다:

cx cy rx ry φ θ1 Δθ

구해야 하는 값은 다음과 같습니다:

x1 y1 x2 y2 fA fS

다음 공식들을 사용하여 구할 수 있습니다:

x 1 y 1 = cos φ - sin φ sin φ cos φ r x cos θ 1 r y sin θ 1 + c x c y
(eq. 4.1)
x 2 y 2 = cos φ - sin φ sin φ cos φ r x cos θ 1 + Δ θ r y sin θ 1 + Δ θ + c x c y
(eq. 4.2)
f A = 1 if Δ θ > 180 ° 0 if Δ θ 180 °
(eq. 4.3)
f S = 1 if Δ θ > 0 ° 0 if Δ θ < 0 °
(eq. 4.4)

B.2.4. 끝점에서 중심 매개변수화로의 변환

다음 변수들이 주어졌다고 가정합니다:

x1 y1 x2 y2 fA fS rx ry φ

구해야 하는 값은 다음과 같습니다:

cx cy θ1 Δθ

방정식은 (x1, y1)에서 (x2, y2)를 잇는 선분의 중점에 원점을 옮기고, 이어서 좌표축을 타원의 축과 맞추는 회전을 거치면 더 간단해집니다. 모든 변환된 좌표는 프라임(′) 기호로 표시됩니다. 이 값들은 중심 매개변수화 변수들을 구하는 중간값입니다. 이 절차는 다음 단계로 구성됩니다:

B.2.5. 범위를 벗어난 반지름의 보정

이 섹션에서는 경로 구현 참고 사항에서 설명한 대로, 범위를 벗어난 rxry에 대해 필요한 수학적 조정 방법을 설명합니다. 알고리즘적으로 이러한 조정은 다음 단계로 구성됩니다:

B.3. 고정밀 기하 생성 참고 사항

이 섹션은 안내용입니다.

SVG의 실수 정밀도는 단정밀도입니다. 기술 데이터를 처리하는 적합한 SVG 생성기에서 단정밀도를 초과하는 정보 표현이 필요한 경우(예: 지도나 기술 도면), 적합한 SVG 뷰어에서 일관된 표시를 보장하기 위해 이 섹션의 절차를 따르는 것이 권장됩니다.

단정밀도보다 더 높은 실제 정밀도로 표시하려면, CTM을 생성할 때(자세한 내용은 적합한 SVG 뷰어 섹션의 CTM 생성 처리 참조) 적어도 배정밀도 부동소수점이 사용된다는 점을 활용할 수 있습니다. 이를 활용한 콘텐츠 생성 절차는 다음과 같습니다:

  1. 콘텐츠를 타일로 분할하여, 각 타일 내 객체의 위치와 크기를 지정할 때 필요한 유효 숫자 개수가 단정밀도 범위 내에 있도록 합니다. 여기서 원래 콘텐츠가 가진 좌표계를 소스 공간이라 부릅니다.
  2. 타일마다 소스 공간에서 타일 공간으로 변환하는 좌표 변환 행렬을 생성합니다. 타일 공간은 타일의 왼쪽 위가 원점 (0,0)인 좌표계입니다. 변환 행렬의 각 요소는 단정밀도 범위 내에 있어야 합니다.
  3. 각 타일의 콘텐츠를 생성된 좌표 변환 행렬을 이용해 소스 공간에서 타일 공간으로 변환합니다. 그 결과 각 객체의 파라미터를 단정밀도 범위 내 유효 숫자로 표현할 수 있게 됩니다.
  4. 각 타일에 대해 타일 공간에서 소스 공간으로 변환하는 역변환 행렬을 생성합니다. 이는 이후 단계에서 해당 타일 요소의 transform 속성으로 사용됩니다.
  5. 각 타일을 SVG에서 독립적인 사용자 좌표계로 배치합니다. 예를 들어, 타일들은 g 요소로 표현할 수 있으며, transform 속성에 이전 단계에서 생성한 변환 행렬을 지정합니다. 그리고 3단계에서 생성된 분할 그래픽은 그 하위에 배치합니다.
타일보다 큰 벡터 그래픽 분할 예시
분할 전 분할 후
분할 전 예시 분할 후 예시
유효 숫자 개선 예시
1단계 : 콘텐츠 분할 5단계 : 더 작은 유효 숫자와 적절한 이동으로 타일 배치
타일로 콘텐츠 분할 예시 분할된 콘텐츠 이동 및 배치 예시
이 예시에서는 사용자 좌표계가 7자리인 타일을 사용해 8자리 유효 숫자를 제공합니다.