shapecaptcha
Version:
1,429 lines (1,407 loc) • 89.1 kB
JavaScript
class Stroke {
constructor(squareSize, nbSamplePoints, points, name) {
this.squareSize = squareSize;
this.nbSamplePoints = nbSamplePoints;
this.points = points;
this.name = name;
this.processStroke();
}
getDistance(a, b) {
const dx = b.x - a.x;
const dy = b.y - a.y;
return Math.hypot(dx, dy);
}
processStroke() {
this.points = this.resample();
this.setCentroid();
this.points = this.rotateBy(-this.indicativeAngle());
this.points = this.scaleToSquare();
this.setCentroid();
this.points = this.translateToOrigin();
return this;
}
resample() {
const interval = this.strokeLength() / (this.nbSamplePoints - 1);
const newPoints = [this.points[0]];
let distance = 0;
for (let i = 1; i < this.points.length; i++) {
let localDistance = this.getDistance(this.points[i - 1], this.points[i]);
if (distance + localDistance >= interval) {
let q = {
x: this.points[i - 1].x + ((interval - distance) / localDistance) * (this.points[i].x - this.points[i - 1].x),
y: this.points[i - 1].y + ((interval - distance) / localDistance) * (this.points[i].y - this.points[i - 1].y)
};
newPoints.push(q);
this.points.splice(i, 0, q);
distance = 0;
} else {
distance += localDistance;
}
}
if (newPoints.length === this.nbSamplePoints - 1) {
newPoints.push(this.points[this.points.length - 1]);
}
return newPoints;
}
rotateBy(angle) {
const cos = Math.cos(angle);
const sin = Math.sin(angle);
return this.points.map(point => {
return {
x: (point.x - this.c.x) * cos - (point.y - this.c.y) * sin + this.c.x,
y: (point.x - this.c.x) * sin + (point.y - this.c.y) * cos + this.c.y
};
});
}
scaleToSquare() {
const box = {
minX: +Infinity,
maxX: -Infinity,
minY: +Infinity,
maxY: -Infinity
};
for (let point of this.points) {
box.minX = Math.min(box.minX, point.x);
box.minY = Math.min(box.minY, point.y);
box.maxX = Math.max(box.maxX, point.x);
box.maxY = Math.max(box.maxY, point.y);
}
box.width = box.maxX - box.minX;
box.height = box.maxY - box.minY;
return this.points.map(point => {
return {
x: point.x * (this.squareSize / box.width),
y: point.y * (this.squareSize / box.height)
};
});
}
translateToOrigin() {
const _origin = {
x: 0,
y: 0
};
return this.points.map(point => {
return {
x: point.x + _origin.x - this.c.x,
y: point.y + _origin.y - this.c.y
};
});
}
setCentroid() {
this.c = this.points.reduce((acc, point) => {
acc.x += point.x;
acc.y += point.y;
return acc;
}, {
x: 0,
y: 0
});
this.c.x /= this.points.length;
this.c.y /= this.points.length;
}
indicativeAngle() {
return Math.atan2(this.c.y - this.points[0].y, this.c.x - this.points[0].x);
}
strokeLength() {
return this.points.reduce((acc, point, i, arr) => {
if (i > 0) {
acc += this.getDistance(arr[i - 1], point);
}
return acc;
}, 0);
}
distanceAtBestAngle(pattern) {
const _phi = 0.5 * (-1 + Math.sqrt(5));
const deg2Rad = d => d * Math.PI / 180;
const _angleRange = deg2Rad(45);
const _anglePrecision = deg2Rad(2);
let a = -_angleRange;
let b = _angleRange;
let x1 = _phi * a + (1 - _phi) * b;
let f1 = this.distanceAtAngle(pattern, x1);
let x2 = (1 - _phi) * a + _phi * b;
let f2 = this.distanceAtAngle(pattern, x2);
while (Math.abs(b - a) > _anglePrecision) {
if (f1 < f2) {
b = x2;
x2 = x1;
f2 = f1;
x1 = _phi * a + (1 - _phi) * b;
f1 = this.distanceAtAngle(pattern, x1);
} else {
a = x1;
x1 = x2;
f1 = f2;
x2 = (1 - _phi) * a + _phi * b;
f2 = this.distanceAtAngle(pattern, x2);
}
}
return Math.min(f1, f2);
}
distanceAtAngle(pattern, angle) {
const strokePoints = this.rotateBy(angle);
const d = strokePoints.reduce((acc, point, i) => {
acc += this.getDistance(point, pattern.points[i]);
return acc;
}, 0);
return d / strokePoints.length;
}
}
class ShapeDetector {
constructor() {
const defaultShapes = [{
points: [{
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 157.69687843322748,
y: 385.4812583923338
}, {
x: 175.2187538146972,
y: 350.4375076293944
}, {
x: 192.7406291961669,
y: 315.39375686645496
}, {
x: 210.26250457763663,
y: 280.3500061035155
}, {
x: 227.78437995910636,
y: 245.30625534057606
}, {
x: 245.30625534057606,
y: 210.26250457763663
}, {
x: 262.8281307220458,
y: 175.2187538146972
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 297.87188148498524,
y: 175.2187538146972
}, {
x: 315.39375686645496,
y: 210.26250457763663
}, {
x: 332.9156322479247,
y: 245.30625534057606
}, {
x: 350.4375076293944,
y: 280.3500061035155
}, {
x: 367.95938301086414,
y: 315.39375686645496
}, {
x: 385.4812583923338,
y: 350.4375076293944
}, {
x: 403.00313377380354,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}],
name: 'triangle'
},
{
points: [{
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 297.87188148498524,
y: 175.2187538146972
}, {
x: 315.39375686645496,
y: 210.26250457763663
}, {
x: 332.9156322479247,
y: 245.30625534057606
}, {
x: 350.4375076293944,
y: 280.3500061035155
}, {
x: 367.95938301086414,
y: 315.39375686645496
}, {
x: 385.4812583923338,
y: 350.4375076293944
}, {
x: 403.00313377380354,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 157.69687843322748,
y: 385.4812583923338
}, {
x: 175.2187538146972,
y: 350.4375076293944
}, {
x: 192.7406291961669,
y: 315.39375686645496
}, {
x: 210.26250457763663,
y: 280.3500061035155
}, {
x: 227.78437995910636,
y: 245.30625534057606
}, {
x: 245.30625534057606,
y: 210.26250457763663
}, {
x: 262.8281307220458,
y: 175.2187538146972
}, {
x: 280.3500061035155,
y: 140.17500305175776
}],
name: 'triangle'
},
{
points: [{
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 157.69687843322748,
y: 385.4812583923338
}, {
x: 175.2187538146972,
y: 350.4375076293944
}, {
x: 192.7406291961669,
y: 315.39375686645496
}, {
x: 210.26250457763663,
y: 280.3500061035155
}, {
x: 227.78437995910636,
y: 245.30625534057606
}, {
x: 245.30625534057606,
y: 210.26250457763663
}, {
x: 262.8281307220458,
y: 175.2187538146972
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 297.87188148498524,
y: 175.2187538146972
}, {
x: 315.39375686645496,
y: 210.26250457763663
}, {
x: 332.9156322479247,
y: 245.30625534057606
}, {
x: 350.4375076293944,
y: 280.3500061035155
}, {
x: 367.95938301086414,
y: 315.39375686645496
}, {
x: 385.4812583923338,
y: 350.4375076293944
}, {
x: 403.00313377380354,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}],
name: 'triangle'
},
{
points: [{
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 403.00313377380354,
y: 385.4812583923338
}, {
x: 385.4812583923338,
y: 350.4375076293944
}, {
x: 367.9593830108641,
y: 315.39375686645496
}, {
x: 350.4375076293944,
y: 280.3500061035155
}, {
x: 332.9156322479247,
y: 245.30625534057606
}, {
x: 315.39375686645496,
y: 210.26250457763663
}, {
x: 297.87188148498524,
y: 175.2187538146972
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 262.8281307220458,
y: 175.2187538146972
}, {
x: 245.30625534057606,
y: 210.26250457763663
}, {
x: 227.78437995910636,
y: 245.30625534057606
}, {
x: 210.26250457763663,
y: 280.3500061035155
}, {
x: 192.7406291961669,
y: 315.39375686645496
}, {
x: 175.2187538146972,
y: 350.4375076293944
}, {
x: 157.69687843322748,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 420.52500915527327
}],
name: 'triangle'
},
{
points: [{
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 403.00313377380354,
y: 385.4812583923338
}, {
x: 385.4812583923338,
y: 350.4375076293944
}, {
x: 367.9593830108641,
y: 315.39375686645496
}, {
x: 350.4375076293944,
y: 280.3500061035155
}, {
x: 332.9156322479247,
y: 245.30625534057606
}, {
x: 315.39375686645496,
y: 210.26250457763663
}, {
x: 297.87188148498524,
y: 175.2187538146972
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 262.8281307220458,
y: 175.2187538146972
}, {
x: 245.30625534057606,
y: 210.26250457763663
}, {
x: 227.78437995910636,
y: 245.30625534057606
}, {
x: 210.26250457763663,
y: 280.3500061035155
}, {
x: 192.7406291961669,
y: 315.39375686645496
}, {
x: 175.2187538146972,
y: 350.4375076293944
}, {
x: 157.69687843322748,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}],
name: 'triangle'
},
{
points: [{
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 262.8281307220458,
y: 175.2187538146972
}, {
x: 245.30625534057606,
y: 210.26250457763663
}, {
x: 227.78437995910636,
y: 245.30625534057606
}, {
x: 210.26250457763663,
y: 280.3500061035155
}, {
x: 192.7406291961669,
y: 315.39375686645496
}, {
x: 175.2187538146972,
y: 350.4375076293944
}, {
x: 157.69687843322748,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 403.00313377380354,
y: 385.4812583923338
}, {
x: 385.4812583923338,
y: 350.4375076293944
}, {
x: 367.9593830108641,
y: 315.39375686645496
}, {
x: 350.4375076293944,
y: 280.3500061035155
}, {
x: 332.9156322479247,
y: 245.30625534057606
}, {
x: 315.39375686645496,
y: 210.26250457763663
}, {
x: 297.87188148498524,
y: 175.2187538146972
}, {
x: 280.3500061035155,
y: 140.17500305175776
}],
name: 'triangle'
},
{
points: [{
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 175.2187538146972
}, {
x: 420.52500915527327,
y: 210.26250457763663
}, {
x: 420.52500915527327,
y: 245.30625534057606
}, {
x: 420.52500915527327,
y: 280.3500061035155
}, {
x: 420.52500915527327,
y: 315.39375686645496
}, {
x: 420.52500915527327,
y: 350.4375076293944
}, {
x: 420.52500915527327,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 140.17500305175776
}],
name: 'square'
},
{
points: [{
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 175.2187538146972
}, {
x: 420.52500915527327,
y: 210.26250457763663
}, {
x: 420.52500915527327,
y: 245.30625534057606
}, {
x: 420.52500915527327,
y: 280.3500061035155
}, {
x: 420.52500915527327,
y: 315.39375686645496
}, {
x: 420.52500915527327,
y: 350.4375076293944
}, {
x: 420.52500915527327,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}],
name: 'square'
},
{
points: [{
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 175.2187538146972
}, {
x: 420.52500915527327,
y: 210.26250457763663
}, {
x: 420.52500915527327,
y: 245.30625534057606
}, {
x: 420.52500915527327,
y: 280.3500061035155
}, {
x: 420.52500915527327,
y: 315.39375686645496
}, {
x: 420.52500915527327,
y: 350.4375076293944
}, {
x: 420.52500915527327,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}],
name: 'square'
},
{
points: [{
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 175.2187538146972
}, {
x: 420.52500915527327,
y: 210.26250457763663
}, {
x: 420.52500915527327,
y: 245.30625534057606
}, {
x: 420.52500915527327,
y: 280.3500061035155
}, {
x: 420.52500915527327,
y: 315.39375686645496
}, {
x: 420.52500915527327,
y: 350.4375076293944
}, {
x: 420.52500915527327,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}],
name: 'square'
},
{
points: [{
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 350.4375076293944
}, {
x: 420.52500915527327,
y: 315.39375686645496
}, {
x: 420.52500915527327,
y: 280.3500061035155
}, {
x: 420.52500915527327,
y: 245.30625534057606
}, {
x: 420.52500915527327,
y: 210.26250457763663
}, {
x: 420.52500915527327,
y: 175.2187538146972
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 420.52500915527327
}],
name: 'square'
},
{
points: [{
x: 420.52500915527327,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 385.4812583923338
}, {
x: 420.52500915527327,
y: 350.4375076293944
}, {
x: 420.52500915527327,
y: 315.39375686645496
}, {
x: 420.52500915527327,
y: 280.3500061035155
}, {
x: 420.52500915527327,
y: 245.30625534057606
}, {
x: 420.52500915527327,
y: 210.26250457763663
}, {
x: 420.52500915527327,
y: 175.2187538146972
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {
x: 350.4375076293944,
y: 420.52500915527327
}, {
x: 385.4812583923338,
y: 420.52500915527327
}, {
x: 420.52500915527327,
y: 420.52500915527327
}],
name: 'square'
},
{
points: [{
x: 420.52500915527327,
y: 140.17500305175776
}, {
x: 385.4812583923338,
y: 140.17500305175776
}, {
x: 350.4375076293944,
y: 140.17500305175776
}, {
x: 315.39375686645496,
y: 140.17500305175776
}, {
x: 280.3500061035155,
y: 140.17500305175776
}, {
x: 245.30625534057606,
y: 140.17500305175776
}, {
x: 210.26250457763663,
y: 140.17500305175776
}, {
x: 175.2187538146972,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 140.17500305175776
}, {
x: 140.17500305175776,
y: 175.2187538146972
}, {
x: 140.17500305175776,
y: 210.26250457763663
}, {
x: 140.17500305175776,
y: 245.30625534057606
}, {
x: 140.17500305175776,
y: 280.3500061035155
}, {
x: 140.17500305175776,
y: 315.39375686645496
}, {
x: 140.17500305175776,
y: 350.4375076293944
}, {
x: 140.17500305175776,
y: 385.4812583923338
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 140.17500305175776,
y: 420.52500915527327
}, {
x: 175.2187538146972,
y: 420.52500915527327
}, {
x: 210.26250457763663,
y: 420.52500915527327
}, {
x: 245.30625534057606,
y: 420.52500915527327
}, {
x: 280.3500061035155,
y: 420.52500915527327
}, {
x: 315.39375686645496,
y: 420.52500915527327
}, {