Commit c88ef297 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add the vec2_{mean,sort_cw} helper methods

parent 5ff5a824
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -59,6 +59,36 @@ vec2 vec2_from_deg(double deg) {
  return {cos(a), sin(a)};
}

vec2 vec2_mean(const vec2* v, size_t v_len) {
  vec2 m;

  for (size_t i = 0; i < v_len; ++i) {
    m = vec2_add(m, v[i]);
  }

  return vec2_mul(m, 1.0 / v_len);
}

void vec2_sort_cw(vec2* v, size_t v_len) {
  auto m = vec2_mean(v, v_len);

  std::sort(v, v + v_len, [&m] (const auto& a, const auto& b) {
    auto da = vec2_sub(a, m);
    auto db = vec2_sub(b, m);
    return atan2(db.y, db.x) < atan2(da.y, da.x);
  });
}

void vec2_sort_ccw(vec2* v, size_t v_len) {
  auto m = vec2_mean(v, v_len);

  std::sort(v, v + v_len, [&m] (const auto& a, const auto& b) {
    auto da = vec2_sub(a, m);
    auto db = vec2_sub(b, m);
    return atan2(da.y, da.x) < atan2(db.y, db.x);
  });
}

std::ostream& operator <<(std::ostream& os, const Point& p) {
  os << "Point(";
  os << p.x;
+15 −0
Original line number Diff line number Diff line
@@ -45,6 +45,21 @@ vec2 vec2_mul(const vec2& v, double s);
double vec2_dot(const vec2& a, const vec2& b);
vec2 vec2_from_deg(double deg);

/**
 * Find the mean value of a list of vectors
 */
vec2 vec2_mean(const vec2* v, size_t v_len);

/**
 * Sort an array of vec2 objects in clockwise order
 */
void vec2_sort_cw(vec2* v, size_t v_len);

/**
 * Sort an array of vec2 objects in counter-clockwise order
 */
void vec2_sort_ccw(vec2* v, size_t v_len);

std::ostream& operator <<(std::ostream& os, const Point& c);
std::ostream& operator <<(std::ostream& os, const Rectangle& c);