2a42129d93e41aea5fdd93d61ccfd8e6653edc13ef13067cbad91fa05b6cd11c6ed455051af54f4cb116e60d72f453e7ced1de743d7b06d86608185677f3cc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.deepClone = deepClone;
  7. exports.eliminateBlur = eliminateBlur;
  8. exports.checkPointIsInCircle = checkPointIsInCircle;
  9. exports.getTwoPointDistance = getTwoPointDistance;
  10. exports.checkPointIsInPolygon = checkPointIsInPolygon;
  11. exports.checkPointIsInSector = checkPointIsInSector;
  12. exports.checkPointIsNearPolyline = checkPointIsNearPolyline;
  13. exports.checkPointIsInRect = checkPointIsInRect;
  14. exports.getRotatePointPos = getRotatePointPos;
  15. exports.getScalePointPos = getScalePointPos;
  16. exports.getTranslatePointPos = getTranslatePointPos;
  17. exports.getDistanceBetweenPointAndLine = getDistanceBetweenPointAndLine;
  18. exports.getCircleRadianPoint = getCircleRadianPoint;
  19. exports.getRegularPolygonPoints = getRegularPolygonPoints;
  20. exports["default"] = void 0;
  21. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  22. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  23. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  24. var abs = Math.abs,
  25. sqrt = Math.sqrt,
  26. sin = Math.sin,
  27. cos = Math.cos,
  28. max = Math.max,
  29. min = Math.min,
  30. PI = Math.PI;
  31. /**
  32. * @description Clone an object or array
  33. * @param {Object|Array} object Cloned object
  34. * @param {Boolean} recursion Whether to use recursive cloning
  35. * @return {Object|Array} Clone object
  36. */
  37. function deepClone(object) {
  38. var recursion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  39. if (!object) return object;
  40. var parse = JSON.parse,
  41. stringify = JSON.stringify;
  42. if (!recursion) return parse(stringify(object));
  43. var clonedObj = object instanceof Array ? [] : {};
  44. if (object && (0, _typeof2["default"])(object) === 'object') {
  45. for (var key in object) {
  46. if (object.hasOwnProperty(key)) {
  47. if (object[key] && (0, _typeof2["default"])(object[key]) === 'object') {
  48. clonedObj[key] = deepClone(object[key], true);
  49. } else {
  50. clonedObj[key] = object[key];
  51. }
  52. }
  53. }
  54. }
  55. return clonedObj;
  56. }
  57. /**
  58. * @description Eliminate line blur due to 1px line width
  59. * @param {Array} points Line points
  60. * @return {Array} Line points after processed
  61. */
  62. function eliminateBlur(points) {
  63. return points.map(function (_ref) {
  64. var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
  65. x = _ref2[0],
  66. y = _ref2[1];
  67. return [parseInt(x) + 0.5, parseInt(y) + 0.5];
  68. });
  69. }
  70. /**
  71. * @description Check if the point is inside the circle
  72. * @param {Array} point Postion of point
  73. * @param {Number} rx Circle x coordinate
  74. * @param {Number} ry Circle y coordinate
  75. * @param {Number} r Circle radius
  76. * @return {Boolean} Result of check
  77. */
  78. function checkPointIsInCircle(point, rx, ry, r) {
  79. return getTwoPointDistance(point, [rx, ry]) <= r;
  80. }
  81. /**
  82. * @description Get the distance between two points
  83. * @param {Array} point1 point1
  84. * @param {Array} point2 point2
  85. * @return {Number} Distance between two points
  86. */
  87. function getTwoPointDistance(_ref3, _ref4) {
  88. var _ref5 = (0, _slicedToArray2["default"])(_ref3, 2),
  89. xa = _ref5[0],
  90. ya = _ref5[1];
  91. var _ref6 = (0, _slicedToArray2["default"])(_ref4, 2),
  92. xb = _ref6[0],
  93. yb = _ref6[1];
  94. var minusX = abs(xa - xb);
  95. var minusY = abs(ya - yb);
  96. return sqrt(minusX * minusX + minusY * minusY);
  97. }
  98. /**
  99. * @description Check if the point is inside the polygon
  100. * @param {Array} point Postion of point
  101. * @param {Array} points The points that makes up a polyline
  102. * @return {Boolean} Result of check
  103. */
  104. function checkPointIsInPolygon(point, polygon) {
  105. var counter = 0;
  106. var _point = (0, _slicedToArray2["default"])(point, 2),
  107. x = _point[0],
  108. y = _point[1];
  109. var pointNum = polygon.length;
  110. for (var i = 1, p1 = polygon[0]; i <= pointNum; i++) {
  111. var p2 = polygon[i % pointNum];
  112. if (x > min(p1[0], p2[0]) && x <= max(p1[0], p2[0])) {
  113. if (y <= max(p1[1], p2[1])) {
  114. if (p1[0] !== p2[0]) {
  115. var xinters = (x - p1[0]) * (p2[1] - p1[1]) / (p2[0] - p1[0]) + p1[1];
  116. if (p1[1] === p2[1] || y <= xinters) {
  117. counter++;
  118. }
  119. }
  120. }
  121. }
  122. p1 = p2;
  123. }
  124. return counter % 2 === 1;
  125. }
  126. /**
  127. * @description Check if the point is inside the sector
  128. * @param {Array} point Postion of point
  129. * @param {Number} rx Sector x coordinate
  130. * @param {Number} ry Sector y coordinate
  131. * @param {Number} r Sector radius
  132. * @param {Number} startAngle Sector start angle
  133. * @param {Number} endAngle Sector end angle
  134. * @param {Boolean} clockWise Whether the sector angle is clockwise
  135. * @return {Boolean} Result of check
  136. */
  137. function checkPointIsInSector(point, rx, ry, r, startAngle, endAngle, clockWise) {
  138. if (!point) return false;
  139. if (getTwoPointDistance(point, [rx, ry]) > r) return false;
  140. if (!clockWise) {
  141. var _deepClone = deepClone([endAngle, startAngle]);
  142. var _deepClone2 = (0, _slicedToArray2["default"])(_deepClone, 2);
  143. startAngle = _deepClone2[0];
  144. endAngle = _deepClone2[1];
  145. }
  146. var reverseBE = startAngle > endAngle;
  147. if (reverseBE) {
  148. var _ref7 = [endAngle, startAngle];
  149. startAngle = _ref7[0];
  150. endAngle = _ref7[1];
  151. }
  152. var minus = endAngle - startAngle;
  153. if (minus >= PI * 2) return true;
  154. var _point2 = (0, _slicedToArray2["default"])(point, 2),
  155. x = _point2[0],
  156. y = _point2[1];
  157. var _getCircleRadianPoint = getCircleRadianPoint(rx, ry, r, startAngle),
  158. _getCircleRadianPoint2 = (0, _slicedToArray2["default"])(_getCircleRadianPoint, 2),
  159. bx = _getCircleRadianPoint2[0],
  160. by = _getCircleRadianPoint2[1];
  161. var _getCircleRadianPoint3 = getCircleRadianPoint(rx, ry, r, endAngle),
  162. _getCircleRadianPoint4 = (0, _slicedToArray2["default"])(_getCircleRadianPoint3, 2),
  163. ex = _getCircleRadianPoint4[0],
  164. ey = _getCircleRadianPoint4[1];
  165. var vPoint = [x - rx, y - ry];
  166. var vBArm = [bx - rx, by - ry];
  167. var vEArm = [ex - rx, ey - ry];
  168. var reverse = minus > PI;
  169. if (reverse) {
  170. var _deepClone3 = deepClone([vEArm, vBArm]);
  171. var _deepClone4 = (0, _slicedToArray2["default"])(_deepClone3, 2);
  172. vBArm = _deepClone4[0];
  173. vEArm = _deepClone4[1];
  174. }
  175. var inSector = isClockWise(vBArm, vPoint) && !isClockWise(vEArm, vPoint);
  176. if (reverse) inSector = !inSector;
  177. if (reverseBE) inSector = !inSector;
  178. return inSector;
  179. }
  180. /**
  181. * @description Determine if the point is in the clockwise direction of the vector
  182. * @param {Array} vArm Vector
  183. * @param {Array} vPoint Point
  184. * @return {Boolean} Result of check
  185. */
  186. function isClockWise(vArm, vPoint) {
  187. var _vArm = (0, _slicedToArray2["default"])(vArm, 2),
  188. ax = _vArm[0],
  189. ay = _vArm[1];
  190. var _vPoint = (0, _slicedToArray2["default"])(vPoint, 2),
  191. px = _vPoint[0],
  192. py = _vPoint[1];
  193. return -ay * px + ax * py > 0;
  194. }
  195. /**
  196. * @description Check if the point is inside the polyline
  197. * @param {Array} point Postion of point
  198. * @param {Array} polyline The points that makes up a polyline
  199. * @param {Number} lineWidth Polyline linewidth
  200. * @return {Boolean} Result of check
  201. */
  202. function checkPointIsNearPolyline(point, polyline, lineWidth) {
  203. var halfLineWidth = lineWidth / 2;
  204. var moveUpPolyline = polyline.map(function (_ref8) {
  205. var _ref9 = (0, _slicedToArray2["default"])(_ref8, 2),
  206. x = _ref9[0],
  207. y = _ref9[1];
  208. return [x, y - halfLineWidth];
  209. });
  210. var moveDownPolyline = polyline.map(function (_ref10) {
  211. var _ref11 = (0, _slicedToArray2["default"])(_ref10, 2),
  212. x = _ref11[0],
  213. y = _ref11[1];
  214. return [x, y + halfLineWidth];
  215. });
  216. var polygon = [].concat((0, _toConsumableArray2["default"])(moveUpPolyline), (0, _toConsumableArray2["default"])(moveDownPolyline.reverse()));
  217. return checkPointIsInPolygon(point, polygon);
  218. }
  219. /**
  220. * @description Check if the point is inside the rect
  221. * @param {Array} point Postion of point
  222. * @param {Number} x Rect start x coordinate
  223. * @param {Number} y Rect start y coordinate
  224. * @param {Number} width Rect width
  225. * @param {Number} height Rect height
  226. * @return {Boolean} Result of check
  227. */
  228. function checkPointIsInRect(_ref12, x, y, width, height) {
  229. var _ref13 = (0, _slicedToArray2["default"])(_ref12, 2),
  230. px = _ref13[0],
  231. py = _ref13[1];
  232. if (px < x) return false;
  233. if (py < y) return false;
  234. if (px > x + width) return false;
  235. if (py > y + height) return false;
  236. return true;
  237. }
  238. /**
  239. * @description Get the coordinates of the rotated point
  240. * @param {Number} rotate Degree of rotation
  241. * @param {Array} point Postion of point
  242. * @param {Array} origin Rotation center
  243. * @param {Array} origin Rotation center
  244. * @return {Number} Coordinates after rotation
  245. */
  246. function getRotatePointPos() {
  247. var rotate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  248. var point = arguments.length > 1 ? arguments[1] : undefined;
  249. var origin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [0, 0];
  250. if (!point) return false;
  251. if (rotate % 360 === 0) return point;
  252. var _point3 = (0, _slicedToArray2["default"])(point, 2),
  253. x = _point3[0],
  254. y = _point3[1];
  255. var _origin = (0, _slicedToArray2["default"])(origin, 2),
  256. ox = _origin[0],
  257. oy = _origin[1];
  258. rotate *= PI / 180;
  259. return [(x - ox) * cos(rotate) - (y - oy) * sin(rotate) + ox, (x - ox) * sin(rotate) + (y - oy) * cos(rotate) + oy];
  260. }
  261. /**
  262. * @description Get the coordinates of the scaled point
  263. * @param {Array} scale Scale factor
  264. * @param {Array} point Postion of point
  265. * @param {Array} origin Scale center
  266. * @return {Number} Coordinates after scale
  267. */
  268. function getScalePointPos() {
  269. var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [1, 1];
  270. var point = arguments.length > 1 ? arguments[1] : undefined;
  271. var origin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [0, 0];
  272. if (!point) return false;
  273. if (scale === 1) return point;
  274. var _point4 = (0, _slicedToArray2["default"])(point, 2),
  275. x = _point4[0],
  276. y = _point4[1];
  277. var _origin2 = (0, _slicedToArray2["default"])(origin, 2),
  278. ox = _origin2[0],
  279. oy = _origin2[1];
  280. var _scale = (0, _slicedToArray2["default"])(scale, 2),
  281. xs = _scale[0],
  282. ys = _scale[1];
  283. var relativePosX = x - ox;
  284. var relativePosY = y - oy;
  285. return [relativePosX * xs + ox, relativePosY * ys + oy];
  286. }
  287. /**
  288. * @description Get the coordinates of the scaled point
  289. * @param {Array} translate Translation distance
  290. * @param {Array} point Postion of point
  291. * @return {Number} Coordinates after translation
  292. */
  293. function getTranslatePointPos(translate, point) {
  294. if (!translate || !point) return false;
  295. var _point5 = (0, _slicedToArray2["default"])(point, 2),
  296. x = _point5[0],
  297. y = _point5[1];
  298. var _translate = (0, _slicedToArray2["default"])(translate, 2),
  299. tx = _translate[0],
  300. ty = _translate[1];
  301. return [x + tx, y + ty];
  302. }
  303. /**
  304. * @description Get the distance from the point to the line
  305. * @param {Array} point Postion of point
  306. * @param {Array} lineBegin Line start position
  307. * @param {Array} lineEnd Line end position
  308. * @return {Number} Distance between point and line
  309. */
  310. function getDistanceBetweenPointAndLine(point, lineBegin, lineEnd) {
  311. if (!point || !lineBegin || !lineEnd) return false;
  312. var _point6 = (0, _slicedToArray2["default"])(point, 2),
  313. x = _point6[0],
  314. y = _point6[1];
  315. var _lineBegin = (0, _slicedToArray2["default"])(lineBegin, 2),
  316. x1 = _lineBegin[0],
  317. y1 = _lineBegin[1];
  318. var _lineEnd = (0, _slicedToArray2["default"])(lineEnd, 2),
  319. x2 = _lineEnd[0],
  320. y2 = _lineEnd[1];
  321. var a = y2 - y1;
  322. var b = x1 - x2;
  323. var c = y1 * (x2 - x1) - x1 * (y2 - y1);
  324. var molecule = abs(a * x + b * y + c);
  325. var denominator = sqrt(a * a + b * b);
  326. return molecule / denominator;
  327. }
  328. /**
  329. * @description Get the coordinates of the specified radian on the circle
  330. * @param {Number} x Circle x coordinate
  331. * @param {Number} y Circle y coordinate
  332. * @param {Number} radius Circle radius
  333. * @param {Number} radian Specfied radian
  334. * @return {Array} Postion of point
  335. */
  336. function getCircleRadianPoint(x, y, radius, radian) {
  337. return [x + cos(radian) * radius, y + sin(radian) * radius];
  338. }
  339. /**
  340. * @description Get the points that make up a regular polygon
  341. * @param {Number} x X coordinate of the polygon inscribed circle
  342. * @param {Number} y Y coordinate of the polygon inscribed circle
  343. * @param {Number} r Radius of the polygon inscribed circle
  344. * @param {Number} side Side number
  345. * @param {Number} minus Radian offset
  346. * @return {Array} Points that make up a regular polygon
  347. */
  348. function getRegularPolygonPoints(rx, ry, r, side) {
  349. var minus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : PI * -0.5;
  350. var radianGap = PI * 2 / side;
  351. var radians = new Array(side).fill('').map(function (t, i) {
  352. return i * radianGap + minus;
  353. });
  354. return radians.map(function (radian) {
  355. return getCircleRadianPoint(rx, ry, r, radian);
  356. });
  357. }
  358. var _default = {
  359. deepClone: deepClone,
  360. eliminateBlur: eliminateBlur,
  361. checkPointIsInCircle: checkPointIsInCircle,
  362. checkPointIsInPolygon: checkPointIsInPolygon,
  363. checkPointIsInSector: checkPointIsInSector,
  364. checkPointIsNearPolyline: checkPointIsNearPolyline,
  365. getTwoPointDistance: getTwoPointDistance,
  366. getRotatePointPos: getRotatePointPos,
  367. getScalePointPos: getScalePointPos,
  368. getTranslatePointPos: getTranslatePointPos,
  369. getCircleRadianPoint: getCircleRadianPoint,
  370. getRegularPolygonPoints: getRegularPolygonPoints,
  371. getDistanceBetweenPointAndLine: getDistanceBetweenPointAndLine
  372. };
  373. exports["default"] = _default;