exports.Poly = function(n) { this.n = n == undefined ? 128 : n * 2; this.midScreenX = Bangle.appRect.w / 2; // g.getWidth() / 2; this.midScreenY = Bangle.appRect.h / 2; // g.getHeight() / 2; this.points = new Int32Array(this.n); this._index = 0; this.minX = undefined; this.maxX = undefined; this.minY = undefined; this.maxY = undefined; this.width = 0; this.height = 0; this.getPoints = function() { return this.points.subarray(0, this._index+1); }; this.addPoint = function(x, y) { this.points[this._index] = x; this._index++; this.points[this._index] = y; this._index++; if (this.minX === undefined) { this.minX = x; this.maxX = x; this.minY = y; this.maxY = y; } this.minX = Math.min(this.minX, x); this.maxX = Math.max(this.maxX, x); this.minY = Math.min(this.minY, y); this.maxY = Math.max(this.maxY, y); this.width = this.maxX - this.minX + 1; this.height = this.maxY - this.minY + 1; this.midX = Math.round(this.width / 2); this.midY = Math.round(this.height / 2); this.centerX = this.minX + this.midX + 1; this.centerY = this.minY + this.midY + 1; return this; }; this.p = this.addPoint; this.getWidth = function() { return this.width; }; this.getHeight = function() { return this.height; }; this.getmidY = function() { return this.midY; }; this.getmidX = function() { return this.midX; }; /** * Convert an angle and radius into x and y cooridinates * @param a angle in radians * @param r radius, defaults to half screen width * @param x x cooridinate, defaults to center * @param y y coordinate, defaults to center */ this.addRadialPoint = function(a, r, x, y) { r = r === undefined ? this.midScreenX : r; x = x === undefined ? this.midScreenX : x; y = y === undefined ? this.midScreenY : y; this.addPoint(Math.round((Math.cos(a) * r)) + x, Math.round((Math.sin(a) * r)) + y); return this; }; this.makeArc = function(a1, a2, r, x, y) { const aS = a1; // < a2 ? a1 : a2; const aE = a2; // > a1 ? a2 + 0.001: a1 + 0.001; if (a1 < a2) { for (let a = aS; a <= aE; a+=0.1) { this.addRadialPoint(a, r, x, y); } } else { for (let a = aS; a >= aE; a-=0.1) { this.addRadialPoint(a, r, x, y); } } this.addRadialPoint(a2, r, x, y); // make sure we actually have a point at the end angle // this.addPoint(x, y); // center point return this; }; this.makeSeg = function(a1, a2, r1, r2, x, y) { this.makeArc(a1 , a2, r1, x, y); this.makeArc(a2, a1, r2, x, y); return this; }; }