diff options
author | Ulrich-Matthias Schäfer <ulima.ums@googlemail.com> | 2018-11-06 13:48:05 +0100 |
---|---|---|
committer | Ulrich-Matthias Schäfer <ulima.ums@googlemail.com> | 2018-11-06 13:48:05 +0100 |
commit | a0b13ebcacfd74b9f521110c7225bb404325bcd3 (patch) | |
tree | a07c5cc422645e31d7dfef81ce4e54f03f0945f6 /src/types/PointArray.js | |
parent | 9f2696e8a2cf7e4eebc1cc7e31027fe2070094fa (diff) | |
download | svg.js-a0b13ebcacfd74b9f521110c7225bb404325bcd3.tar.gz svg.js-a0b13ebcacfd74b9f521110c7225bb404325bcd3.zip |
reordered modules, add es6 build
Diffstat (limited to 'src/types/PointArray.js')
-rw-r--r-- | src/types/PointArray.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/types/PointArray.js b/src/types/PointArray.js new file mode 100644 index 0000000..b246b2f --- /dev/null +++ b/src/types/PointArray.js @@ -0,0 +1,120 @@ +import { delimiter } from '../modules/core/regex.js' +import { extend } from '../utils/adopter.js' +import { subClassArray } from './ArrayPolyfill.js' +import SVGArray from './SVGArray.js' + +const PointArray = subClassArray('PointArray', SVGArray) + +export default PointArray + +extend(PointArray, { + // Convert array to string + toString () { + // convert to a poly point string + for (var i = 0, il = this.length, array = []; i < il; i++) { + array.push(this[i].join(',')) + } + + return array.join(' ') + }, + + // Convert array to line object + toLine () { + return { + x1: this[0][0], + y1: this[0][1], + x2: this[1][0], + y2: this[1][1] + } + }, + + // Get morphed array at given position + at (pos) { + // make sure a destination is defined + if (!this.destination) return this + + // generate morphed point string + for (var i = 0, il = this.length, array = []; i < il; i++) { + array.push([ + this[i][0] + (this.destination[i][0] - this[i][0]) * pos, + this[i][1] + (this.destination[i][1] - this[i][1]) * pos + ]) + } + + return new PointArray(array) + }, + + // Parse point string and flat array + parse (array = [[0, 0]]) { + var points = [] + + // if it is an array + if (array instanceof Array) { + // and it is not flat, there is no need to parse it + if (array[0] instanceof Array) { + return array + } + } else { // Else, it is considered as a string + // parse points + array = array.trim().split(delimiter).map(parseFloat) + } + + // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints + // Odd number of coordinates is an error. In such cases, drop the last odd coordinate. + if (array.length % 2 !== 0) array.pop() + + // wrap points in two-tuples and parse points as floats + for (var i = 0, len = array.length; i < len; i = i + 2) { + points.push([ array[i], array[i + 1] ]) + } + + return points + }, + + // Move point string + move (x, y) { + var box = this.bbox() + + // get relative offset + x -= box.x + y -= box.y + + // move every point + if (!isNaN(x) && !isNaN(y)) { + for (var i = this.length - 1; i >= 0; i--) { + this[i] = [this[i][0] + x, this[i][1] + y] + } + } + + return this + }, + + // Resize poly string + size (width, height) { + var i + var box = this.bbox() + + // recalculate position of all points according to new size + for (i = this.length - 1; i >= 0; i--) { + if (box.width) this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x + if (box.height) this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y + } + + return this + }, + + // Get bounding box of points + bbox () { + var maxX = -Infinity + var maxY = -Infinity + var minX = Infinity + var minY = Infinity + this.forEach(function (el) { + maxX = Math.max(el[0], maxX) + maxY = Math.max(el[1], maxY) + minX = Math.min(el[0], minX) + minY = Math.min(el[1], minY) + }) + return { x: minX, y: minY, width: maxX - minX, height: maxY - minY } + } +}) |