2009-09-23 3 views
3

2D 닫힌 폴리 라인이 있습니다. 그러나 폴리선을 정의하는 정점은 균등하지 않습니다. 때로는 두 사람이 매우 가까울 때가 있습니다. 때로는 네 사람이 매우 가까워지는 경우도 있습니다.최소한의 변형으로 부드럽게 폴리 라인을 만듭니다.

나는 폴리 라인을 부드럽게하고 싶습니다,하지만 일반 평균 알고리즘이 영역 축소하는 경향이있다 :

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 개보다 작은 정도를 .

이 곡선을 부드럽게하는 더 좋은 방법이 있습니까? 너무 많이 영향을주지 않고 정점을보다 균등하게 배치 할 수있는 방법이 있습니까?

+1

"꼭짓점을보다 균등하게 배치 하시겠습니까?" 스무딩 알고리즘은 신호를 증폭하거나 압축합니다. – LJM

+1

내가 아스키에서 이것을 할 수 있는지 보자. 다음과 같은 폴리 라인이 있다고 상상해 보자. (점들은 모서리이다) : ● ─ ● ─ ● ─ ────── 변경하고 싶다. 이것은 다음과 같이됩니다 : ● ────────────────────── ● "vertex spacing"이란 인접한 어떤 정점들 사이의 거리를 더 비슷하게 만들고 싶습니다. –

답변

2

나는 Chaikin's Algorithm을 찾고 있다고 생각합니다. Smoothed Curve가 제어점의 "내부"대신에 직접 통과하게하는이 아이디어의 변종이 있지만, 나는 그 순간에 인터넷 검색을하는 데 어려움을 겪고 있습니다. 다만 위키 피 디아

+0

@Doug,이 알고리즘은 포인트를 추가합니다. 기존 포인트를 대신 재배포해야합니다. –

+0

David,이 경우,이 (또는 다른) 평활화 방법을 사용하여 많은 점을 추가 한 다음 균등하게 간격을두고 제거합니다. 이 경우 스플라인 방법을 사용하면 행운을 빌 수 있으며 삭제하려는 점의 양면에 곡선이 충분히 유사하다는 점을 확인할 수 있습니다. 문제는 대부분의 스무딩 알고리즘이 로컬 (렌더링 효율성 등)이지만 문제에 대한 최적의 솔루션은 반드시 전역 적입니다. –

0

또한 보간 스플라인을 사용할 수 있습니다.

균등 한 간격의 정점이 정의 된 인접 선분이 거의 동일 선상 인 경우에도이 기능은 잘 작동하지 않습니다.

+0

@whatnick, 어떻게 스플라인 보간으로 기존 점의 위치를 ​​다시 잡을 수 있습니까? 기존의 것 사이에 포인트를 추가하는 것은 훌륭한 방법이지만 내 폴리 라인의 토폴로지를 변경하고 싶지는 않습니다. –

+0

진동을 최소화하는 데 사용되는 스플라인 (텐션이라고 함)에 오류 제한이 있습니다. 스플라인은 기본적으로 다항식 세트이며, 점을 통과하는 커브 세트를 피팅합니다. 생성 된 토폴로지가 사용자가 설정 한 인장 한계 내에 있는지 확인하기 위해 스플라인이 장착되면 오류 추정을 수행 할 수 있습니다. – whatnick

관련 문제