/* on factor; off period; procedure winding(x1, y1, x2, y2, x3, y3); BEGIN scalar dx1, dy1, dx2, dy2, det; dx1 := x1-x2; dy1 := y1-y2; dx2 := x3-x2; dy2 := y3-y2; det := dx1*dy2 - dy1*dx2; return det; END; w1 := winding(ax, ay, bx, by, cx, cy); w2 := winding(ax, ay, bx, by, dx, dy); w3 := winding(cx, cy, dx, dy, ax, ay); w4 := winding(cx, cy, dx, dy, bx, by); comment: dxab1 := ax-bx; comment: sub(dxab1=dxab, w1); let ax-bx = dxab; let ay-by = dyab; let bx-cx = dxbc; let by-cy = dybc; let cx-dx = dxcd; let cy-dy = dycd; let dx-ax = dxda; let dy-ay = dyda; */ static __forceinline int isect_line(int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy) { int w1 = winding(ax, ay, bx, by, cx, cy); int w2 = winding(ax, ay, bx, by, dx, dy); if (w1 == w2) return 0; int w3 = winding(cx, cy, dx, dy, ax, ay); int w4 = winding(cx, cy, dx, dy, bx, by); if (w3 == w4) return 0; return 1; }
double winding_abs(bool do_trim=1) const { return winding(do_trim, true); }