Como calcular o Centroid

Estou trabalhando com formas geoespaciais e analisando o algoritmo centróide aqui,

http: //en.wikipedia.org/wiki/Centroid#Centroid_of_polygo

Eu implementei o código em C # assim (que é apenas isso adaptado),

Encontrando o centróide de um polígon

class Program
{
    static void Main(string[] args)
    {
        List<Point> vertices = new List<Point>();

        vertices.Add(new Point() { X = 1, Y = 1 });
        vertices.Add(new Point() { X = 1, Y = 10 });
        vertices.Add(new Point() { X = 2, Y = 10 });
        vertices.Add(new Point() { X = 2, Y = 2 });
        vertices.Add(new Point() { X = 10, Y = 2 });
        vertices.Add(new Point() { X = 10, Y = 1 });
        vertices.Add(new Point() { X = 1, Y = 1 });

        Point centroid = Compute2DPolygonCentroid(vertices);
    }

    static Point Compute2DPolygonCentroid(List<Point> vertices)
    {
        Point centroid = new Point() { X = 0.0, Y = 0.0 };
        double signedArea = 0.0;
        double x0 = 0.0; // Current vertex X
        double y0 = 0.0; // Current vertex Y
        double x1 = 0.0; // Next vertex X
        double y1 = 0.0; // Next vertex Y
        double a = 0.0;  // Partial signed area

        // For all vertices except last
        int i=0;
        for (i = 0; i < vertices.Count - 1; ++i)
        {
            x0 = vertices[i].X;
            y0 = vertices[i].Y;
            x1 = vertices[i+1].X;
            y1 = vertices[i+1].Y;
            a = x0*y1 - x1*y0;
            signedArea += a;
            centroid.X += (x0 + x1)*a;
            centroid.Y += (y0 + y1)*a;
        }

        // Do last vertex
        x0 = vertices[i].X;
        y0 = vertices[i].Y;
        x1 = vertices[0].X;
        y1 = vertices[0].Y;
        a = x0*y1 - x1*y0;
        signedArea += a;
        centroid.X += (x0 + x1)*a;
        centroid.Y += (y0 + y1)*a;

        signedArea *= 0.5;
        centroid.X /= (6*signedArea);
        centroid.Y /= (6*signedArea);

        return centroid;
    }
}

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
}

O problema é que esse algoritmo quando eu tenho essa forma (que é uma forma L),

(1,1) (1,10) (2,10) (2,2) (10,2) (10,1) (1,1)

Dá o resultado (3,62, 3,62). O que é bom, exceto que o ponto está fora da forma. Existe outro algoritmo que leva isso em consideração?

Basicamente, uma pessoa vai desenhar uma forma em um mapa. Essa forma pode abranger várias estradas (pode ser uma forma de L) e quero descobrir o centro da forma. Isso é para que eu possa descobrir o nome da estrada nesse ponto. Não faz sentido para mim estar fora da forma se eles tiverem desenhado uma forma longa e fina de

questionAnswers(8)

yourAnswerToTheQuestion