| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.deepClone = deepClone;
- exports.eliminateBlur = eliminateBlur;
- exports.checkPointIsInCircle = checkPointIsInCircle;
- exports.getTwoPointDistance = getTwoPointDistance;
- exports.checkPointIsInPolygon = checkPointIsInPolygon;
- exports.checkPointIsInSector = checkPointIsInSector;
- exports.checkPointIsNearPolyline = checkPointIsNearPolyline;
- exports.checkPointIsInRect = checkPointIsInRect;
- exports.getRotatePointPos = getRotatePointPos;
- exports.getScalePointPos = getScalePointPos;
- exports.getTranslatePointPos = getTranslatePointPos;
- exports.getDistanceBetweenPointAndLine = getDistanceBetweenPointAndLine;
- exports.getCircleRadianPoint = getCircleRadianPoint;
- exports.getRegularPolygonPoints = getRegularPolygonPoints;
- exports["default"] = void 0;
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
- var abs = Math.abs,
- sqrt = Math.sqrt,
- sin = Math.sin,
- cos = Math.cos,
- max = Math.max,
- min = Math.min,
- PI = Math.PI;
- /**
- * @description Clone an object or array
- * @param {Object|Array} object Cloned object
- * @param {Boolean} recursion Whether to use recursive cloning
- * @return {Object|Array} Clone object
- */
- function deepClone(object) {
- var recursion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- if (!object) return object;
- var parse = JSON.parse,
- stringify = JSON.stringify;
- if (!recursion) return parse(stringify(object));
- var clonedObj = object instanceof Array ? [] : {};
- if (object && (0, _typeof2["default"])(object) === 'object') {
- for (var key in object) {
- if (object.hasOwnProperty(key)) {
- if (object[key] && (0, _typeof2["default"])(object[key]) === 'object') {
- clonedObj[key] = deepClone(object[key], true);
- } else {
- clonedObj[key] = object[key];
- }
- }
- }
- }
- return clonedObj;
- }
- /**
- * @description Eliminate line blur due to 1px line width
- * @param {Array} points Line points
- * @return {Array} Line points after processed
- */
- function eliminateBlur(points) {
- return points.map(function (_ref) {
- var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
- x = _ref2[0],
- y = _ref2[1];
- return [parseInt(x) + 0.5, parseInt(y) + 0.5];
- });
- }
- /**
- * @description Check if the point is inside the circle
- * @param {Array} point Postion of point
- * @param {Number} rx Circle x coordinate
- * @param {Number} ry Circle y coordinate
- * @param {Number} r Circle radius
- * @return {Boolean} Result of check
- */
- function checkPointIsInCircle(point, rx, ry, r) {
- return getTwoPointDistance(point, [rx, ry]) <= r;
- }
- /**
- * @description Get the distance between two points
- * @param {Array} point1 point1
- * @param {Array} point2 point2
- * @return {Number} Distance between two points
- */
- function getTwoPointDistance(_ref3, _ref4) {
- var _ref5 = (0, _slicedToArray2["default"])(_ref3, 2),
- xa = _ref5[0],
- ya = _ref5[1];
- var _ref6 = (0, _slicedToArray2["default"])(_ref4, 2),
- xb = _ref6[0],
- yb = _ref6[1];
- var minusX = abs(xa - xb);
- var minusY = abs(ya - yb);
- return sqrt(minusX * minusX + minusY * minusY);
- }
- /**
- * @description Check if the point is inside the polygon
- * @param {Array} point Postion of point
- * @param {Array} points The points that makes up a polyline
- * @return {Boolean} Result of check
- */
- function checkPointIsInPolygon(point, polygon) {
- var counter = 0;
- var _point = (0, _slicedToArray2["default"])(point, 2),
- x = _point[0],
- y = _point[1];
- var pointNum = polygon.length;
- for (var i = 1, p1 = polygon[0]; i <= pointNum; i++) {
- var p2 = polygon[i % pointNum];
- if (x > min(p1[0], p2[0]) && x <= max(p1[0], p2[0])) {
- if (y <= max(p1[1], p2[1])) {
- if (p1[0] !== p2[0]) {
- var xinters = (x - p1[0]) * (p2[1] - p1[1]) / (p2[0] - p1[0]) + p1[1];
- if (p1[1] === p2[1] || y <= xinters) {
- counter++;
- }
- }
- }
- }
- p1 = p2;
- }
- return counter % 2 === 1;
- }
- /**
- * @description Check if the point is inside the sector
- * @param {Array} point Postion of point
- * @param {Number} rx Sector x coordinate
- * @param {Number} ry Sector y coordinate
- * @param {Number} r Sector radius
- * @param {Number} startAngle Sector start angle
- * @param {Number} endAngle Sector end angle
- * @param {Boolean} clockWise Whether the sector angle is clockwise
- * @return {Boolean} Result of check
- */
- function checkPointIsInSector(point, rx, ry, r, startAngle, endAngle, clockWise) {
- if (!point) return false;
- if (getTwoPointDistance(point, [rx, ry]) > r) return false;
- if (!clockWise) {
- var _deepClone = deepClone([endAngle, startAngle]);
- var _deepClone2 = (0, _slicedToArray2["default"])(_deepClone, 2);
- startAngle = _deepClone2[0];
- endAngle = _deepClone2[1];
- }
- var reverseBE = startAngle > endAngle;
- if (reverseBE) {
- var _ref7 = [endAngle, startAngle];
- startAngle = _ref7[0];
- endAngle = _ref7[1];
- }
- var minus = endAngle - startAngle;
- if (minus >= PI * 2) return true;
- var _point2 = (0, _slicedToArray2["default"])(point, 2),
- x = _point2[0],
- y = _point2[1];
- var _getCircleRadianPoint = getCircleRadianPoint(rx, ry, r, startAngle),
- _getCircleRadianPoint2 = (0, _slicedToArray2["default"])(_getCircleRadianPoint, 2),
- bx = _getCircleRadianPoint2[0],
- by = _getCircleRadianPoint2[1];
- var _getCircleRadianPoint3 = getCircleRadianPoint(rx, ry, r, endAngle),
- _getCircleRadianPoint4 = (0, _slicedToArray2["default"])(_getCircleRadianPoint3, 2),
- ex = _getCircleRadianPoint4[0],
- ey = _getCircleRadianPoint4[1];
- var vPoint = [x - rx, y - ry];
- var vBArm = [bx - rx, by - ry];
- var vEArm = [ex - rx, ey - ry];
- var reverse = minus > PI;
- if (reverse) {
- var _deepClone3 = deepClone([vEArm, vBArm]);
- var _deepClone4 = (0, _slicedToArray2["default"])(_deepClone3, 2);
- vBArm = _deepClone4[0];
- vEArm = _deepClone4[1];
- }
- var inSector = isClockWise(vBArm, vPoint) && !isClockWise(vEArm, vPoint);
- if (reverse) inSector = !inSector;
- if (reverseBE) inSector = !inSector;
- return inSector;
- }
- /**
- * @description Determine if the point is in the clockwise direction of the vector
- * @param {Array} vArm Vector
- * @param {Array} vPoint Point
- * @return {Boolean} Result of check
- */
- function isClockWise(vArm, vPoint) {
- var _vArm = (0, _slicedToArray2["default"])(vArm, 2),
- ax = _vArm[0],
- ay = _vArm[1];
- var _vPoint = (0, _slicedToArray2["default"])(vPoint, 2),
- px = _vPoint[0],
- py = _vPoint[1];
- return -ay * px + ax * py > 0;
- }
- /**
- * @description Check if the point is inside the polyline
- * @param {Array} point Postion of point
- * @param {Array} polyline The points that makes up a polyline
- * @param {Number} lineWidth Polyline linewidth
- * @return {Boolean} Result of check
- */
- function checkPointIsNearPolyline(point, polyline, lineWidth) {
- var halfLineWidth = lineWidth / 2;
- var moveUpPolyline = polyline.map(function (_ref8) {
- var _ref9 = (0, _slicedToArray2["default"])(_ref8, 2),
- x = _ref9[0],
- y = _ref9[1];
- return [x, y - halfLineWidth];
- });
- var moveDownPolyline = polyline.map(function (_ref10) {
- var _ref11 = (0, _slicedToArray2["default"])(_ref10, 2),
- x = _ref11[0],
- y = _ref11[1];
- return [x, y + halfLineWidth];
- });
- var polygon = [].concat((0, _toConsumableArray2["default"])(moveUpPolyline), (0, _toConsumableArray2["default"])(moveDownPolyline.reverse()));
- return checkPointIsInPolygon(point, polygon);
- }
- /**
- * @description Check if the point is inside the rect
- * @param {Array} point Postion of point
- * @param {Number} x Rect start x coordinate
- * @param {Number} y Rect start y coordinate
- * @param {Number} width Rect width
- * @param {Number} height Rect height
- * @return {Boolean} Result of check
- */
- function checkPointIsInRect(_ref12, x, y, width, height) {
- var _ref13 = (0, _slicedToArray2["default"])(_ref12, 2),
- px = _ref13[0],
- py = _ref13[1];
- if (px < x) return false;
- if (py < y) return false;
- if (px > x + width) return false;
- if (py > y + height) return false;
- return true;
- }
- /**
- * @description Get the coordinates of the rotated point
- * @param {Number} rotate Degree of rotation
- * @param {Array} point Postion of point
- * @param {Array} origin Rotation center
- * @param {Array} origin Rotation center
- * @return {Number} Coordinates after rotation
- */
- function getRotatePointPos() {
- var rotate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var point = arguments.length > 1 ? arguments[1] : undefined;
- var origin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [0, 0];
- if (!point) return false;
- if (rotate % 360 === 0) return point;
- var _point3 = (0, _slicedToArray2["default"])(point, 2),
- x = _point3[0],
- y = _point3[1];
- var _origin = (0, _slicedToArray2["default"])(origin, 2),
- ox = _origin[0],
- oy = _origin[1];
- rotate *= PI / 180;
- return [(x - ox) * cos(rotate) - (y - oy) * sin(rotate) + ox, (x - ox) * sin(rotate) + (y - oy) * cos(rotate) + oy];
- }
- /**
- * @description Get the coordinates of the scaled point
- * @param {Array} scale Scale factor
- * @param {Array} point Postion of point
- * @param {Array} origin Scale center
- * @return {Number} Coordinates after scale
- */
- function getScalePointPos() {
- var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [1, 1];
- var point = arguments.length > 1 ? arguments[1] : undefined;
- var origin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [0, 0];
- if (!point) return false;
- if (scale === 1) return point;
- var _point4 = (0, _slicedToArray2["default"])(point, 2),
- x = _point4[0],
- y = _point4[1];
- var _origin2 = (0, _slicedToArray2["default"])(origin, 2),
- ox = _origin2[0],
- oy = _origin2[1];
- var _scale = (0, _slicedToArray2["default"])(scale, 2),
- xs = _scale[0],
- ys = _scale[1];
- var relativePosX = x - ox;
- var relativePosY = y - oy;
- return [relativePosX * xs + ox, relativePosY * ys + oy];
- }
- /**
- * @description Get the coordinates of the scaled point
- * @param {Array} translate Translation distance
- * @param {Array} point Postion of point
- * @return {Number} Coordinates after translation
- */
- function getTranslatePointPos(translate, point) {
- if (!translate || !point) return false;
- var _point5 = (0, _slicedToArray2["default"])(point, 2),
- x = _point5[0],
- y = _point5[1];
- var _translate = (0, _slicedToArray2["default"])(translate, 2),
- tx = _translate[0],
- ty = _translate[1];
- return [x + tx, y + ty];
- }
- /**
- * @description Get the distance from the point to the line
- * @param {Array} point Postion of point
- * @param {Array} lineBegin Line start position
- * @param {Array} lineEnd Line end position
- * @return {Number} Distance between point and line
- */
- function getDistanceBetweenPointAndLine(point, lineBegin, lineEnd) {
- if (!point || !lineBegin || !lineEnd) return false;
- var _point6 = (0, _slicedToArray2["default"])(point, 2),
- x = _point6[0],
- y = _point6[1];
- var _lineBegin = (0, _slicedToArray2["default"])(lineBegin, 2),
- x1 = _lineBegin[0],
- y1 = _lineBegin[1];
- var _lineEnd = (0, _slicedToArray2["default"])(lineEnd, 2),
- x2 = _lineEnd[0],
- y2 = _lineEnd[1];
- var a = y2 - y1;
- var b = x1 - x2;
- var c = y1 * (x2 - x1) - x1 * (y2 - y1);
- var molecule = abs(a * x + b * y + c);
- var denominator = sqrt(a * a + b * b);
- return molecule / denominator;
- }
- /**
- * @description Get the coordinates of the specified radian on the circle
- * @param {Number} x Circle x coordinate
- * @param {Number} y Circle y coordinate
- * @param {Number} radius Circle radius
- * @param {Number} radian Specfied radian
- * @return {Array} Postion of point
- */
- function getCircleRadianPoint(x, y, radius, radian) {
- return [x + cos(radian) * radius, y + sin(radian) * radius];
- }
- /**
- * @description Get the points that make up a regular polygon
- * @param {Number} x X coordinate of the polygon inscribed circle
- * @param {Number} y Y coordinate of the polygon inscribed circle
- * @param {Number} r Radius of the polygon inscribed circle
- * @param {Number} side Side number
- * @param {Number} minus Radian offset
- * @return {Array} Points that make up a regular polygon
- */
- function getRegularPolygonPoints(rx, ry, r, side) {
- var minus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : PI * -0.5;
- var radianGap = PI * 2 / side;
- var radians = new Array(side).fill('').map(function (t, i) {
- return i * radianGap + minus;
- });
- return radians.map(function (radian) {
- return getCircleRadianPoint(rx, ry, r, radian);
- });
- }
- var _default = {
- deepClone: deepClone,
- eliminateBlur: eliminateBlur,
- checkPointIsInCircle: checkPointIsInCircle,
- checkPointIsInPolygon: checkPointIsInPolygon,
- checkPointIsInSector: checkPointIsInSector,
- checkPointIsNearPolyline: checkPointIsNearPolyline,
- getTwoPointDistance: getTwoPointDistance,
- getRotatePointPos: getRotatePointPos,
- getScalePointPos: getScalePointPos,
- getTranslatePointPos: getTranslatePointPos,
- getCircleRadianPoint: getCircleRadianPoint,
- getRegularPolygonPoints: getRegularPolygonPoints,
- getDistanceBetweenPointAndLine: getDistanceBetweenPointAndLine
- };
- exports["default"] = _default;
|