StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
25 KiB
1 lines
25 KiB
{"version":3,"sources":["../src/Polygon.js"],"names":[],"mappings":"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","file":"Polygon.js","sourcesContent":["\"use strict\";\r\n\r\nimport { LinkedList } from \"./LinkedList\";\r\nimport { PRECISION } from \"./PRECISION\";\r\nimport { Matrix } from \"./Matrix\";\r\nimport { Vector } from \"./Vector\";\r\nimport { Plane } from \"./Plane\";\r\nimport { Line } from \"./Line\";\r\n\r\nexport class Polygon\r\n{\r\n constructor (points, plane)\r\n {\r\n this.setVertices(points, plane);\r\n }\r\n\r\n v (i)\r\n {\r\n return this.vertices.at(i - 1).data;\r\n }\r\n\r\n nodeFor (vertex)\r\n {\r\n return this.vertices.withData(vertex);\r\n }\r\n\r\n dup ()\r\n {\r\n return new Polygon(this.vertices, this.plane);\r\n }\r\n\r\n translate (vector)\r\n {\r\n var P = vector.elements || vector;\r\n this.vertices.each(function(node)\r\n {\r\n var E = node.data.elements;\r\n node.data.setElements([E[0] + P[0], E[1] + P[1], E[2] + (P[2] || 0)]);\r\n });\r\n this.plane = this.plane.translate(vector);\r\n this.updateTrianglePlanes(function(plane)\r\n {\r\n return plane.translate(vector);\r\n });\r\n return this;\r\n }\r\n\r\n rotate (t, line)\r\n {\r\n var R = Matrix.Rotation(t, line.direction);\r\n this.vertices.each(function(node)\r\n {\r\n node.data.setElements(node.data.rotate(R, line).elements);\r\n });\r\n this.plane = this.plane.rotate(R, line);\r\n this.updateTrianglePlanes(function(plane)\r\n {\r\n return plane.rotate(R, line);\r\n });\r\n return this;\r\n }\r\n\r\n scale (k, point)\r\n {\r\n var P = point.elements || point;\r\n this.vertices.each(function(node)\r\n {\r\n var E = node.data.elements;\r\n node.data.setElements([\r\n P[0] + k * (E[0] - P[0]),\r\n P[1] + k * (E[1] - P[1]),\r\n (P[2] || 0) + k * (E[2] - (P[2] || 0))\r\n ]);\r\n });\r\n var anchor = this.vertices.first.data;\r\n this.plane.anchor.setElements(anchor);\r\n this.updateTrianglePlanes(function(plane)\r\n {\r\n return new Plane(anchor, plane.normal);\r\n });\r\n return this;\r\n }\r\n\r\n // Updates the plane properties of all the cached triangles belonging to the\r\n // polygon according to the given function. For example, suppose you just\r\n // rotated the polygon, you should call:\r\n //\r\n // poly.updateTrianglePlanes(function(plane) { return plane.rotate(t, line); });\r\n //\r\n // This method is called automatically by Polygon.translate,\r\n // Polygon.rotate and Polygon.scale transformation methods.\r\n updateTrianglePlanes (fn)\r\n {\r\n var i;\r\n if (this.cached.triangles !== null)\r\n {\r\n i = this.cached.triangles.length;\r\n while (i--)\r\n {\r\n this.cached.triangles[i].plane = fn(this.cached.triangles[i].plane);\r\n }\r\n }\r\n if (this.cached.surfaceIntegralElements !== null)\r\n {\r\n i = this.cached.surfaceIntegralElements.length;\r\n while (i--)\r\n {\r\n this.cached.surfaceIntegralElements[i].plane = fn(this.cached.surfaceIntegralElements[i].plane);\r\n }\r\n }\r\n }\r\n\r\n isTriangle ()\r\n {\r\n return this.vertices.length === 3;\r\n }\r\n\r\n // Returns a collection of triangles used for calculating area and center of\r\n // mass. Some of the triangles will not lie inside the polygon - this\r\n // collection is essentially a series of itervals in a surface integral, so\r\n // some are 'negative'. If you want the polygon broken into constituent\r\n // triangles, use toTriangles(). This method is used because it's much faster\r\n // than toTriangles().\r\n //\r\n // The triangles generated share vertices with the original polygon, so they\r\n // transform with the polygon. They are cached after first calculation and\r\n // should remain in sync with changes to the parent polygon.\r\n trianglesForSurfaceIntegral ()\r\n {\r\n if (this.cached.surfaceIntegralElements !== null)\r\n {\r\n return this.cached.surfaceIntegralElements;\r\n }\r\n var triangles = [];\r\n var firstVertex = this.vertices.first.data;\r\n var plane = this.plane;\r\n this.vertices.each(function(node, i)\r\n {\r\n if (i < 2)\r\n {\r\n return;\r\n }\r\n var points = [firstVertex, node.prev.data, node.data];\r\n // If the vertices lie on a straigh line, give the polygon's own plane. If\r\n // the element has no area, it doesn't matter which way its normal faces.\r\n triangles.push(new Polygon(points, Plane.fromPoints(points) || plane));\r\n });\r\n return this.setCache('surfaceIntegralElements', triangles);\r\n }\r\n\r\n area ()\r\n {\r\n if (this.isTriangle())\r\n {\r\n // Area is half the modulus of the cross product of two sides\r\n var A = this.vertices.first, B = A.next, C = B.next;\r\n A = A.data.elements; B = B.data.elements; C = C.data.elements;\r\n return 0.5 * new Vector([\r\n (A[1] - B[1]) * (C[2] - B[2]) - (A[2] - B[2]) * (C[1] - B[1]),\r\n (A[2] - B[2]) * (C[0] - B[0]) - (A[0] - B[0]) * (C[2] - B[2]),\r\n (A[0] - B[0]) * (C[1] - B[1]) - (A[1] - B[1]) * (C[0] - B[0])\r\n ]).modulus();\r\n }\r\n else\r\n {\r\n var trigs = this.trianglesForSurfaceIntegral(), area = 0;\r\n var i = trigs.length;\r\n while (i--)\r\n {\r\n area += trigs[i].area() * trigs[i].plane.normal.dot(this.plane.normal);\r\n }\r\n return area;\r\n }\r\n }\r\n\r\n centroid ()\r\n {\r\n if (this.isTriangle())\r\n {\r\n var A = this.v(1).elements, B = this.v(2).elements, C = this.v(3).elements;\r\n return new Vector([(A[0] + B[0] + C[0])/3, (A[1] + B[1] + C[1])/3, (A[2] + B[2] + C[2])/3]);\r\n }\r\n else\r\n {\r\n var A, M = 0, V = Vector.Zero(3), P, C, trigs = this.trianglesForSurfaceIntegral();\r\n var i = trigs.length;\r\n while (i--)\r\n {\r\n A = trigs[i].area() * trigs[i].plane.normal.dot(this.plane.normal);\r\n M += A;\r\n P = V.elements;\r\n C = trigs[i].centroid().elements;\r\n V.setElements([P[0] + C[0] * A, P[1] + C[1] * A, P[2] + C[2] * A]);\r\n }\r\n return V.x(1/M);\r\n }\r\n }\r\n\r\n projectionOn (plane)\r\n {\r\n var points = [];\r\n this.vertices.each(function(node)\r\n {\r\n points.push(plane.pointClosestTo(node.data));\r\n });\r\n return new Polygon(points);\r\n }\r\n\r\n removeVertex (vertex)\r\n {\r\n if (this.isTriangle())\r\n {\r\n return;\r\n }\r\n var node = this.nodeFor(vertex);\r\n if (node === null)\r\n {\r\n return null;\r\n }\r\n this.clearCache();\r\n // Previous and next entries in the main vertex list\r\n var prev = node.prev, next = node.next;\r\n var prevWasConvex = prev.data.isConvex(this);\r\n var nextWasConvex = next.data.isConvex(this);\r\n if (node.data.isConvex(this))\r\n {\r\n this.convexVertices.remove(this.convexVertices.withData(node.data));\r\n }\r\n else\r\n {\r\n this.reflexVertices.remove(this.reflexVertices.withData(node.data));\r\n }\r\n this.vertices.remove(node);\r\n // Deal with previous vertex's change of class\r\n if (prevWasConvex !== prev.data.isConvex(this))\r\n {\r\n if (prevWasConvex)\r\n {\r\n this.convexVertices.remove(this.convexVertices.withData(prev.data));\r\n this.reflexVertices.append(new LinkedList.Node(prev.data));\r\n }\r\n else\r\n {\r\n this.reflexVertices.remove(this.reflexVertices.withData(prev.data));\r\n this.convexVertices.append(new LinkedList.Node(prev.data));\r\n }\r\n }\r\n // Deal with next vertex's change of class\r\n if (nextWasConvex !== next.data.isConvex(this))\r\n {\r\n if (nextWasConvex)\r\n {\r\n this.convexVertices.remove(this.convexVertices.withData(next.data));\r\n this.reflexVertices.append(new LinkedList.Node(next.data));\r\n }\r\n else\r\n {\r\n this.reflexVertices.remove(this.reflexVertices.withData(next.data));\r\n this.convexVertices.append(new LinkedList.Node(next.data));\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n contains (point)\r\n {\r\n return this.containsByWindingNumber(point);\r\n }\r\n\r\n containsByWindingNumber (point)\r\n {\r\n var P = point.elements || point;\r\n if (!this.plane.contains(P))\r\n {\r\n return false;\r\n }\r\n if (this.hasEdgeContaining(P))\r\n {\r\n return false;\r\n }\r\n var V, W, A, B, theta = 0, dt, loops = 0, self = this;\r\n this.vertices.each(function(node)\r\n {\r\n V = node.data.elements;\r\n W = node.next.data.elements;\r\n A = new Vector([V[0] - P[0], V[1] - P[1], V[2] - (P[2] || 0)]);\r\n B = new Vector([W[0] - P[0], W[1] - P[1], W[2] - (P[2] || 0)]);\r\n dt = A.angleFrom(B);\r\n if (dt === null || dt === 0) { return; }\r\n theta += (A.cross(B).isParallelTo(self.plane.normal) ? 1 : -1) * dt;\r\n if (theta >= 2 * Math.PI - PRECISION) { loops++; theta -= 2 * Math.PI; }\r\n if (theta <= -2 * Math.PI + PRECISION) { loops--; theta += 2 * Math.PI; }\r\n });\r\n return loops !== 0;\r\n }\r\n\r\n hasEdgeContaining (point)\r\n {\r\n var P = (point.elements || point);\r\n var success = false;\r\n this.vertices.each(function(node)\r\n {\r\n if (Line.Segment.create(node.data, node.next.data).contains(P))\r\n {\r\n success = true;\r\n }\r\n });\r\n return success;\r\n }\r\n\r\n toTriangles ()\r\n {\r\n if (this.cached.triangles !== null)\r\n {\r\n return this.cached.triangles;\r\n }\r\n return this.setCache('triangles', this.triangulateByEarClipping());\r\n }\r\n\r\n // Implementation of ear clipping algorithm\r\n // Found in 'Triangulation by ear clipping', by David Eberly\r\n // at http://www.geometrictools.com\r\n // This will not deal with overlapping sections - contruct your polygons\r\n // sensibly\r\n triangulateByEarClipping ()\r\n {\r\n var poly = this.dup(), triangles = [], success, convexNode, mainNode, trig;\r\n while (!poly.isTriangle())\r\n {\r\n success = false;\r\n while (!success)\r\n {\r\n success = true;\r\n // Ear tips must be convex vertices - let's pick one at random\r\n convexNode = poly.convexVertices.randomNode();\r\n mainNode = poly.vertices.withData(convexNode.data);\r\n // For convex vertices, this order will always be anticlockwise\r\n trig = new Polygon([mainNode.data, mainNode.next.data, mainNode.prev.data], this.plane);\r\n // Now test whether any reflex vertices lie within the ear\r\n poly.reflexVertices.each(function(node)\r\n {\r\n // Don't test points belonging to this triangle. node won't be equal\r\n // to convexNode as node is reflex and vertex is convex.\r\n if (node.data !== mainNode.prev.data && node.data !== mainNode.next.data)\r\n {\r\n if (trig.contains(node.data) || trig.hasEdgeContaining(node.data))\r\n {\r\n success = false;\r\n }\r\n }\r\n });\r\n }\r\n triangles.push(trig);\r\n poly.removeVertex(mainNode.data);\r\n }\r\n // Need to do this to renumber the remaining vertices\r\n triangles.push(new Polygon(poly.vertices, this.plane));\r\n return triangles;\r\n }\r\n\r\n setVertices (points, plane)\r\n {\r\n var pointSet = points.toArray ? points.toArray() : points;\r\n this.plane = (plane && plane.normal) ? plane.dup() : Plane.fromPoints(pointSet);\r\n if (this.plane === null)\r\n {\r\n return null;\r\n }\r\n this.vertices = new LinkedList.Circular();\r\n // Construct linked list of vertices. If each point is already a polygon\r\n // vertex, we reference it rather than creating a new vertex.\r\n var i = pointSet.length, newVertex;\r\n while (i--)\r\n {\r\n newVertex = pointSet[i].isConvex ? pointSet[i] : new Polygon.Vertex(pointSet[i]);\r\n this.vertices.prepend(new LinkedList.Node(newVertex));\r\n }\r\n this.clearCache();\r\n this.populateVertexTypeLists();\r\n return this;\r\n }\r\n\r\n populateVertexTypeLists ()\r\n {\r\n this.convexVertices = new LinkedList.Circular();\r\n this.reflexVertices = new LinkedList.Circular();\r\n var self = this;\r\n this.vertices.each(function(node)\r\n {\r\n // Split vertices into convex / reflex groups. The\r\n // LinkedList.Node class wraps each vertex so it can belong to\r\n // many linked lists.\r\n self[node.data.type(self) + 'Vertices'].append(new LinkedList.Node(node.data));\r\n });\r\n }\r\n\r\n copyVertices ()\r\n {\r\n this.clearCache();\r\n this.vertices.each(function(node)\r\n {\r\n node.data = new Polygon.Vertex(node.data);\r\n });\r\n this.populateVertexTypeLists();\r\n }\r\n\r\n clearCache ()\r\n {\r\n this.cached = {\r\n triangles: null,\r\n surfaceIntegralElements: null\r\n };\r\n }\r\n\r\n setCache (key, value)\r\n {\r\n this.cached[key] = value;\r\n return value;\r\n }\r\n\r\n inspect ()\r\n {\r\n var points = [];\r\n this.vertices.each(function(node)\r\n {\r\n points.push(node.data.inspect());\r\n });\r\n return points.join(' -> ');\r\n }\r\n}\r\n"]} |