Domanda

Ho un 2D polilinea chiusa, che è ragionevolmente liscia. I vertici che definiscono il poligono tuttavia non sono equidistanti. A volte due saranno molto vicini, a volte fino a quattro saranno molto vicini tra loro.

mi piacerebbe per lisciare la polilinea, ma un algoritmo di calcolo della media normale tende a ridurre l'area:

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

mie polilinee contengono migliaia di punti e l'angolo tra due segmenti adiacenti è tipicamente meno di 1 grado.

C'è un modo migliore per appianare queste curve, cosa che sarà spazio i vertici in modo più equo, ma non sulle zone troppo?

È stato utile?

Soluzione

Si potrebbe guardare la letteratura "curva di semplificare," come ad esempio l'algoritmo di Douglas-Peucker o questo documento http://www.cs.ait.ac.th/~guha/papers/simpliPoly.pdf .

Questo probabilmente non funzionerà bene se avete bisogno di vertici equidistanti anche quando i segmenti di linea adiacenti che definiscono sono quasi allineati.

Altri suggerimenti

Credo che siete alla ricerca di Chaikin di Algoritmo . C'è una variante di questa idea che rende la curva levigata passare direttamente attraverso (anziché "dentro") i punti di controllo, ma Ho problemi googling momentaneamente.

È inoltre possibile utilizzare le spline interpolare - basta cercare in Wikipedia

Qualcuno ha fatto il porting 2 algoritmi di livellamento per C #, con una licenza CPOL (gratuito), vedi qui:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top