mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2024-12-26 15:06:22 +01:00
119 lines
No EOL
3 KiB
Text
119 lines
No EOL
3 KiB
Text
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
|
|
} |