문제

2D 포인트 목록으로 구성된 경로가 있습니다. 나는 이것을 지정된 두께 (및 다른 것들)로 텍스처 선을 렌더링하기 위해 삼각형 스트립으로 바꾸고 싶습니다. 따라서 본질적으로 2D 포인트 목록은 렌더링 된 경우 라인을 렌더링하는 다각형의 개요를 지정하는 정점 목록이되어야합니다. 문제는 코너 결합, 마이터, 캡 등을 처리하는 것입니다. 결과 다각형은 오버 드로우, 깨끗한 조인 등의 의미에서 "완벽한"이어야합니다.

거기 아무도 없나요 단순한 주변의 리소스는 알고리즘 통찰력, 코드 또는이를 효율적으로 수행하는 것에 대한 더 많은 정보를 제공 할 수 있습니까?

나는 곡선, 아크, 대시 및 모든 종소리와 휘파람이있는 완전한 깃발 2D 벡터 라이브러리 (카이로, 안티 그레인, OpenVG 등)를 절대 원하지 않습니다. 나는 OpenVG 구현을 위해 여러 소스 트리를 파고 들고 통찰력을 찾기 위해 다른 것들을 파고 들었습니다. 그러나 그것은 모두 끔찍한 일입니다.

나는 분명히 그것을 직접 코딩 할 의향이 있지만 모든 종류의 조인 문제를 만드는 많은 퇴화 사례 (작은 세그먼트 + 두꺼운 너비 + 날카로운 모서리)가 많이 있습니다. 약간의 도움조차하면 그들 모두를 다루려고 시간을 절약 할 수 있습니다.

편집 : 다음은 단순히 정점에서 vertex로 가면 추악한 경우를 유발하는 퇴화 사례 중 하나의 예입니다. 빨간색은 원래 경로입니다. 주황색 블록은 지정된 너비로 그려지고 각 세그먼트를 중심으로하는 사각형입니다.

도움이 되었습니까?

해결책

오 글쎄 - 나는 그 문제를 직접 해결하려고 노력했다. 제로 오버 드로우 문제를 해결하려는 솔루션에 2 개월을 낭비했습니다. 이미 알게 된 바와 같이, 당신은 모든 퇴행 된 사례를 다룰 수 없으며 동시에 오버 드랩을 제로 할 수는 없습니다.

그러나 하이브리드 접근법을 사용할 수 있습니다.

조인이 문제없이 간단한 지오메트리로 구성 될 수 있는지 확인하는 루틴을 작성하십시오. 그렇게하려면 결합 신각, 선의 너비 및 결합 된 선 세그먼트의 길이 (폭보다 짧은 선 세그먼트는 피타입니다)를 점검해야합니다. 일부 휴리스틱을 사용하면 모든 사소한 사례를 분류 할 수 있어야합니다.

평균 라인 데이터가 어떻게 보이는지 모르겠지만, 제 경우에는 넓은 라인의 90% 이상이 퇴화 된 경우가 없었습니다.

다른 모든 라인의 경우 :

당신은 아마도 이미 오버 드로우를 견딜 수 있다면 지오메트리를 생성하는 것이 훨씬 쉽다는 것을 이미 알았을 것입니다. 그렇게하고, 다각형 CSG 알고리즘과 Tesselation 알고리즘이 어려운 일을하도록하십시오.

사용 가능한 테셀레이션 패키지의 대부분을 평가했으며 Glu Tesselator로 끝났습니다. 빠르고 강력하며 절대 충돌하지 않았습니다 (대부분의 다른 알고리즘과 달리). 무료였으며 라이센스로 인해 상업 프로그램에 포함시킬 수있었습니다. 테셀레이션의 품질과 속도는 괜찮습니다. Delaunay 삼각 측량 품질을 얻지 못하지만 문제가되지 않는 렌더링을위한 삼각형이 필요하기 때문입니다.

Tesselator API를 싫어하기 때문에 무료 SGI OpenGL 참조 구현에서 Tesselation 코드를 들어 올렸고 전체 프론트 엔드 및 추가 메모리 풀을 다시 작성하여 할당 수를 줄였습니다. 이 작업을 수행하는 데 이틀이 걸렸지 만 (요인 5 성능 향상과 같은) 그만한 가치가있었습니다. 솔루션은 상업적인 OpenVG 구현 BTW :-)에서 끝났습니다.

PC에서 OpenGL로 렌더링하는 경우 Tesselation/CSG-Job을 CPU에서 GPU로 이동하고 스텐실 버퍼 또는 Z- 버퍼 트릭을 사용하여 오버 드로우를 제거 할 수 있습니다. 이는 훨씬 쉽고 CPU 테셀레이션보다 더 빠를 수 있습니다.

다른 팁

내 머리 꼭대기에서 간단한 방법.

각 2D 정점의 각도를 이등분하면 멋진 마이 터 라인이 생성됩니다. 그런 다음 해당 선을 따라 내부 및 바깥쪽으로 이동하면 "두께"(또는 두께를 2로 나눈 값)의 양을 따라 이동하면 이제 내부 및 외부 다각형 포인트가 있습니다. 다음 지점으로 이동하여 동일한 프로세스를 반복하여 새로운 다각형 지점을 구축하십시오. 그런 다음 삼각형을 적용하여 렌더 준비 정점을 얻으십시오.

방금이 놀라운 작품을 발견했습니다.

