{{ message }}

Instantly share code, notes, and snippets.

w8r/liang-barsky.js

Created Aug 2, 2017
Liang-Barsky line clipping
 /** * Liang-Barsky function by Daniel White * * @link http://www.skytopia.com/project/articles/compsci/clipping.html * * @param {number} x0 * @param {number} y0 * @param {number} x1 * @param {number} y1 * @param {array} bbox * @return {array>|null} */ function liangBarsky (x0, y0, x1, y1, bbox) { var [xmin, xmax, ymin, ymax] = bbox; var t0 = 0, t1 = 1; var dx = x1 - x0, dy = y1 - y0; var p, q, r; for(var edge = 0; edge < 4; edge++) { // Traverse through left, right, bottom, top edges. if (edge === 0) { p = -dx; q = -(xmin - x0); } if (edge === 1) { p = dx; q = (xmax - x0); } if (edge === 2) { p = -dy; q = -(ymin - y0); } if (edge === 3) { p = dy; q = (ymax - y0); } r = q / p; if (p === 0 && q < 0) return null; // Don't draw line at all. (parallel line outside) if(p < 0) { if (r > t1) return null; // Don't draw line at all. else if (r > t0) t0 = r; // Line is clipped! } else if (p > 0) { if(r < t0) return null; // Don't draw line at all. else if (r < t1) t1 = r; // Line is clipped! } } return [ [x0 + t0 * dx, y0 + t0 * dy], [x0 + t1 * dx, y0 + t1 * dy] ]; }

ashleedawg commented Jul 27, 2021

 worked like a charm, thanks!

w8r commented Jul 27, 2021

 @ashleedawg check this one out https://github.com/w8r/liang-barsky