UNPKG

@visx/vendor

Version:

vendored packages for visx

77 lines (75 loc) 2.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.circleStream = circleStream; exports.default = _default; var _cartesian = require("./cartesian.js"); var _constant = _interopRequireDefault(require("./constant.js")); var _math = require("./math.js"); var _rotation = require("./rotation.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Generates a circle centered at [0°, 0°], with a given radius and precision. function circleStream(stream, radius, delta, direction, t0, t1) { if (!delta) return; var cosRadius = (0, _math.cos)(radius), sinRadius = (0, _math.sin)(radius), step = direction * delta; if (t0 == null) { t0 = radius + direction * _math.tau; t1 = radius - step / 2; } else { t0 = circleRadius(cosRadius, t0); t1 = circleRadius(cosRadius, t1); if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * _math.tau; } for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { point = (0, _cartesian.spherical)([cosRadius, -sinRadius * (0, _math.cos)(t), -sinRadius * (0, _math.sin)(t)]); stream.point(point[0], point[1]); } } // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. function circleRadius(cosRadius, point) { point = (0, _cartesian.cartesian)(point), point[0] -= cosRadius; (0, _cartesian.cartesianNormalizeInPlace)(point); var radius = (0, _math.acos)(-point[1]); return ((-point[2] < 0 ? -radius : radius) + _math.tau - _math.epsilon) % _math.tau; } function _default() { var center = (0, _constant.default)([0, 0]), radius = (0, _constant.default)(90), precision = (0, _constant.default)(6), ring, rotate, stream = { point: point }; function point(x, y) { ring.push(x = rotate(x, y)); x[0] *= _math.degrees, x[1] *= _math.degrees; } function circle() { var c = center.apply(this, arguments), r = radius.apply(this, arguments) * _math.radians, p = precision.apply(this, arguments) * _math.radians; ring = []; rotate = (0, _rotation.rotateRadians)(-c[0] * _math.radians, -c[1] * _math.radians, 0).invert; circleStream(stream, r, p, 1); c = { type: "Polygon", coordinates: [ring] }; ring = rotate = null; return c; } circle.center = function (_) { return arguments.length ? (center = typeof _ === "function" ? _ : (0, _constant.default)([+_[0], +_[1]]), circle) : center; }; circle.radius = function (_) { return arguments.length ? (radius = typeof _ === "function" ? _ : (0, _constant.default)(+_), circle) : radius; }; circle.precision = function (_) { return arguments.length ? (precision = typeof _ === "function" ? _ : (0, _constant.default)(+_), circle) : precision; }; return circle; }