@yfwu2020/dsh-selection-explain 0.4.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/lib/client.js +811 -26
- package/lib/index.js +88 -0
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/scripts/gen-star-path.mjs +71 -0
- package/scripts/smoke-panel.mjs +709 -1
- package/scripts/test-client.mjs +12 -2
- package/src/client/index.js +811 -26
- package/src/index.ts +92 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生成"圆点 ⇄ 星芒"的两条 SVG path(写进 src/client/index.js 的 PILL_STAR_DOT_D / PILL_STAR_D)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么是这两条:
|
|
5
|
+
* 「✦ 解读」浮标里那颗星是 16 画布上的八边形 —— 外半径 5.6、内半径 2.1213(内外比 .3788),四条边是**直线**
|
|
6
|
+
* (path: M8 2.4l1.5 4.1 4.1 1.5-4.1 1.5L8 13.6 6.5 9.5 2.4 8l4.1-1.5L8 2.4z)。
|
|
7
|
+
* 球里按 8.4/5.6 = 1.5 倍放大(墨迹 16.8px),并把"圆"和"星"都看成 32 边形逐顶点插值:
|
|
8
|
+
* · 32 个顶点按 11.25° 取样;星那条边上的取样点由射线与多边形求交得到,精确落在线段上
|
|
9
|
+
* · p=0:32 个顶点同半径 4 → 8px 圆点(8px 下与正圆无差,最大偏差 0.02px)
|
|
10
|
+
* · p=1:32 个顶点正好是星边界(尖与谷仍是精确顶点)→ 与按钮那条 path 逐点相同(仅放大 1.5 倍)
|
|
11
|
+
* 两条 path 命令结构一致(M + 31×L + Z),所以 Chrome 能对 d 做插值。
|
|
12
|
+
*
|
|
13
|
+
* 用法:node scripts/gen-star-path.mjs
|
|
14
|
+
*/
|
|
15
|
+
var TIP = 6.0 // 墨迹 12.0px = 胶囊里文字的字号(用户要求:和文字一样高)
|
|
16
|
+
var VALLEY = TIP * 0.3788
|
|
17
|
+
var SAMPLES = 32
|
|
18
|
+
|
|
19
|
+
function polar(angDeg, r) {
|
|
20
|
+
var a = (angDeg * Math.PI) / 180
|
|
21
|
+
return { x: r * Math.cos(a), y: r * Math.sin(a) }
|
|
22
|
+
}
|
|
23
|
+
function starPolygon() {
|
|
24
|
+
var pts = []
|
|
25
|
+
for (var k = 0; k < 4; k += 1) {
|
|
26
|
+
pts.push(polar(k * 90, TIP))
|
|
27
|
+
pts.push(polar(k * 90 + 45, VALLEY))
|
|
28
|
+
}
|
|
29
|
+
return pts
|
|
30
|
+
}
|
|
31
|
+
function cross(ax, ay, bx, by) { return ax * by - ay * bx }
|
|
32
|
+
function boundaryRadius(poly, angDeg) {
|
|
33
|
+
var d = polar(angDeg, 1)
|
|
34
|
+
var best = Infinity
|
|
35
|
+
for (var i = 0; i < poly.length; i += 1) {
|
|
36
|
+
var p0 = poly[i]
|
|
37
|
+
var p1 = poly[(i + 1) % poly.length]
|
|
38
|
+
var ex = p1.x - p0.x
|
|
39
|
+
var ey = p1.y - p0.y
|
|
40
|
+
var den = cross(d.x, d.y, ex, ey)
|
|
41
|
+
if (Math.abs(den) < 1e-9) continue
|
|
42
|
+
var t = cross(p0.x, p0.y, ex, ey) / den
|
|
43
|
+
var u = cross(p0.x, p0.y, d.x, d.y) / den
|
|
44
|
+
if (t > 0 && u >= -1e-6 && u <= 1 + 1e-6 && t < best) best = t
|
|
45
|
+
}
|
|
46
|
+
return best === Infinity ? 4 : best
|
|
47
|
+
}
|
|
48
|
+
function pathFor(radiusOf) {
|
|
49
|
+
var poly = starPolygon()
|
|
50
|
+
var out = []
|
|
51
|
+
for (var i = 0; i < SAMPLES; i += 1) {
|
|
52
|
+
var ang = (i * 360) / SAMPLES
|
|
53
|
+
var r = radiusOf(boundaryRadius(poly, ang))
|
|
54
|
+
var pt = polar(ang, r)
|
|
55
|
+
out.push((i ? 'L' : 'M') + round(pt.x) + ' ' + round(pt.y))
|
|
56
|
+
}
|
|
57
|
+
return out.join('') + 'Z'
|
|
58
|
+
}
|
|
59
|
+
function round(v) { return String(Math.round(v * 100) / 100) }
|
|
60
|
+
|
|
61
|
+
var DOT = pathFor(function () { return 4 })
|
|
62
|
+
var STAR = pathFor(function (r) { return r })
|
|
63
|
+
|
|
64
|
+
console.log('// p=0(8px 圆点):')
|
|
65
|
+
console.log("var PILL_STAR_DOT_D = '" + DOT + "'")
|
|
66
|
+
console.log('')
|
|
67
|
+
console.log('// p=1(按钮那颗星,放大 1.5 倍):')
|
|
68
|
+
console.log("var PILL_STAR_D = '" + STAR + "'")
|
|
69
|
+
console.log('')
|
|
70
|
+
console.log('// 长度: DOT ' + DOT.length + ' 字符, STAR ' + STAR.length + ' 字符')
|
|
71
|
+
console.log('// 命令结构一致(可插值): ' + (DOT.split(/[MLZ]/).length === STAR.split(/[MLZ]/).length))
|