2009-08-03 4 views
5

저는 실제 솔루션없이 지난 2 ~ 3 일 동안 경로 렌더링을 둘러 봤습니다.주어진 데이터 점 집합에 부드러운 경로를 렌더링하는 방법은 무엇입니까?

경로 렌더링이란 주어진 데이터 세트 포인트 사이의 일정한 간격으로 고정 길이의 점선 (또는 회전 된 쿼드)을 그리는 x, y 데이터 포인트 세트 (다양한 거리에서)를 의미합니다. 부드러운 경로를 만듭니다.

iPhone 용 비행 컨트롤이있는 경우 해당 게임의 경로 렌더링과 비슷한 효과를 내기 위해 노력하고 있습니다.

여기 내 문제가 있습니다. 그래픽의 너비 + 갭이 2 개의 데이터 세트 포인트 사이의 거리에 정확히 맞지 않으면 오버랩 또는 언더 랩을 남깁니다. 이것에 대한 유일한 해결책은 다음 중 하나입니다

1) 다음 데이터 세트 포인트의 끝점이되도록 오버랩/언더 랩 포인트를 가져 와서 거기에서 다음 지점으로 그립니다.

2) 항상 최종 종점 아래로 그려야하고 다음 데이터 지점부터 새로 시작하십시오.

이러한 솔루션 중 어느 것도 이상적이며 두 가지 모두 문제가 있습니다.

누구에게 더 좋은 해결책이 있습니까?

도움을 주시면 감사하겠습니다. http://www.firemint.com/flightcontrol/screenshots-peaceful.html

굵은 점선 :

다음 화면

내가 만들려고 해요 무엇을 보여줍니다.

업데이트 :

안녕하세요, I (4 제어점 통해) 차 곡선을 산출 곡선을 통해 렌더링하려고. 그러나 문제는 보간 중 하나입니다. 0과 1이 주어지면 2 점을 밟을 수 있습니다. 그러나 전체 경로 (여러 제어점)를 단계별로 실행하고 싶습니다. 문제는 일부 제어점이 서로 다른 거리로 떨어져서 일정한 스텝 증가 (예 : 0.2)로 단계적으로 이동하면 불규칙한 결과가 발생한다는 것입니다. 나는 전체 경로를 정확히 밟아서 전체 커브의 길이를 계산할 필요가 있음을 깨달았습니다. 어떻게해야합니까? ... 아니면 다른 방법이 있습니까?

건배 리치

+0

이 주제에 대한 해결책을 찾았습니까? –

답변

0

가 완전히 고정 된 크기의 쿼드로 제한됩니다 ? 이상적인 솔루션은 마지막 쿼드를 올바른 크기로 자르는 것입니다.

제한된 경우 몇 가지 작업을 수행 할 수 있습니다. 점선을 그리는 경우 끝점에서 부분 쿼드로 끝나지 않도록 대시의 거리를 변경할 수 있습니다. 거리가 세그먼트의 길이에 따라 조정되므로 시각적으로 혼란 스러울 수 있습니다.

편집 :

아, 그림이 도움이됩니다. 아이폰을 사용하고 있기 때문에 일련의 점들로부터 드로잉 선을 만들면 수용 할 수있는 커브를 얻을 수 있다고 생각합니다. 이것이 스플라인/곡선 프리미티브를 사용하는 경우에 아마도 과잉입니다. 아마도 마지막 데이터 포인트에서 주어진 거리 인 모든 데이터 포인트에 사각형을 그려서 드로잉 선에 접근 할 것입니다.

알고리즘은 것 같은 뭔가 : 마지막 점에서 적어도 X 거리에있어 때까지

  1. 가 포인트 목록 트래버스 첫 번째 데이터 점에 쿼드 (적절하게 회전)
  2. 을 그립니다
  3. 현재 지점과 마지막 방문 지점 간을 유치하여 다음 쿼드를 배치 할 정확한 중심을 찾습니다.
  4. 는 지난 쿼드 일부 지점이있는 경우 (이 그것을 절단보다 더 나은 시각을 줄 것이다) 정상으로 그립니다 2
  5. 단계 (적절하게 회전) 쿼드
  6. 이동을 그립니다.

재미를 들어, 두 점 사이의 거리보다 작은 약간의 거리 D에 의해 두 지점 텍스쳐간에 도약한다 (이것은 아마도 2D의 경우는 더 간단하지만 나는 일반적으로 일을 좋아하는 일) :

vector v = point2 - point1; 
normalize(v); 
v *= D; 
finalPoint = point1 + v; 
+0

나는 현재 위치에서 주어진 거리만큼의 데이터 포인트 만 받아들이므로 포인트의 정렬은 최소 거리를 가질 것이다. 회전 된 그래픽과 같은 거리입니다. 그러나 사용자가 손가락을 빠르게 움직이면 점 사이의 거리가 커집니다 (따라서 보간법이 적용됩니다). Lerping 부분을 조금 더 자세히 설명해 주시겠습니까?이 작업은 현재 내가하고있는 것과 비슷하게 들릴 수 있습니다. 스크린 샷과 같이 부드러운 경로를 생성하지는 않습니다. – Rich

+0

설명 된 방법은 데이터 포인트가 대시 사이의 거리의 2 배 이상 떨어져 있지 않은 경우에만 적합합니다. 데이터 포인트가 그 이상인 경우 커브 피팅 방법을 조사해야합니다 (이 같은 문제에 대한 표준 커브 피팅은 Catmull-rom이됩니다). 커브가 평평 해지기 시작합니다. –

+0

보간과 관련하여 자주 데이터 포인트가 쿼드를 그리려는 위치의 꼭대기에 있지 않으므로 데이터 포인트 중 두 개 사이 어딘가에 가야합니다. 어느 쪽이 좋을지 알고있을 때, 선형 보간법을 적용 할 수 있습니다 (선이 어느 정도 떨어져야하는지에 따라 보간 상수를 계산할 때 두 점 사이의 선 방정식을 풀거나 더 멀리있는 경우) 곡선 근사 보간법을 적용합니다 (앞서 언급했듯이). –

1

Bezier curves 또는 hermite curves을보고 싶을 수 있습니다. 계산하기가 어렵지 않고 멋진 부드러운 커브를 얻을 수 있습니다.

3

부드러운 경로를 그리는 데 사용되는 "CGPathAddQuadCurveToPoint"라는 CoreGraphics 함수가 있습니다. An example on how to use it is on GitHub.

+0

고마워, 나는 집에 갈 때 그걸 줄거야. 말해, 오픈 GLES에서 할 수있는 일이 무엇입니까? CoreGraphics의 많은 것들이 Open GLES에서 작동하지 않는다는 것을 알고 있습니다. – Rich

+0

@ 어떤 CoreGraphics 제품도 OpenGL과 통합 될 수 있도록 같은 정도로 OpenGL과 통합 될 수 있습니다. 나는이 문제에 대한 경험이 없다. =) –

+0

나는 오픈 GL 화면의 핵심 그래픽 물건을 렌더링 할 수 있다고 생각하지 않았다 ??? – Rich