64 void (*fn)(
void *,
const Ppoint_t *),
void *vc) {
67 for (
size_t i = 0; i < pointn; i++) {
68 const size_t ip1 = (i + 1) % pointn;
69 const size_t ip2 = (i + 2) % pointn;
71 fn(vc, (
Ppoint_t[]){*pointp[i], *pointp[ip1], *pointp[ip2]});
73 for (i = 0; i < pointn; i++)
75 pointp[j++] = pointp[i];
81 fn(vc, (
Ppoint_t[]){*pointp[0], *pointp[1], *pointp[2]});
119 const size_t ip1 = (i + 1) % pointn;
120 const size_t ip2 = (i + 2) % pointn;
121 const size_t im1 = (i + pointn - 1) % pointn;
123 if (
ccw(indexer(pointp, im1), indexer(pointp, i), indexer(pointp, ip1)) ==
125 res =
ccw(indexer(pointp, i), indexer(pointp, ip2), indexer(pointp, im1)) ==
127 ccw(indexer(pointp, ip2), indexer(pointp, i), indexer(pointp, ip1)) ==
131 res =
ccw(indexer(pointp, i), indexer(pointp, ip2), indexer(pointp, ip1)) ==
138 for (
size_t j = 0; j < pointn; j++) {
139 const size_t jp1 = (j + 1) % pointn;
140 if (!(j == i || jp1 == i || j == ip2 || jp1 == ip2))
141 if (
intersects(indexer(pointp, i), indexer(pointp, ip2),
142 indexer(pointp, j), indexer(pointp, jp1))) {
int ccw(Ppoint_t p1, Ppoint_t p2, Ppoint_t p3)
are the given points counter-clockwise, clockwise, or co-linear?
bool isdiagonal(size_t i, void *pointp, size_t pointn, indexer_t indexer)
is (i, i + 2) a diagonal?
static int triangulate(Ppoint_t **pointp, size_t pointn, void(*fn)(void *, const Ppoint_t *), void *vc)
static bool intersects(Ppoint_t pa, Ppoint_t pb, Ppoint_t pc, Ppoint_t pd)
line to line intersection