Pergunta

Eu tenho uma polilinha fechada 2D, que é razoavelmente suave. Os vértices que definem o polígono, contudo, não são espaçados de forma igual. Às vezes, dois serão muito perto, às vezes até quatro serão muito próximos entre si.

Eu gostaria de alisar o polyline, mas um algoritmo de cálculo da média normal tende a diminuir a área:

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);
}

My poligonais conter milhares de pontos e do gulo entre dois segmentos adjacentes é tipicamente inferior a 1 grau.

Existe uma maneira melhor para suavizar essas curvas, algo que o espaço vontade os vértices mais igualmente, sem afetar a área muito?

Foi útil?

Solução

Você pode olhar para a literatura "curva Simplicação", tais como o algoritmo de Douglas-Peucker ou este papel http://www.cs.ait.ac.th/~guha/papers/simpliPoly.pdf .

Isso provavelmente não vai funcionar bem se você precisa uniformemente espaçados vértices mesmo quando os segmentos de linha adjacentes que definem são quase collinear.

Outras dicas

Eu acho que você está procurando Algoritmo de Chaikin . Existe uma variante desta ideia que faz a passagem curva alisada diretamente através (em vez de "dentro" de) os pontos de controle, mas eu estou tendo problemas googling-lo no momento.

Você também pode usar as estrias para interpolate - basta procurar no wikipedia

Alguém tem portados 2 algoritmos de suavização para C #, com uma licença CPOL (gratuito), veja aqui:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top