// Returns true iff segments ab and cd intersect, properly or improperly. static bool intersect(const int* a, const int* b, const int* c, const int* d) { if (intersectProp(a, b, c, d)) return true; else if (between(a, b, c) || between(a, b, d) || between(c, d, a) || between(c, d, b)) return true; else return false; }
static bool diagonalieLoose(int i, int j, int n, const int* verts, int* indices) { const int* d0 = &verts[(indices[i] & 0x0fffffff) * 4]; const int* d1 = &verts[(indices[j] & 0x0fffffff) * 4]; // For each edge (k,k+1) of P for (int k = 0; k < n; k++) { int k1 = next(k, n); // Skip edges incident to i or j if (!((k == i) || (k1 == i) || (k == j) || (k1 == j))) { const int* p0 = &verts[(indices[k] & 0x0fffffff) * 4]; const int* p1 = &verts[(indices[k1] & 0x0fffffff) * 4]; if (vequal(d0, p0) || vequal(d1, p0) || vequal(d0, p1) || vequal(d1, p1)) continue; if (intersectProp(d0, d1, p0, p1)) return false; } } return true; }