| | |
| | | return count === 2; |
| | | } |
| | | |
| | | /** |
| | | * 计算点 (sx,sy) 和 (mx,my) 在直线段 path0 上的带符号投影距离差。 |
| | | * 返回值 >0 表示 mx,my 在 sx,sy 前方(沿路径方向)。 |
| | | * @param {{ type: string, startX: number, startY: number, x: number, y: number }} path0 直线段路径 |
| | | * @param {number} sx 起点 x |
| | | * @param {number} sy 起点 y |
| | | * @param {number} mx 终点 x |
| | | * @param {number} my 终点 y |
| | | * @returns {number|null} 带符号距离差,非线段或零长度时返回 null |
| | | */ |
| | | function lineSignedRemainAlong(path0, sx, sy, mx, my) { |
| | | if (!path0 || path0.type !== 'line') { |
| | | return null; |
| | | } |
| | | var start = { x: path0.startX, y: path0.startY }; |
| | | var end = { x: path0.x, y: path0.y }; |
| | | var segLen = calcDistance(start, end); |
| | | if (!(segLen > 0)) { |
| | | return null; |
| | | } |
| | | var vector = normalizeVector(start, end); |
| | | var clampT = function (px, py) { |
| | | var t = ((px - start.x) * vector.x + (py - start.y) * vector.y) * segLen; |
| | | return Math.max(0, Math.min(segLen, t)); |
| | | }; |
| | | return clampT(mx, my) - clampT(sx, sy); |
| | | } |
| | | |
| | | function setRadiusInPoint(pointList, sprite) { |
| | | sprite.halfList = []; |
| | | var pointLength = pointList.length; |
| | |
| | | startDrawSmoothedPath: startDrawSmoothedPath, |
| | | getRotate: getRotate, |
| | | drawCrnDeviceGraphics: drawCrnDeviceGraphics, |
| | | drawRgvDeviceGraphics: drawRgvDeviceGraphics |
| | | drawRgvDeviceGraphics: drawRgvDeviceGraphics, |
| | | lineSignedRemainAlong: lineSignedRemainAlong |
| | | }; |
| | | })(typeof window !== 'undefined' ? window : this); |