Я не знаю, как оптимизировать этот метод (я не делал этого раньше в коде), но математический подход к нему заключается в разделении фигуры на треугольники, площадь которых затем легко вычисляется и суммируется. (Помните: площадь треугольника равна ширине * высоте * 0,5 - вам нужно будет вычислить высоту прямоугольников с неправильными углами.)
Выполнение этих вещей в 3D обычно означает, что на каждом этапе требуется еще один расчет. Например, в 2D расстояние между 2 точками (длина стороны вашей фигуры) вычисляется примерно так (псевдокод, потому что у меня нет VS на этой машине):
double DistanceBetween(Point a, Point b)
{
double dx = a.x - b.x;
double dy = a.y - b.y;
return SquareRoot(dx*dx + dy*dy);
}
В трех измерениях это становится:
double DistanceBetween(Point3d a, Point3d b)
{
double dx = a.x - b.x;
double dy = a.y - b.y;
double dz = a.z - b.z;
return SquareRoot(dx*dx + dy*dy + dz*dz);
}
Разделение фигуры на произвольные треугольники просто включает в себя выбор любых трех смежных вершин за раз, пока вы не дойдете до последних трех.