В этом посте я опубликовал несколько геометрических операций linq-ified:
Как застегнуть один IEnumerable с собой
Вычисление центроида, которое я опубликовал, отличается от того, которое опубликовал @Thomas Levesque. Я получил это из Википедии - Centroid . Он выглядит намного проще, чем тот, который я выложил.
Вот мой алгоритм (он использует SignedArea и Pairwise по ссылке выше):
public static Position Centroid(IEnumerable<Position> pts)
{
double a = SignedArea(pts);
var c = pts.Pairwise((p1, p2) => new
{
x = (p1.X + p2.X) * (p1.X * p2.Y - p2.X * p1.Y),
y = (p1.Y + p2.Y) * (p1.X * p2.Y - p2.X * p1.Y)
})
.Aggregate((t1, t2) => new
{
x = t1.x + t2.x,
y = t1.y + t2.y
});
return new Position(1.0 / (a * 6.0) * c.x, 1.0 / (a * 6.0) * c.y);
}
По этой ссылке есть и другие алгоритмы, которые могут оказаться полезными.