360 개의 정점을 맹목적으로 사용해야합니까? 720은 더 잘 작동하는 것처럼 보이지만 어디에서 멈출 수 있습니까?OpenGL을 사용하여 타원이나 원을 그릴 때 몇 개의 정점을 사용해야합니까?
답변
허용되는 오류의 양 (예 : 시각적 품질)과 원 (타원)의 크기에 따라 다릅니다. 더 큰 원은 동일한 품질을 얻으려면 더 많은 포인트가 필요합니다. 약간의 수학으로 주어진 오류에 필요한 포인트 수를 정확히 계산할 수 있습니다.
일련의 선분으로 표시된 원을 생각하면 선분의 끝점은 정확히 원 (픽셀 격자 무시)에 놓입니다. 실제 원과 선 세그먼트 표현 간의 가장 큰 편차는 각 선분의 중심에서 발생하며이 오류는 모든 선분에 대해 동일합니다. 시계 반대 방향으로가는 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의 원을 그리면 가장 나쁜 픽셀은 절반 이하로 떨어져 모든 픽셀이 정확한 위치에 있음을 의미합니다 (앨리어싱 무시).
이러한 종류의 분석은 타원에 대해서도 수행 할 수 있지만 독자의 연습 문제로 남아있는 모든 훌륭한 수학의 정신에서 나온다.) 유일한 차이점은 최대 오류가 발생한 부분을 결정하는 것입니다.
또는 시각적 결과만큼 정확한 표현이 필요한만큼 많이 사용하십시오. 그것은 말하기 어렵고, 대부분 당신이 성취하고자하는 것에 달려 있습니다. CAD 프로그램에서 시각적으로 팔각형과 유사한 원이 성가 시게 될 수 있습니다. 반면에, 아이폰에서 게임을 프로그래밍한다면, 자동차의 바퀴가 팔각형처럼 보이는 것이 큰 문제는 아닙니다.
사용할 수있는 전략은 현재보기의 해상도와 관련하여 각 세그먼트의 길이를 계산하는 것입니다. 3 픽셀보다 길면 사용하는 정점의 수를 늘리십시오. 보이는 세그먼트. 이렇게하면 확대 할 때 해상도가 증가하지만 그리지 않을 정점을 설명 할 필요가 없습니다.
의미가 있습니다. 그러나, 나는 매우 단순한 2D 및 단일 해상도의 경우에 대해서만 묻고 있었다. :-D – Plumenator
- 1. OpenGL을 사용하여 안드로이드에 서클을 그릴 때의 문제
- 2. OpenGL을 사용하여 원을 하나의 정점 배열로 채운다.
- 3. iPhone에서 몇 줄과 원을 그릴 때 CGContextStrokePath 성능이 좋지 않습니다.
- 4. 자유롭게 보이는 타원이나 원을 그리는 방법?
- 5. TRIANGLE_FAN 원을 그릴 때 텍스처가있는 사각형을 그리지 마십시오.
- 6. 어떻게 평행선을 그려 그 중심에 채워진 원을 그릴 수 있습니까?
- 7. 2D 그래픽 용 OpenGL을 사용해야합니까?
- 8. 코어 그래픽을 사용하여 원을 그릴 때마다 내보기가 지워지지 않게하려면 어떻게합니까?
- 9. 2D Java sim 게임에서 OpenGL을 사용해야합니까?
- 10. R을 사용하여 R로 점을 그릴 때
- 11. 버전 관리하에 스크립트를 유지 관리하는 데 몇 개의 저장소를 사용해야합니까?
- 12. OpenGL을
- 13. LINQ를 사용할 때 3 개의 레이어를 사용해야합니까?
- 14. 정점을 사용하여 salesforce에서 다중 선택 조회 만들기
- 15. 몇 개의 코어가 있습니까?
- 16. openGl을 사용하여 스크롤
- 17. jQuery/HTML5를 사용하여 원을 애니메이션화하십시오.
- 18. OpenGL을 사용하여 iPad에서 그림 그리기
- 19. 이미지를 투명한 비트 맵으로 그릴 때 검정색 경계선을 그릴 때
- 20. iPhone 화면을 그릴 때 패턴 인식하기
- 21. OpenGL을
- 22. 섀도우 볼륨을 만들 때 GLSL의 뒤쪽 정점을 변환하는 방법
- 23. OpenGL을
- 24. C- 문자열 배열에 대한 포인터를 선언 할 때 몇 개의 별표를 사용해야합니까?
- 25. 다른 원을 중심으로 원을 회전
- 26. 여러 개의 창이있는 Haskell에서 OpenGL을 사용하는 방법?
- 27. 타원을 그릴 때 거리를 늘립니다.
- 28. OpenGL을 사용하여 비트 맵 글꼴 측정 (Windows)
- 29. 몇 개의 스레드를 만들까요?
- 30. Android에서 OpenGL을 사용하여 전체 화면 단일 프레임 애니메이션을 그릴 수 있습니까?
나에게 맞는 답을 골라 내려면 가능한 값을 추측하기 전에 제약 조건을 충분히 정의해야한다. 가장 좋은 점은 타원의 둘레를 하나의 요소로 사용하는 것입니다. 그러나 귀하의 방법은 문제를 해결하지 못했습니다. 나는 이것을 시도하고 곧 돌아올거야. 감사. :-) – Plumenator