http://www.codeproject.com/articles/226569/Drawing-polylines-by-tessellation

원하는 것을 정확하게 수행하는 것으로 보이며 라이센스는 상용 응용 프로그램에서도 사용할 수 있습니다. 또한 저자는 자신의 방법을 자세히 설명하기 위해 정말 훌륭한 일을했습니다. 나는 아마도 어떤 시점에서 촬영을 할 것입니다.

결국 손을 더럽 히고 비슷한 문제를 해결하기 위해 작은 리본 저를 써야했습니다.

나에게 문제는 iPhengl에서 OpenGL로보고 있던 유물의 종류가없는 OpenGL에서 지방 라인을 원한다는 것이 었습니다. 다양한 솔루션을 살펴본 후; Bezier Curves 등 - 나는 단지 내 자신을 만드는 것이 가장 쉽다고 결정했습니다. 몇 가지 다른 접근법이 있습니다.

한 가지 방법은 두 세그먼트 사이의 교차 각도를 찾은 다음 교차 선을 따라 표면에서 특정 거리를 따라 이동하여 리본 정점으로 처리하는 것입니다. 나는 그것을 시도했고 그것은 직관적으로 보이지 않았다. 리본 너비는 다릅니다.

또 다른 접근법은 실제로 라인 세그먼트의 표면에 정상을 계산하고 해당 세그먼트의 이상적인 리본 가장자리를 계산하고 리본 세그먼트 사이의 실제 교차 테스트를 수행하는 데 사용하는 것입니다. 날카로운 모서리의 경우 리본 라인 세그먼트 교차로가 너무 멀리 떨어져 있다는 점을 제외하고는 잘 작동했습니다 (세그먼트 간 각도가 180 '에 이르는 경우).

나는 두 가지 접근 방식으로 날카로운 각도 문제를 해결했습니다. Paul Bourke Line 교차로 알고리즘 (내가 최적화되지 않은 방식으로 사용)은 교차로가 세그먼트 내부에 있는지 여부를 탐지하는 것을 제안했습니다. 두 세그먼트 모두 동일하므로 교차로 세그먼트 중 하나를 테스트해야했습니다. 그런 다음 이것을 해결하는 방법을 중재 할 수있었습니다. 두쪽 끝 사이에 가장 좋은 점을 뿌리거나 엔드 캡을 입력함으로써 두 가지 접근 방식이 좋아 보인다 - 엔드 캡 접근은 OpenGL에 대한 다각형 전면/후면 순서를 버릴 수있다.

보다 http://paulbourke.net/geometry/lineline2d/

여기에서 내 소스 코드를 참조하십시오. https://gist.github.com/1474156

매핑 애플리케이션을 완성하고 싶기 때문에 이것에도 관심이 있습니다.코스 모스) 도로 그림. 내가 사용한 하나의 해결 방법은 폴리 라인을 한 번 더 두꺼운 선으로, 한 번 더 얇고 다른 색상으로 두 번 그리는 것입니다. 그러나 이것은 실제로 다각형이 아니라 단지 시뮬레이션을 시뮬레이션하는 빠른 방법 일뿐입니다. 여기에 몇 가지 샘플을 참조하십시오. http://wiki.openstreetmap.org/wiki/kosmos_rendering_help#rendering_options

이것이 당신이 필요한 것인지 확실하지 않습니다.

나는 Tessellation 알고리즘에 도달 할 것이라고 생각합니다. 대부분의 경우 사용되는 경우 대부분의 경우 렌더링을 최적화하기 위해 정점의 수를 줄이는 것이지만, 귀하의 경우 모든 세부 사항을 유지하기 위해 매개 변수화 할 수 있으며 최적화 가능성이 유용 할 수 있습니다.

웹에는 수많은 테셀레이션 알고리즘과 코드가 있습니다. 델파이 조경 렌더러와 함께 사용하기 위해 몇 년 전 DLL에 순수한 C를 마무리했으며 고급 그래픽 코딩 자습서 등의 경우 드문 주제가 아닙니다.

확인하십시오 Delaunay 삼각 측량 도울 수있다.

제 경우에는 오버 드로잉을 감당할 수있었습니다. 나는 방금 폴리 라인의 정점을 중심으로 반경 = 너비/2로 원을 졸로 졸업합니다.

아티팩트는 이런 식으로 마스킹되며 "둥근"모서리와 일부 오버 겨울로 살 수 있다면 구현하기가 매우 쉽습니다.

이미지에서 주황색을 사용하여 라인 세그먼트 주위에 상자를 그리는 것처럼 보입니다. 그렇게하는 것은 확실히 나쁜 오버 드래프를 만들 것입니다. 따라서 가장 먼저해야 할 일은 검은 테두리를 렌더링하지 않고 채우기 색상이 불투명 할 수 있습니다.

GL_LINES Primitive를 사용하여 원하는 작업을 수행 할 수없는 이유는 무엇입니까? 너비, 필터링, 부드러움, 질감을 지정할 수 있습니다. gldrawarrays ()를 사용하여 모든 정점을 렌더링 할 수 있습니다. 나는 이것이 당신이 염두에두고있는 것이 아니라는 것을 알고 있지만, 당신이 2D 드로잉에 초점을 맞추고있을 때, 이것은 더 쉬운 접근 일 수 있습니다. (텍스처 라인 등을 검색하십시오)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top