문제

2D 폐쇄 폴리 라인이있어 합리적으로 매끄 럽습니다. 그러나 폴리 라인을 정의하는 정점은 동일하게 간격을 두지 않습니다. 때로는 두 개가 매우 가까워지고 때로는 4 명 정도가 함께 매우 가까워 질 때까지는 두 개가 매우 가깝습니다.

폴리 라인을 부드럽게하고 싶지만 정기적 인 평균화 알고리즘은 해당 영역을 축소하는 경향이 있습니다.

for (int i = 0; i < (V.Length-1); i++)
{
   PointF prev = V[i-1]; //I have code that wraps the index around.
   PointF next = V[i+1];       
   PointF pt = V[i];

   float ave_x = one_third * (prev.X + next.X + pt.X);
   float ave_y = one_third * (prev.Y + next.Y + pt.Y);

   smooth_polyline[i] = new PointF(ave_x, ave_y);
}

내 폴리 라인에는 수천 개의 점이 포함되어 있으며 인접한 세그먼트 사이의 각도는 일반적으로 1도 미만입니다.

이 곡선을 부드럽게하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

Douglas-Peucker 알고리즘 또는이 논문과 같은 "곡선 단순화"문헌을 볼 수 있습니다. http://www.cs.ait.ac.th/~guha/papers/simplipoly.pdf.

그들이 정의하는 인접한 라인 세그먼트가 거의 공동선 일 때에도 균등하게 간격을 두는 정점이 필요하다면 이것은 잘 작동하지 않을 것입니다.

다른 팁

나는 당신이 찾고 있다고 생각합니다 Chaikin의 알고리즘. 이 아이디어의 변형은 스무딩 곡선을 제어점의 "내부"대신 직접 통과하게 만드는 변형이 있지만 현재는 인터넷 검색에 어려움이 있습니다.

Splines를 사용하여 보간 할 수도 있습니다. Wikipedia에서 검색하십시오.

누군가 CPOL (무료) 라이센스를 사용하여 2 개의 스무딩 알고리즘을 C#에 포팅했습니다. 여기를 참조하십시오.

https://github.com/robinck/smooth-polyline

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