Le produit croisé est un classique.
Si vous avez des millions de calculs de ce type à faire, essayez la version optimisée suivante qui nécessite moitié moins de multiplications :
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;
J'utilise l'indice de tableau pour plus de clarté. Il est plus efficace d'utiliser des pointeurs. Bien que les bons compilateurs le fassent pour vous.
On suppose que le polygone est "fermé", ce qui signifie que vous copiez le premier point comme point avec l'indice N. On suppose également que le polygone a un nombre pair de points. Ajoutez une copie supplémentaire du premier point si N n'est pas pair.
L'algorithme est obtenu en déroulant et en combinant deux itérations successives de l'algorithme classique du produit en croix.
Je ne suis pas sûr de la comparaison entre les deux algorithmes en ce qui concerne la précision numérique. Mon impression est que l'algorithme ci-dessus est meilleur que l'algorithme classique car la multiplication tend à restaurer la perte de précision de la soustraction. Lorsque l'on est contraint d'utiliser des flottants, comme dans le cas du GPU, cela peut faire une différence significative.
EDIT : "Aire des triangles et polygones 2D & 3D" décrit une méthode encore plus efficace
// "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;