2010-02-11 3 views

답변

7

허용되는 오류의 양 (예 : 시각적 품질)과 원 (타원)의 크기에 따라 다릅니다. 더 큰 원은 동일한 품질을 얻으려면 더 많은 포인트가 필요합니다. 약간의 수학으로 주어진 오류에 필요한 포인트 수를 정확히 계산할 수 있습니다.

일련의 선분으로 표시된 원을 생각하면 선분의 끝점은 정확히 원 (픽셀 격자 무시)에 놓입니다. 실제 원과 선 세그먼트 표현 간의 가장 큰 편차는 각 선분의 중심에서 발생하며이 오류는 모든 선분에 대해 동일합니다. 시계 반대 방향으로가는 X 축으로부터 제 세그먼트 찾고

그 두 종점은 : r는 원의 반경과 th이다

A = (r, 0) 
B = (r . cos(th), r . sin(th)) 

각 라인 세그먼트에 의해 커버되는 각도 (예를 들어 720 점이 있다면 각 선분은 0.5도를 포함하므로 th은 0.5도입니다.

이 선분의 중점은

M = A + (B - A)/2 
    = (r, 0) + (r (cos(th) - 1)/2, r . sin(th)/2) 
    = (r/2) . (1 + cos(th), sin(th)) 

에있다하고 선분 표현은 다음이 길이가 동일해야 최적이라면 지점으로 원점으로부터의 거리

l = (r/2) . sqrt((1 + cos(th))^2 + (sin(th))^2) 
    = (r/2) . sqrt(2) . sqrt(1 + cos(th)) 

인 반지름 (선분의 중간 점은 원 위에 있어야 함). 일반적으로 약간의 오차가있을 것이고이 점은 반지름보다 약간 작을 것입니다. 이 오류는 그래서 우리는 e의 측면에서 th을 가지고 r

2 . e/r = 2 - sqrt(2) . sqrt(1 + cos(th)) 
sqrt(2) . sqrt(1 + cos(th)) = 2 . (1 - e/r) 
1 + cos(th) = 2 . (1 - e/r)^2 

th = arccos(2 . (1 - e/r)^2 - 1) 

이것은 우리가 특정 오류를 달성하기 위해 우리는 각 지점 사이에있을 수있는 최대 각도를 계산할 수 정리

e = r - l 
    = r . (1 - sqrt(2) . sqrt(1 + cos(th))/2) 

입니다. 예를 들어 반경이 100 픽셀 인 원을 그리는 경우 최대 오차 0.5 픽셀을 원한다고 가정 해 보겠습니다. 계산할 수 있습니다

th = arccos(2 . (1 - 0.5/100)^2 - 1)) 
    = 11.46 degrees 

이것은 ceil(360/11.46) = 32 점에 해당합니다. 따라서 우리가 32 포인트를 사용하여 반지름 100의 원을 그리면 가장 나쁜 픽셀은 절반 이하로 떨어져 모든 픽셀이 정확한 위치에 있음을 의미합니다 (앨리어싱 무시).

이러한 종류의 분석은 타원에 대해서도 수행 할 수 있지만 독자의 연습 문제로 남아있는 모든 훌륭한 수학의 정신에서 나온다.) 유일한 차이점은 최대 오류가 발생한 부분을 결정하는 것입니다.

+1

나에게 맞는 답을 골라 내려면 가능한 값을 추측하기 전에 제약 조건을 충분히 정의해야한다. 가장 좋은 점은 타원의 둘레를 하나의 요소로 사용하는 것입니다. 그러나 귀하의 방법은 문제를 해결하지 못했습니다. 나는 이것을 시도하고 곧 돌아올거야. 감사. :-) – Plumenator

2

또는 시각적 결과만큼 정확한 표현이 필요한만큼 많이 사용하십시오. 그것은 말하기 어렵고, 대부분 당신이 성취하고자하는 것에 달려 있습니다. CAD 프로그램에서 시각적으로 팔각형과 유사한 원이 성가 시게 될 수 있습니다. 반면에, 아이폰에서 게임을 프로그래밍한다면, 자동차의 바퀴가 팔각형처럼 보이는 것이 큰 문제는 아닙니다.

사용할 수있는 전략은 현재보기의 해상도와 관련하여 각 세그먼트의 길이를 계산하는 것입니다. 3 픽셀보다 길면 사용하는 정점의 수를 늘리십시오. 보이는 세그먼트. 이렇게하면 확대 할 때 해상도가 증가하지만 그리지 않을 정점을 설명 할 필요가 없습니다.

+0

의미가 있습니다. 그러나, 나는 매우 단순한 2D 및 단일 해상도의 경우에 대해서만 묻고 있었다. :-D – Plumenator

관련 문제