function Path() constructor { lengthTotal = 0; lengths = []; lengthAccs = []; boundary = new BoundingBox(); loop = false; static getBoundary = function() { return boundary; } static getAccuLength = function() { return lengthAccs; } static getLength = function() { return lengthTotal; } static getSegmentCount = function() { return 1; } static getLineCount = function() { return 1; } static getTangentRatio = function(_rat) { return 0; } static getPointDistance = function(_seg, _ind = 0, out = undefined) { return new __vec2(0, 0); } static getPointRatio = function(_rat, _ind = 0, out = undefined) { var pix = frac(_rat) * lengthTotal; return getPointDistance(pix, _ind, out); } } function PathSegment() : Path() constructor { segments = []; static getBoundary = function() { #region if(getSegmentCount() == 0) return new BoundingBox( 0, 0, 0, 0 ); var minx = segments[0].x, maxx = segments[0].x; var miny = segments[0].y, maxy = segments[0].y; for( var i = 0, n = array_length(segments); i < n; i++ ) { var s = segments[i]; minx = min(minx, s.x); maxx = max(maxx, s.x); miny = min(miny, s.y); maxy = max(maxy, s.y); } return new BoundingBox( minx, miny, maxx, maxy ); } #endregion static getSegmentCount = function() { return array_length(segments); } static getLineCount = function() { return 1; } static setSegment = function(segment) { #region self.segments = segment; lengths = []; lengthAccs = []; lengthTotal = 0; var op, np; for( var i = 0, n = array_length(segment); i < n; i++ ) { np = segment[i]; if(i) { lengths[i - 1] = point_distance(op.x, op.y, np.x, np.y); lengthTotal += lengths[i - 1]; lengthAccs[i - 1] = lengthTotal; } op = np; } } #endregion static getPointDistance = function(_dist, _ind = 0, out = undefined) { #region if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; } for( var i = 0; i < array_length(lengths); i++ ) { if(_dist <= lengths[i]) { var rat = _dist / lengths[i]; out.x = lerp(segments[i].x, segments[i + 1].x, rat); out.y = lerp(segments[i].y, segments[i + 1].y, rat); return out; } _dist -= lengths[i]; } out.x = segments[i].x; out.y = segments[i].y; return out; } #endregion static getPointRatio = function(_rat, _ind = 0, out = undefined) { return getPointDistance(frac(_rat) * lengthTotal, _ind, out); } static getTangentRatio = function(_rat) { #region _rat = frac(_rat); var l = _rat * lengthTotal; for( var i = 1; i < array_length(lengths); i += 1 ) { if(l <= lengths[i]) { var rat = l / lengths[i]; return segments[i - 1].directionTo(segments[i]); } l -= lengths[i]; } return 0; } #endregion static draw = function(_x, _y, _s) { #region var ox, oy, nx, ny; for( var i = 0, n = array_length(segments); i < n; i++ ) { nx = _x + segments[i].x * _s; ny = _y + segments[i].y * _s; if(i) draw_line(ox, oy, nx, ny); ox = nx; oy = ny; } } #endregion }