다음 참고 사항에서는 소프트웨어 개발자가 SVG 언어의 기능에서 요구하는 형식으로 콘텐츠를 변환하거나 변환할 때 사용할 수 있는 알고리즘 및 기타 전략을 설명합니다.
다른 경로 세그먼트 표기법과 일관성을 유지하기 위해, SVG 경로의 호는 곡선의 시작점과 끝점 기준으로 정의됩니다.
타원 호의 이러한 매개변수화는 끝점 매개변수화라고 부릅니다. 끝점 매개변수화의 장점 중 하나는 모든 경로 명령이 새로운 "현재 점"의 좌표로 끝나는 일관된 경로 문법을 허용한다는 점입니다.
그러나 이것만이 소프트웨어나 수학에서 호의 기하를 기술하는 방법은 아닙니다. 이 섹션에서는 대안인 중심 매개변수화와, SVG의 끝점 매개변수화와 상호 변환하는 방법을 설명합니다.
SVG 경로 명령에서 표현되는 타원 호는 다음과 같은 순서로 매개변수로 설명됩니다:
(x1, y1)은 경로의 현재 지점의 절대 좌표로, 이전 경로 명령의 마지막 두 매개변수에서 얻습니다.
rx와 ry는 타원의 반지름(반장축 및 반단축)입니다.
φ는 현재 좌표계의 x축에서 타원의 x축까지의 각도입니다.
fA는 큰 호 플래그로, 180도 이하의 호가 선택되면 0이고, 180도를 초과하는 호가 선택되면 1입니다.
fS는 스윕 플래그로, 중심에서 호까지의 선이 각도가 감소하는 방향으로 스윕하면 0, 증가하는 방향으로 스윕하면 1입니다.
(x2, y2)는 호의 마지막 지점의 절대 좌표입니다.
타원 호 위의 임의의 점 (x, y)은 다음과 같은 2차원 행렬 방정식으로 표현할 수 있습니다:
(eq. 3.1)x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
(cx, cy)는 타원의 중심 좌표입니다.
rx와 ry는 타원의 반지름(반장축 및 반단축)입니다.
φ는 현재 좌표계의 x축에서 타원의 x축까지의 각도입니다.
θ는 아크 위의 점 (x, y)이 위치한 아크 주위의 각도이며, 다음 범위 내에서 변합니다:
타원을 늘리고 회전시킨 원으로 생각한다면, θ1, θ2, Δθ는 각각 늘리기 및 회전 전 아크의 시작 각도, 끝 각도, 스윕 각도입니다. 이는 그래픽 API에서 흔히 사용되는 대안적 매개변수화로, 중심 매개변수화라고 부릅니다. 다음 섹션에서는 중심 매개변수화와 끝점 매개변수화 간의 변환 공식이 나옵니다.
다음 변수들이 주어졌다고 가정합니다:
cx cy rx ry φ θ1 Δθ
구해야 하는 값은 다음과 같습니다:
x1 y1 x2 y2 fA fS
다음 공식들을 사용하여 구할 수 있습니다:
|
(eq. 4.1) |
|
(eq. 4.2) |
|
(eq. 4.3) |
|
(eq. 4.4) |
다음 변수들이 주어졌다고 가정합니다:
x1 y1 x2 y2 fA fS rx ry φ
구해야 하는 값은 다음과 같습니다:
cx cy θ1 Δθ
방정식은 (x1, y1)에서 (x2, y2)를 잇는 선분의 중점에 원점을 옮기고, 이어서 좌표축을 타원의 축과 맞추는 회전을 거치면 더 간단해집니다. 모든 변환된 좌표는 프라임(′) 기호로 표시됩니다. 이 값들은 중심 매개변수화 변수들을 구하는 중간값입니다. 이 절차는 다음 단계로 구성됩니다:
1단계: 계산 (x1′, y1′)
|
(eq. 5.1) |
2단계: 계산 (cx′, cy′)
|
(eq. 5.2) |
여기서 + 부호는 fA ≠ fS일 때 선택하고, − 부호는 fA = fS일 때 선택합니다.
3단계: 계산 (cx, cy) from (cx′, cy′)
|
(eq. 5.3) |
4단계: 계산 θ1 및 Δθ
일반적으로 두 벡터 (ux, uy) 와 (vx, vy) 사이의 각은 다음과 같이 계산할 수 있습니다
|
(eq. 5.4) |
여기에서 나타나는 ± 부호는 ux vy − uy vx의 부호입니다.
이 각도 함수를 이용하여 θ1 및 Δθ를 다음과 같이 표현할 수 있습니다:
|
(eq. 5.5) |
|
(eq. 5.6) |
여기서 Δθ는 −360° < Δθ < 360° 범위로 고정되며, 다음과 같습니다:
만약 fS = 0이면, Δθ < 0,
만약 fS = 1이면, Δθ > 0.
즉, fS = 0 이고 (eq. 5.6)의 오른쪽이 0보다 크면 360°를 빼고, fS = 1 이고 (eq. 5.6)의 오른쪽이 0보다 작으면 360°를 더합니다. 그 외에는 그대로 둡니다.
이 섹션에서는 경로 구현 참고 사항에서 설명한 대로, 범위를 벗어난 rx와 ry에 대해 필요한 수학적 조정 방법을 설명합니다. 알고리즘적으로 이러한 조정은 다음 단계로 구성됩니다:
1단계: 반지름이 0이 아님을 보장
rx = 0 또는 ry = 0이면, (x1, y1)에서 (x2, y2)까지 직선으로 처리하고 중단합니다. 그렇지 않으면,
2단계: 반지름이 양수임을 보장
rx와 ry의 절대값을 취합니다:
|
(eq. 6.1) |
3단계: 반지름이 충분히 큰지 확인
방정식 (eq. 5.1)의 프라임 좌표값을 사용하여 계산합니다
|
(eq. 6.2) |
위 방정식의 결과가 1 이하이면 rx와 ry를 추가로 변경할 필요가 없습니다. 결과가 1보다 크면 다음과 같이 변경합니다
|
(eq. 6.3) |
4단계: 계산 계속 진행
나머지 타원 호 계산을 계속 진행합니다. 예: 끝점에서 중심 매개변수화로의 변환 알고리즘 등. 참고: 이 섹션의 반지름 보정 결과로, 타원의 중심에 대한 방정식 (5.2)는 항상 적어도 하나의 해를 가지며(즉, 근호 안이 음수가 되지 않음), 만약 반지름이 방정식 (eq. 6.3)으로 확대된 경우에는 (eq. 5.2)의 근호 안이 0이 되어 타원의 중심에 대해 정확히 하나의 해가 존재합니다.
이 섹션은 안내용입니다.
SVG의 실수 정밀도는 단정밀도입니다. 기술 데이터를 처리하는 적합한 SVG 생성기에서 단정밀도를 초과하는 정보 표현이 필요한 경우(예: 지도나 기술 도면), 적합한 SVG 뷰어에서 일관된 표시를 보장하기 위해 이 섹션의 절차를 따르는 것이 권장됩니다.
단정밀도보다 더 높은 실제 정밀도로 표시하려면, CTM을 생성할 때(자세한 내용은 적합한 SVG 뷰어 섹션의 CTM 생성 처리 참조) 적어도 배정밀도 부동소수점이 사용된다는 점을 활용할 수 있습니다. 이를 활용한 콘텐츠 생성 절차는 다음과 같습니다:
분할 전 | 분할 후 | |
---|---|---|
![]() |
![]() |
1단계 : 콘텐츠 분할 | 5단계 : 더 작은 유효 숫자와 적절한 이동으로 타일 배치 | |
---|---|---|
![]() |
![]() |
|
이 예시에서는 사용자 좌표계가 7자리인 타일을 사용해 8자리 유효 숫자를 제공합니다. |