Ordenar vértices de celdas voronoi para calcular el polígono

Actualmente estoy tratando de obtener las celdas recortadas de una intersección Polygon-Voronoi.

Esto es lo que tengo hasta ahora:

Tengo un polígono y calculé algunos puntos para calcular un diagrama de voronoi y las líneas rojas en la figura a continuación son los bordes de voronoi. Luego usé un algoritmo para obtener los puntos de esquina de cada celda y ahora necesito obtener las esquinas en la dirección correcta (en el sentido de las agujas del reloj) para generar el polígono de la celda.

Esquinas encontradas para una celda

Primero estaba usando este método:

private List<Vector> sortClockwise(List<Vector> points)
    {
        points = points.OrderBy(x => Math.Atan2(x.X, x.Y)).ToList();
        return points;
    }

pero en algunos polígonos cóncavos especiales esto no funciona y el orden correcto se confunde.

¿Alguien tiene una sugerencia o sugerencia de cómo esto podría hacerse de la manera más simple? Tenga en cuenta que los puntos del polígono ya están en el orden correcto y que las esquinas voronoi están mezcladas y deben ordenarse según los puntos del polígono.

Mi idea:

Encuentra el primer punto poligonal en las esquinas de las celdasve a lo largo de la dirección del polígono y mira si el punto de vértices voronoi está en esa línea.en caso afirmativo: obtenga el punto final del borde voronoi encontrado y busque los bordes voronoi compartidos.Si se encuentran bordes compartidos, tome siempre el más correctohacer hasta llegar al primer punto

¿Es esa la única forma en que podría hacer eso?

EDITAR - ACTUALIZAR

Bien, tengo algún tipo de media respuesta ahora.

Como dije, tengo todos los vértices que pertenecen a una de las celdas del voronoi pero el orden todavía está desordenado, así que pensé que podría ordenarlos por ángulo desde el centroide de la siguiente manera:

private List<Vector> sortClockwiseBySentroid(List<Vector> points, Vector center)
    {
        points = points.OrderBy(x => Math.Atan2(x.X - center.X, x.Y - center.Y)).ToList();
        return points;
    }

Pero esto no siempre funciona. Aquí están los ejemplos cuando funciona y cuando no. El problema es que, en los bordes cóncavos, el ángulo desde el centro a la esquina es a veces más pequeño que el que realmente necesito. ¿Alguna sugerencia sobre cómo solucionar esto?

Aquí está funcionando

Aquí no está funcionando ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta