{"version":3,"file":"diagram.js","sourceRoot":"","sources":["../../../../src/plots/venn/layout/diagram.ts"],"names":[],"mappings":"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","sourcesContent":["import { nelderMead } from 'fmin';\nimport { distance, getCenter, intersectionArea } from './circleintersection';\n\nfunction circleMargin(current, interior, exterior) {\n let margin = interior[0].radius - distance(interior[0], current),\n i,\n m;\n for (i = 1; i < interior.length; ++i) {\n m = interior[i].radius - distance(interior[i], current);\n if (m <= margin) {\n margin = m;\n }\n }\n\n for (i = 0; i < exterior.length; ++i) {\n m = distance(exterior[i], current) - exterior[i].radius;\n if (m <= margin) {\n margin = m;\n }\n }\n return margin;\n}\n\n// compute the center of some circles by maximizing the margin of\n// the center point relative to the circles (interior) after subtracting\n// nearby circles (exterior)\nexport function computeTextCentre(interior, exterior) {\n // get an initial estimate by sampling around the interior circles\n // and taking the point with the biggest margin\n const points = [];\n let i;\n for (i = 0; i < interior.length; ++i) {\n const c = interior[i];\n points.push({ x: c.x, y: c.y });\n points.push({ x: c.x + c.radius / 2, y: c.y });\n points.push({ x: c.x - c.radius / 2, y: c.y });\n points.push({ x: c.x, y: c.y + c.radius / 2 });\n points.push({ x: c.x, y: c.y - c.radius / 2 });\n }\n let initial = points[0],\n margin = circleMargin(points[0], interior, exterior);\n for (i = 1; i < points.length; ++i) {\n const m = circleMargin(points[i], interior, exterior);\n if (m >= margin) {\n initial = points[i];\n margin = m;\n }\n }\n\n // maximize the margin numerically\n const solution = nelderMead(\n function (p) {\n return -1 * circleMargin({ x: p[0], y: p[1] }, interior, exterior);\n },\n [initial.x, initial.y],\n { maxIterations: 500, minErrorDelta: 1e-10 }\n ).x;\n let ret: any = { x: solution[0], y: solution[1] };\n\n // check solution, fallback as needed (happens if fully overlapped\n // etc)\n let valid = true;\n for (i = 0; i < interior.length; ++i) {\n if (distance(ret, interior[i]) > interior[i].radius) {\n valid = false;\n break;\n }\n }\n\n for (i = 0; i < exterior.length; ++i) {\n if (distance(ret, exterior[i]) < exterior[i].radius) {\n valid = false;\n break;\n }\n }\n\n if (!valid) {\n if (interior.length == 1) {\n ret = { x: interior[0].x, y: interior[0].y };\n } else {\n const areaStats: any = {};\n intersectionArea(interior, areaStats);\n\n if (areaStats.arcs.length === 0) {\n ret = { x: 0, y: -1000, disjoint: true };\n } else if (areaStats.arcs.length == 1) {\n ret = { x: areaStats.arcs[0].circle.x, y: areaStats.arcs[0].circle.y };\n } else if (exterior.length) {\n // try again without other circles\n ret = computeTextCentre(interior, []);\n } else {\n // take average of all the points in the intersection\n // polygon. this should basically never happen\n // and has some issues:\n // https://github.com/benfred/venn.js/issues/48#issuecomment-146069777\n ret = getCenter(\n areaStats.arcs.map(function (a) {\n return a.p1;\n })\n );\n }\n }\n }\n\n return ret;\n}\n\n// given a dictionary of {setid : circle}, returns\n// a dictionary of setid to list of circles that completely overlap it\nfunction getOverlappingCircles(circles) {\n const ret = {},\n circleids = [];\n for (const circleid in circles) {\n circleids.push(circleid);\n ret[circleid] = [];\n }\n for (let i = 0; i < circleids.length; i++) {\n const a = circles[circleids[i]];\n for (let j = i + 1; j < circleids.length; ++j) {\n const b = circles[circleids[j]],\n d = distance(a, b);\n\n if (d + b.radius <= a.radius + 1e-10) {\n ret[circleids[j]].push(circleids[i]);\n } else if (d + a.radius <= b.radius + 1e-10) {\n ret[circleids[i]].push(circleids[j]);\n }\n }\n }\n return ret;\n}\n\nexport function computeTextCentres(circles, areas) {\n const ret = {},\n overlapped = getOverlappingCircles(circles);\n for (let i = 0; i < areas.length; ++i) {\n const area = areas[i].sets,\n areaids = {},\n exclude = {};\n for (let j = 0; j < area.length; ++j) {\n areaids[area[j]] = true;\n const overlaps = overlapped[area[j]];\n // keep track of any circles that overlap this area,\n // and don't consider for purposes of computing the text\n // centre\n for (let k = 0; k < overlaps.length; ++k) {\n exclude[overlaps[k]] = true;\n }\n }\n\n const interior = [],\n exterior = [];\n for (const setid in circles) {\n if (setid in areaids) {\n interior.push(circles[setid]);\n } else if (!(setid in exclude)) {\n exterior.push(circles[setid]);\n }\n }\n const centre = computeTextCentre(interior, exterior);\n ret[area] = centre;\n if (centre.disjoint && areas[i].size > 0) {\n console.log('WARNING: area ' + area + ' not represented on screen');\n }\n }\n return ret;\n}\n\n/**\n * 根据圆心(x, y) 半径 r 返回圆的绘制 path\n * @param x 圆心点 x\n * @param y 圆心点 y\n * @param r 圆的半径\n * @returns 圆的 path\n */\nexport function circlePath(x, y, r) {\n const ret = [];\n // ret.push('\\nM', x, y);\n // ret.push('\\nm', -r, 0);\n // ret.push('\\na', r, r, 0, 1, 0, r * 2, 0);\n // ret.push('\\na', r, r, 0, 1, 0, -r * 2, 0);\n const x0 = x - r;\n const y0 = y;\n ret.push('M', x0, y0);\n ret.push('A', r, r, 0, 1, 0, x0 + 2 * r, y0);\n ret.push('A', r, r, 0, 1, 0, x0, y0);\n\n return ret.join(' ');\n}\n\n// inverse of the circlePath function, returns a circle object from an svg path\nexport function circleFromPath(path) {\n const tokens = path.split(' ');\n return { x: parseFloat(tokens[1]), y: parseFloat(tokens[2]), radius: -parseFloat(tokens[4]) };\n}\n\n/** returns a svg path of the intersection area of a bunch of circles */\nexport function intersectionAreaPath(circles) {\n const stats: any = {};\n intersectionArea(circles, stats);\n const arcs = stats.arcs;\n\n if (arcs.length === 0) {\n return 'M 0 0';\n } else if (arcs.length == 1) {\n const circle = arcs[0].circle;\n return circlePath(circle.x, circle.y, circle.radius);\n } else {\n // draw path around arcs\n const ret = ['\\nM', arcs[0].p2.x, arcs[0].p2.y];\n for (let i = 0; i < arcs.length; ++i) {\n const arc = arcs[i],\n r = arc.circle.radius,\n wide = arc.width > r;\n ret.push('\\nA', r, r, 0, wide ? 1 : 0, 1, arc.p1.x, arc.p1.y);\n }\n return ret.join(' ');\n }\n}\n"]}