| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import intersectRect from './intersect/intersect-rect'
- import intersectEllipse from './intersect/intersect-ellipse'
- import intersectCircle from './intersect/intersect-circle'
- import intersectPolygon from './intersect/intersect-polygon'
- function rect (parent, bbox, node) {
- const shapeSvg = parent.insert('rect', ':first-child')
- .attr('rx', node.rx)
- .attr('ry', node.ry)
- .attr('x', -bbox.width / 2)
- .attr('y', -bbox.height / 2)
- .attr('width', bbox.width)
- .attr('height', bbox.height)
- node.intersect = function (point) {
- return intersectRect(node, point)
- }
- return shapeSvg
- }
- function ellipse (parent, bbox, node) {
- const rx = bbox.width / 2
- const ry = bbox.height / 2
- const shapeSvg = parent.insert('ellipse', ':first-child')
- .attr('x', -bbox.width / 2)
- .attr('y', -bbox.height / 2)
- .attr('rx', rx)
- .attr('ry', ry)
- node.intersect = function (point) {
- return intersectEllipse(node, rx, ry, point)
- }
- return shapeSvg
- }
- function circle (parent, bbox, node) {
- const r = Math.max(bbox.width, bbox.height) / 2
- const shapeSvg = parent.insert('circle', ':first-child')
- .attr('x', -bbox.width / 2)
- .attr('y', -bbox.height / 2)
- .attr('r', r)
- node.intersect = function (point) {
- return intersectCircle(node, r, point)
- }
- return shapeSvg
- }
- // Circumscribe an ellipse for the bounding box with a diamond shape. I derived
- // the function to calculate the diamond shape from:
- // http://mathforum.org/kb/message.jspa?messageID=3750236
- function diamond (parent, bbox, node) {
- const w = (bbox.width * Math.SQRT2) / 2
- const h = (bbox.height * Math.SQRT2) / 2
- const points = [
- { x: 0, y: -h },
- { x: -w, y: 0 },
- { x: 0, y: h },
- { x: w, y: 0 }
- ]
- const shapeSvg = parent.insert('polygon', ':first-child')
- .attr('points', points.map(function (p) { return p.x + ',' + p.y }).join(' '))
- node.intersect = function (p) {
- return intersectPolygon(node, points, p)
- }
- return shapeSvg
- }
- export default {
- rect,
- ellipse,
- circle,
- diamond
- }
|