{"id":45127,"date":"2026-03-30T11:31:00","date_gmt":"2026-03-30T03:31:00","guid":{"rendered":"https:\/\/www.qiusir.com\/?p=45127"},"modified":"2026-04-16T23:44:51","modified_gmt":"2026-04-16T15:44:51","slug":"qiutopia%e5%8d%ab%e6%98%9f%e8%bd%a8%e9%81%93","status":"publish","type":"post","link":"https:\/\/www.qiusir.com\/?p=45127","title":{"rendered":"qiutopIA\u536b\u661f\u8f68\u9053"},"content":{"rendered":"\n<div id=\"wp-orbit-family-v44\" style=\"position:relative;width:100%;height:750px;background-color:#050505;color:#fff;font-family:sans-serif;overflow:hidden;border-radius:12px;border:1px solid #333;user-select:none;\">\n    \n    <button id=\"btn-fs-v44\" style=\"position:absolute;bottom:25px;right:25px;z-index:100;background:rgba(15,23,42,0.8);border:1px solid rgba(255,255,255,0.3);color:#fff;padding:8px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all 0.3s;\">\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\"\/><\/svg>\n    <\/button>\n\n    <div style=\"position:absolute;top:15px;left:20px;z-index:10;pointer-events:none;\">\n        <div style=\"font-weight:bold;color:#fbbf24;font-size:15px;text-shadow:0 2px 4px #000;\">\n            \u8f68\u9053\u72b6\u6001\uff1a<span id=\"label-status-v44\" style=\"color:#fff;background:#2563eb;padding:2px 8px;border-radius:4px;margin-left:5px;\">\u521d\u59cb\u5316<\/span>\n        <\/div>\n        <div style=\"font-size:11px;color:#94a3b8;margin-top:8px;\">\n            <span style=\"color:rgba(255,255,255,0.4);\">\u25cf \u767d\u8272\u7c97\u7ebf\uff1a<\/span>\u9884\u8bbe\u8f68\u9053\u7cfb <br>\n            <span style=\"color:rgba(59,130,246,0.5);\">\u25cf \u84dd\u8272\u865a\u7ebf\uff1a<\/span>\u536b\u661f\u9884\u6d4b\u8f68\u8ff9 <br>\n            <span style=\"color:#22c55e;\">\u25cf \u7eff\u8272\u865a\u5706\uff1a<\/span>\u901f\u77e2\u56fe (Hodograph)\n        <\/div>\n    <\/div>\n\n    <div style=\"position:absolute;bottom:20px;left:10px;right:70px;z-index:50;display:flex;justify-content:center;\">\n        <div style=\"background:rgba(15,23,42,0.95);padding:12px 24px;border-radius:30px;border:1px solid rgba(255,255,255,0.2);display:flex;align-items:center;gap:15px;width:100%;max-width:500px;box-shadow:0 10px 25px #000;\">\n            <span style=\"font-size:12px;color:#94a3b8;white-space:nowrap;\">\u521d\u901f\u5ea6 v\u2080:<\/span>\n            <input type=\"range\" id=\"input-v0-v44\" min=\"0.05\" max=\"1.6\" step=\"0.01\" value=\"0.8\" style=\"flex:1;cursor:pointer;\">\n            <span id=\"display-v0-v44\" style=\"min-width:70px;font-size:14px;font-weight:bold;color:#22c55e;\">0.80 vc<\/span>\n            <button id=\"btn-reset-v44\" style=\"background:#2563eb;color:#fff;border:none;padding:6px 18px;border-radius:15px;font-weight:bold;cursor:pointer;font-size:12px;\">\u53d1\u5c04<\/button>\n        <\/div>\n    <\/div>\n\n    <canvas id=\"canvas-orbit-v44\" style=\"display:block;width:100%;height:100%;\"><\/canvas>\n\n    <script>\n    (function(){\n        var d = document;\n        var container = d.getElementById('wp-orbit-family-v44');\n        var canvas = d.getElementById('canvas-orbit-v44');\n        var ctx = canvas.getContext('2d');\n        var slider = d.getElementById('input-v0-v44');\n        var readv = d.getElementById('display-v0-v44');\n        var status = d.getElementById('label-status-v44');\n        var btnReset = d.getElementById('btn-reset-v44');\n        var btnFs = d.getElementById('btn-fs-v44');\n\n        var MU = 250000;\n        var R_PLANET = 35;\n        var L_START = 160;\n        var DT = 0.016;\n        var SCALE_V = 1.5;\n        var FORCE_SCALE = (L_START \/ 2) \/ (MU \/ (L_START * L_START));\n        \n        var sat = { x: 0, y: -L_START, vx: 0, vy: 0, trail: [], areas: [], markers: [], time: 0, period: 250, crashed: false, prediction: [] };\n        var stars = [];\n        var fam = [];\n\n        function drawArr(px, py, dx, dy, color, alpha, bold) {\n            var m = Math.sqrt(dx * dx + dy * dy);\n            if (m < 0.1) return;\n            var h = 7; if (bold) { h = 10; }\n            var a = Math.atan2(dy, dx);\n            ctx.save();\n            ctx.globalAlpha = alpha; ctx.strokeStyle = color; ctx.fillStyle = color; ctx.lineWidth = bold ? 3 : 1.5;\n            ctx.beginPath(); ctx.moveTo(px, py); ctx.lineTo(px + dx, py + dy); ctx.stroke();\n            ctx.beginPath(); ctx.moveTo(px + dx, py + dy);\n            ctx.lineTo(px + dx - h * Math.cos(a - 0.5), py + dy - h * Math.sin(a - 0.5));\n            ctx.lineTo(px + dx - h * Math.cos(a + 0.5), py + dy - h * Math.sin(a + 0.5));\n            ctx.fill(); ctx.restore();\n        }\n\n        function getStatusName(vr, en, peri) {\n            var n = \"\u692d\u5706\u8f68\u9053\";\n            if (vr <= 0.05) { n = \"\u5760\u843d\u76f4\u7ebf\"; }\n            else {\n                if (en >= 0) {\n                    if (Math.abs(vr - 1.414) < 0.03) { n = \"\u629b\u7269\u7ebf\u8f68\u9053\"; }\n                    else { n = \"\u53cc\u66f2\u7ebf\u8f68\u9053\"; }\n                } else {\n                    if (Math.abs(vr - 1.0) < 0.02) { n = \"\u5706\u8f68\u9053\"; }\n                    else {\n                        if (peri < R_PLANET) { n = \"\u5760\u843d\u692d\u5706\"; }\n                        else { n = \"\u692d\u5706\u8f68\u9053\"; }\n                    }\n                }\n            }\n            return n;\n        }\n\n        function computeOrbit(vRatio) {\n            var p = [], tx = 0, ty = -L_START;\n            var vcl = Math.sqrt(MU \/ L_START);\n            var tvx = vRatio * vcl, tvy = 0;\n            var step = 0.15;\n            for (var j = 0; j < 2000; j++) {\n                var d2 = tx * tx + ty * ty; var d = Math.sqrt(d2);\n                if (d < R_PLANET) break;\n                if (d > 4000) break;\n                var ac = MU \/ d2;\n                tvx += ac * (-tx \/ d) * step; tvy += ac * (-ty \/ d) * step;\n                tx += tvx * step; ty += tvy * step;\n                p.push({ x: tx, y: ty });\n                if (p.length > 100) {\n                    if (Math.abs(tx - 0) < 5) {\n                        if (Math.abs(ty + L_START) < 5) break;\n                    }\n                }\n            }\n            return p;\n        }\n\n        function initScene() {\n            var cw = container.clientWidth;\n            var ch = container.clientHeight;\n            canvas.width = cw; canvas.height = ch;\n            stars = [];\n            for (var i = 0; i < 150; i++) stars.push({ x: Math.random() * cw, y: Math.random() * ch, s: Math.random() * 1.5, o: Math.random() });\n            fam = [];\n            var vLevels = [0.4, 0.6, 0.8, 1.0, 1.2, 1.414, 1.55];\n            vLevels.forEach(function(vr){\n                fam.push({ path: computeOrbit(vr) });\n            });\n        }\n\n        function reset() {\n            var vr = parseFloat(slider.value);\n            readv.innerText = vr.toFixed(2) + \" vc\";\n            var vcl = Math.sqrt(MU \/ L_START);\n            var v0 = vr * vcl;\n            var en = (v0 * v0) \/ 2 - MU \/ L_START;\n            var ecc = Math.abs((L_START * v0 * v0 \/ MU) - 1);\n            var sma = (en < 0) ? -MU \/ (2 * en) : 0;\n            var peri = (en < 0) ? sma * (1 - ecc) : L_START;\n            var prd = (en < 0) ? 2 * Math.PI * Math.sqrt(Math.pow(sma, 3) \/ MU) : 500;\n\n            status.innerText = getStatusName(vr, en, peri);\n            sat = { \n                x: 0, y: -L_START, vx: v0, vy: 0, trail: [], areas: [], markers: [], \n                time: 0, period: prd, crashed: false,\n                prediction: computeOrbit(vr) \n            };\n        }\n\n        function loop() {\n            ctx.fillStyle = '#050505'; ctx.fillRect(0, 0, canvas.width, canvas.height);\n            ctx.save(); ctx.translate(canvas.width \/ 2, canvas.height \/ 2);\n\n            stars.forEach(function(s){\n                ctx.fillStyle = 'rgba(255,255,255,' + s.o + ')'; ctx.beginPath();\n                ctx.arc(s.x - canvas.width \/ 2, s.y - canvas.height \/ 2, s.s, 0, 7); ctx.fill();\n            });\n\n            \/\/ \u53c2\u8003\u8f68\u9053\u7cfb\n            fam.forEach(function(f){\n                ctx.strokeStyle = 'rgba(255,255,255,0.08)'; ctx.lineWidth = 1.5; ctx.beginPath();\n                f.path.forEach(function(p, i){ if (i === 0) ctx.moveTo(p.x, p.y); else ctx.lineTo(p.x, p.y); });\n                ctx.stroke();\n            });\n\n            \/\/ \u536b\u661f\u5b8c\u6574\u8f68\u9053\u9884\u6d4b\u663e\u793a\n            if (sat.prediction.length > 0) {\n                ctx.setLineDash([5, 8]);\n                ctx.strokeStyle = 'rgba(59, 130, 246, 0.4)';\n                ctx.lineWidth = 1;\n                ctx.beginPath();\n                sat.prediction.forEach(function(p, i){ if (i === 0) ctx.moveTo(p.x, p.y); else ctx.lineTo(p.x, p.y); });\n                ctx.stroke();\n                ctx.setLineDash([]);\n            }\n\n            ctx.fillStyle = '#1e40af'; ctx.beginPath(); ctx.arc(0, 0, R_PLANET, 0, 7); ctx.fill();\n            ctx.fillStyle = '#fff'; ctx.beginPath(); ctx.arc(0, 0, 2, 0, 7); ctx.fill();\n\n            if (!sat.crashed) {\n                var r2 = sat.x * sat.x + sat.y * sat.y; var rd = Math.sqrt(r2);\n                if (rd < R_PLANET) { sat.crashed = true; }\n                else {\n                    var ac = MU \/ r2;\n                    sat.vx += ac * (-sat.x \/ rd) * DT; sat.vy += ac * (-sat.y \/ rd) * DT;\n                    sat.x += sat.vx * DT; sat.y += sat.vy * DT;\n                    var prevT = sat.time; sat.time += DT;\n                    sat.trail.push({ x: sat.x, y: sat.y, vx: sat.vx, vy: sat.vy });\n                    if (sat.trail.length > 1000) sat.trail.shift();\n\n                    var seg = sat.period \/ 12; var curS = Math.floor(sat.time \/ seg) % 12; var preS = Math.floor(prevT \/ seg) % 12;\n                    if (curS % 2 === 0) sat.areas.push({ x: sat.x, y: sat.y, s: curS });\n                    if (curS !== preS) sat.markers.push({ x: sat.x, y: sat.y, vx: sat.vx, vy: sat.vy, ac: ac });\n                }\n            }\n\n            \/\/ \u9762\u79ef\u586b\u5145\n            ctx.fillStyle = 'rgba(59,130,246,0.12)'; var lastS = -1;\n            sat.areas.forEach(function(p){\n                if (p.s !== lastS) { if (lastS !== -1) ctx.fill(); ctx.beginPath(); ctx.moveTo(0, 0); lastS = p.s; }\n                ctx.lineTo(p.x, p.y);\n            });\n            ctx.fill();\n\n            \/\/ \u901f\u77e2\u5706 Hodograph\n            var vr = parseFloat(slider.value); var vcl = Math.sqrt(MU \/ L_START); var v_i = vr * vcl;\n            var e_cur = (v_i * v_i) \/ 2 - MU \/ L_START;\n            if (e_cur < 0) {\n                var sma = -MU \/ (2 * e_cur); var ecc = Math.abs((L_START * v_i * v_i \/ MU) - 1);\n                var vp = Math.sqrt(MU \/ sma * (1 + ecc) \/ (1 - ecc)) * SCALE_V;\n                var va = Math.sqrt(MU \/ sma * (1 - ecc) \/ (1 + ecc)) * SCALE_V;\n                var hr = (vp + va) \/ 2; var ho = (vp - va) \/ 2; var hd = (vr < 1) ? -1 : 1;\n                ctx.strokeStyle = 'rgba(34,197,94,0.3)'; ctx.setLineDash([5, 5]); ctx.beginPath();\n                ctx.arc(ho * hd, 0, hr, 0, 7); ctx.stroke(); ctx.setLineDash([]);\n            }\n\n            sat.markers.forEach(function(m){\n                var d = Math.sqrt(m.x * m.x + m.y * m.y);\n                drawArr(m.x, m.y, (-m.x \/ d) * (m.ac * FORCE_SCALE), (-m.y \/ d) * (m.ac * FORCE_SCALE), '#ef4444', 0.15, false);\n                drawArr(m.x, m.y, m.vx * SCALE_V, m.vy * SCALE_V, '#22c55e', 0.15, false);\n            });\n\n            for (var i = 1; i < sat.trail.length; i++) {\n                var alpha = i \/ sat.trail.length; var p1 = sat.trail[i - 1]; var p2 = sat.trail[i];\n                ctx.strokeStyle = 'rgba(255,255,255,' + alpha * 0.5 + ')'; ctx.lineWidth = 1.8;\n                ctx.beginPath(); ctx.moveTo(p1.x, p1.y); ctx.lineTo(p2.x, p2.y); ctx.stroke();\n                ctx.strokeStyle = 'rgba(34,197,94,' + alpha + ')'; ctx.lineWidth = 2.5;\n                ctx.beginPath(); ctx.moveTo(p1.vx * SCALE_V, p1.vy * SCALE_V); ctx.lineTo(p2.vx * SCALE_V, p2.vy * SCALE_V); ctx.stroke();\n            }\n\n            if (!sat.crashed) {\n                var dn = Math.sqrt(sat.x * sat.x + sat.y * sat.y); var am = MU \/ (dn * dn);\n                drawArr(sat.x, sat.y, (-sat.x \/ dn) * (am * FORCE_SCALE), (-sat.y \/ dn) * (am * FORCE_SCALE), '#ef4444', 1, false);\n                drawArr(sat.x, sat.y, sat.vx * SCALE_V, sat.vy * SCALE_V, '#22c55e', 1, false);\n                drawArr(0, 0, sat.vx * SCALE_V, sat.vy * SCALE_V, '#22c55e', 0.8, false);\n            }\n\n            ctx.fillStyle = '#facc15'; ctx.beginPath(); ctx.arc(0, -L_START, 6, 0, 7); ctx.fill();\n            drawArr(0, -L_START, vr * vcl * SCALE_V, 0, '#22c55e', 0.9, true);\n            drawArr(0, -L_START, 0, (MU \/ (L_START * L_START)) * FORCE_SCALE, '#ef4444', 0.9, true);\n\n            ctx.fillStyle = sat.crashed ? '#ef4444' : '#fff'; ctx.beginPath(); ctx.arc(sat.x, sat.y, 6, 0, 7); ctx.fill();\n            ctx.restore(); requestAnimationFrame(loop);\n        }\n\n        \/\/ \u5168\u5c4f\u903b\u8f91\n        btnFs.onclick = function() {\n            if (!d.fullscreenElement) {\n                container.requestFullscreen();\n            } else {\n                d.exitFullscreen();\n            }\n        };\n\n        \/\/ \u76d1\u542c\u5168\u5c4f\u53d8\u5316\u8c03\u6574\u9ad8\u5ea6\n        d.addEventListener('fullscreenchange', function() {\n            if (d.fullscreenElement) {\n                container.style.height = '100vh';\n            } else {\n                container.style.height = '750px';\n            }\n            initScene();\n        });\n\n        slider.addEventListener('input', reset); btnReset.addEventListener('click', reset);\n        window.addEventListener('resize', initScene);\n        \n        setTimeout(function(){ \n            initScene(); \n            reset(); \n            loop(); \n        }, 400);\n    })();\n    <\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u8f68\u9053\u72b6\u6001\uff1a\u521d\u59cb\u5316 \u25cf \u767d\u8272\u7c97\u7ebf\uff1a\u9884\u8bbe\u8f68\u9053\u7cfb \u25cf \u84dd\u8272\u865a\u7ebf\uff1a\u536b\u661f\u9884\u6d4b\u8f68\u8ff9 \u25cf \u7eff\u8272\u865a\u5706\uff1a\u901f\u77e2\u56fe (Hodogra &#8230; <a title=\"qiutopIA\u536b\u661f\u8f68\u9053\" class=\"read-more\" href=\"https:\/\/www.qiusir.com\/?p=45127\" aria-label=\"\u9605\u8bfb qiutopIA\u536b\u661f\u8f68\u9053\">\u9605\u8bfb\u66f4\u591a<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[5,7],"tags":[443,247],"class_list":["post-45127","post","type-post","status-publish","format-standard","hentry","category-physics","category-ict","tag-ai","tag-physics"],"_links":{"self":[{"href":"https:\/\/www.qiusir.com\/index.php?rest_route=\/wp\/v2\/posts\/45127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.qiusir.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.qiusir.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.qiusir.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.qiusir.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=45127"}],"version-history":[{"count":30,"href":"https:\/\/www.qiusir.com\/index.php?rest_route=\/wp\/v2\/posts\/45127\/revisions"}],"predecessor-version":[{"id":46050,"href":"https:\/\/www.qiusir.com\/index.php?rest_route=\/wp\/v2\/posts\/45127\/revisions\/46050"}],"wp:attachment":[{"href":"https:\/\/www.qiusir.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=45127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.qiusir.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=45127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.qiusir.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=45127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}