common.c (635B)
1 #include "common.h" 2 3 static inline int64_t iabs(const int64_t x) { return x >= 0 ? x : -x; } 4 5 int64_t area(const pos_t *cornetto, const size_t n) { 6 size_t i; 7 8 int64_t exterior = 0; 9 for (i = 0; i < n - 1; i++) { 10 exterior += iabs(cornetto[i].x - cornetto[i + 1].x); 11 exterior += iabs(cornetto[i].y - cornetto[i + 1].y); 12 } 13 14 // shoelace formula for interior area 15 int64_t interior = 0; 16 for (i = 0; i < n - 1; i++) 17 interior += (cornetto[i].x * cornetto[i + 1].y) - 18 (cornetto[i + 1].x * cornetto[i].y); 19 20 // compensate error with pick's thm 21 return (iabs(interior) - exterior) / 2 + 1 + exterior; 22 }