Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Datenkonvertierung
›
Startseite
manifest.json
0; }); var result = []; for (var i = 0; i < groups.length; i++) { var lines = groups[i].split('\n').filter(function(l) { return l.trim().length > 0; }); var pts = []; for (var j = 0; j < lines.length; j++) { var parts = lines[j].split(/[\s,;\t]+/).filter(function(x) { return x.length > 0; }); if (parts.length >= 2) { var label = parts.slice(0, parts.length - 1).join(' '); pts.push({ label: label, value: parseFloat(parts[parts.length - 1]) }); } else if (parts.length === 1) { pts.push({ label: '#' + (j+1), value: parseFloat(parts[0]) }); } } if (pts.length > 0) result.push(pts); } return result; } function escape(s) { return String(s).replace(/[&<>"']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } function renderRadar(groups, title) { if (groups.length === 0) return ''; var n = groups[0].length; if (n < 3 || n > 8) return ' 雷达图需要 3-8 个轴'; var W = 600, H = 500; var cx = W / 2, cy = H / 2 + 10; var r = 180; var maxV = 0; for (var i = 0; i < groups.length; i++) for (var j = 0; j < groups[i].length; j++) if (groups[i][j].value > maxV) maxV = groups[i][j].value; if (maxV === 0) maxV = 100; var labels = groups[0].map(function(p) { return p.label; }); var colors = ['#3b82f6','#ef4444','#10b981','#f59e0b','#8b5cf6','#ec4899','#06b6d4','#84cc16']; var svg = '
'; if (title) svg += '
' + escape(title) + '
'; // 同心多边形网格 for (var layer = 1; layer <= 5; layer++) { var rr = r * layer / 5; var pts = []; for (var k = 0; k < n; k++) { var a = -Math.PI / 2 + k * 2 * Math.PI / n; pts.push((cx + rr * Math.cos(a)).toFixed(1) + ',' + (cy + rr * Math.sin(a)).toFixed(1)); } svg += '
'; } // 轴线 for (var k = 0; k < n; k++) { var a = -Math.PI / 2 + k * 2 * Math.PI / n; svg += '
'; // 标签 var lx = cx + (r + 20) * Math.cos(a); var ly = cy + (r + 20) * Math.sin(a); svg += '
' + escape(labels[k]) + '
'; } // 多组数据 for (var g = 0; g < groups.length; g++) { var pts2 = []; for (var k = 0; k < n; k++) { var a = -Math.PI / 2 + k * 2 * Math.PI / n; var v = groups[g][k].value / maxV; var rr2 = r * v; pts2.push((cx + rr2 * Math.cos(a)).toFixed(1) + ',' + (cy + rr2 * Math.sin(a)).toFixed(1)); } var c = colors[g % colors.length]; svg += '
'; // 圆点 for (var m = 0; m < n; m++) { var a2 = -Math.PI / 2 + m * 2 * Math.PI / n; var v2 = groups[g][m].value / maxV; var rr3 = r * v2; svg += '
'; } } // 图例 var lx2 = 20, ly2 = 50; for (var g2 = 0; g2 < groups.length; g2++) { var c2 = colors[g2 % colors.length]; svg += '
'; svg += '
组 ' + (g2+1) + '
'; } svg += '
'; return svg; } var currentSVG = ''; function doProcess() { try { var textA = getVal('text-a'); if (!textA) { showError('请输入数据'); return; } var title = getVal('title'); var groups = parseData(textA); if (groups.length === 0) { showError('无有效数据'); return; } var svg = renderRadar(groups, title); if (svg.indexOf('') >= 0) { showError(svg); return; } currentSVG = svg; showResult(svg, '组数: ' + groups.length + ', 每组轴数: ' + groups[0].length); } catch (e) { showError('处理失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; $('btn-download').style.display = 'none'; }); $('btn-download').addEventListener('click', function() { if (!currentSVG) return; var blob = new Blob([currentSVG], { type: 'image/svg+xml' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'radar.svg'; a.click(); URL.revokeObjectURL(url); }); })();