Перекрестный продукт является классическим.
Если у вас есть миллион таких вычислений, попробуйте следующую оптимизированную версию, для которой требуется меньше половины умножений:
area = 0;
for( i = 0; i < N; i += 2 )
area += x[i+1]*(y[i+2]-y[i]) + y[i+1]*(x[i]-x[i+2]);
area /= 2;
Я использую индекс массива для ясности. Эффективно использовать указатели. Хотя хорошие компиляторы сделают это за вас.
Полигон считается «закрытым», что означает, что вы копируете первую точку как точку с индексом N. Также предполагается, что многоугольник имеет четное число точек. Добавим дополнительную копию первой точки, если N не равно.
Алгоритм получается путем разворачивания и объединения двух последовательных итераций классического алгоритма кросс-произведения.
Я не уверен, как сравниваются два алгоритма относительно числовой точности. Мое впечатление, что вышеупомянутый алгоритм лучше классического, потому что умножение стремится восстановить потерю точности вычитания. При ограничении использования float, как и в случае с графическим процессором, это может иметь существенное значение.
EDIT: «Площадь треугольников и многоугольников 2D и 3D» описывает еще более эффективный метод
// "close" polygon
x[N] = x[0];
x[N+1] = x[1];
y[N] = y[0];
y[N+1] = y[1];
// compute area
area = 0;
for( size_t i = 1; i <= N; ++i )
area += x[i]*( y[i+1] - y[i-1] );
area /= 2;
Используйте директиву WSGIDaemonProcess
, чтобы поместить приложение в режим демона и указать количество процессов и потоков демона.