aocc23

Advent of Code 2023
git clone git://www.tkruger.se/aocc23.git
Log | Files | Refs | README

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 }