{"id":764,"date":"2025-11-27T22:12:40","date_gmt":"2025-11-27T14:12:40","guid":{"rendered":"https:\/\/isunnylife.space\/?p=764"},"modified":"2025-11-28T21:09:06","modified_gmt":"2025-11-28T13:09:06","slug":"%e7%84%93%e6%b9%bf%e9%87%8f%e8%ae%a1%e7%ae%97final","status":"publish","type":"post","link":"https:\/\/isunnylife.space\/?p=764","title":{"rendered":"\u7113\u6e7f\u91cf\u8ba1\u7b97Final"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"764\" class=\"elementor elementor-764\">\n\t\t\t\t<div class=\"elementor-element elementor-element-24ba7e7 e-con-full e-flex e-con e-parent\" data-id=\"24ba7e7\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ae8a62f elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"ae8a62f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<meta name='viewport' content='width=device-width, initial-scale=1'\/><!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>\u52a8\u6001\u7113\u6e7f\u56fe\u8ba1\u7b97\u5668 (\u53cc\u5217\u5e03\u5c40\u7248)<\/title>\r\n    <style>\r\n        * { margin: 0; padding: 0; box-sizing: border-box; }\r\n        body {\r\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\r\n            background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\r\n            padding: 20px;\r\n            min-height: 100vh;\r\n            color: #1f2937;\r\n        }\r\n        .container { max-width: 1400px; margin: 0 auto; }\r\n        \r\n        \/* \u5e03\u5c40\u7ed3\u6784 *\/\r\n        .main-layout {\r\n            display: grid;\r\n            grid-template-columns: 360px 1fr;\r\n            gap: 20px;\r\n            align-items: start;\r\n        }\r\n\r\n        \/* \u5361\u7247\u6837\u5f0f *\/\r\n        .card {\r\n            background: white;\r\n            border-radius: 16px;\r\n            box-shadow: 0 10px 25px rgba(0,0,0,0.05);\r\n            padding: 20px;\r\n            overflow: hidden;\r\n        }\r\n\r\n        \/* \u5934\u90e8 *\/\r\n        .header {\r\n            grid-column: 1 \/ -1;\r\n            background: linear-gradient(135deg, #2563eb 0%, #0891b2 100%);\r\n            color: white;\r\n            padding: 20px 30px;\r\n            border-radius: 16px;\r\n            margin-bottom: 20px;\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n        }\r\n        .header h1 { font-size: 24px; margin-bottom: 5px; }\r\n        .header p { opacity: 0.8; font-size: 14px; }\r\n\r\n        \/* \u8f93\u5165\u63a7\u4ef6 *\/\r\n        .input-group { margin-bottom: 20px; }\r\n        .input-label { display: block; font-weight: 600; margin-bottom: 8px; font-size: 14px; color: #4b5563; }\r\n        .input-row { display: flex; align-items: center; gap: 10px; }\r\n        .input-field {\r\n            width: 80px; padding: 8px; border: 1px solid #d1d5db; border-radius: 6px;\r\n            font-size: 16px; text-align: center;\r\n        }\r\n        .slider { flex: 1; accent-color: #2563eb; cursor: pointer; }\r\n\r\n        \/* --- \u6838\u5fc3\u4fee\u6539\uff1a\u7ed3\u679c\u5217\u8868 (\u4e00\u884c\u4e24\u4e2a) --- *\/\r\n        .result-grid {\r\n            display: grid;\r\n            grid-template-columns: 1fr 1fr; \/* \u5f3a\u5236\u4e24\u5217 *\/\r\n            gap: 12px; \/* \u589e\u52a0\u95f4\u8ddd *\/\r\n            background: #f1f5f9;\r\n            padding: 15px;\r\n            border-radius: 12px;\r\n            margin-top: 20px;\r\n        }\r\n        \r\n        .result-item {\r\n            display: flex;\r\n            flex-direction: column; \/* \u4e0a\u4e0b\u6392\u5217\uff0c\u66f4\u9002\u5408\u5c0f\u7a7a\u95f4 *\/\r\n            padding: 10px;\r\n            border-radius: 8px;\r\n            border: 1px solid #e2e8f0;\r\n        }\r\n\r\n        .res-label { \r\n            font-size: 12px; \r\n            color: #64748b; \r\n            margin-bottom: 4px;\r\n        }\r\n        \r\n        .res-val { \r\n            font-weight: 700; \r\n            color: #0f172a; \r\n            font-family: monospace; \r\n            font-size: 16px; \r\n        }\r\n        \r\n        .res-val small {\r\n            font-size: 11px;\r\n            color: #94a3b8;\r\n            font-weight: normal;\r\n            margin-left: 2px;\r\n        }\r\n\r\n        \/* --- \u65b0\u589e\uff1a\u5dee\u5f02\u5316\u80cc\u666f\u8272 --- *\/\r\n        .result-item.item-d { background: linear-gradient(90deg, #e0f7fa, #b2ebf2); }\r\n        .result-item.item-h { background: linear-gradient(90deg, #fff3e0, #ffe0b2); }\r\n        .result-item.item-td { background: linear-gradient(90deg, #f3e5f5, #ce93d8); }\r\n        .result-item.item-tw { background: linear-gradient(90deg, #e8f5e8, #c8e6c9); }\r\n        .result-item.item-pw { background: linear-gradient(90deg, #fff8e1, #ffecb3); }\r\n        .result-item.item-rho { background: linear-gradient(90deg, #fce4ec, #f48fb1); }\r\n        \/* --- \u80cc\u666f\u8272\u5b9a\u4e49\u7ed3\u675f --- *\/\r\n\r\n        \/* \u753b\u5e03\u533a\u57df *\/\r\n        .chart-container {\r\n            position: relative;\r\n            height: 600px;\r\n            background: white;\r\n            border-radius: 16px;\r\n            border: 1px solid #e2e8f0;\r\n        }\r\n        canvas {\r\n            width: 100%;\r\n            height: 100%;\r\n            display: block;\r\n        }\r\n        .chart-overlay {\r\n            position: absolute; top: 20px; right: 20px;\r\n            background: rgba(255,255,255,0.95);\r\n            padding: 12px; border-radius: 8px;\r\n            border: 1px solid #cbd5e1;\r\n            font-size: 12px; pointer-events: none;\r\n            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\r\n        }\r\n\r\n        \/* \u54cd\u5e94\u5f0f *\/\r\n        @media (max-width: 1000px) {\r\n            .main-layout { grid-template-columns: 1fr; }\r\n            .chart-container { height: 400px; }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div class=\"container\">\r\n    <div class=\"header\">\r\n        <div>\r\n            <h1>Web \u7113\u6e7f\u56fe\u53ef\u89c6\u5316<\/h1>\r\n            <p>Psychrometric Chart Generator<\/p>\r\n        <\/div>\r\n        <div style=\"text-align: right; font-size: 12px; opacity: 0.8;\">\r\n            \u57fa\u4e8e\u6807\u51c6\u5927\u6c14\u538b (101.3 kPa)\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"main-layout\">\r\n        <div class=\"card\">\r\n            <h3>\u53c2\u6570\u8bbe\u7f6e<\/h3>\r\n            <hr style=\"border: 0; border-top: 1px solid #eee; margin: 15px 0;\">\r\n\r\n            <div class=\"input-group\">\r\n                <label class=\"input-label\">\u5e72\u7403\u6e29\u5ea6 (\u00b0C)<\/label>\r\n                <div class=\"input-row\">\r\n                    <input type=\"range\" id=\"sliderT\" class=\"slider\" min=\"-10\" max=\"50\" step=\"0.5\" value=\"25\">\r\n                    <input type=\"number\" id=\"inputT\" class=\"input-field\" value=\"25\">\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"input-group\">\r\n                <label class=\"input-label\">\u76f8\u5bf9\u6e7f\u5ea6 (%)<\/label>\r\n                <div class=\"input-row\">\r\n                    <input type=\"range\" id=\"sliderRH\" class=\"slider\" min=\"0\" max=\"100\" step=\"1\" value=\"50\">\r\n                    <input type=\"number\" id=\"inputRH\" class=\"input-field\" value=\"50\">\r\n                <\/div>\r\n            <\/div>\r\n            \r\n            <div style=\"font-size:12px; color:#999; margin-top:5px;\">\r\n                * \u62d6\u52a8\u6ed1\u5757\uff0c\u56fe\u8868\u7ea2\u70b9\u5b9e\u65f6\u79fb\u52a8\r\n            <\/div>\r\n\r\n            <div class=\"result-grid\">\r\n                <div class=\"result-item item-d\">\r\n                    <span class=\"res-label\">\u542b\u6e7f\u91cf (d)<\/span> \r\n                    <span class=\"res-val\"><span id=\"valD\">0<\/span><small>g\/kg<\/small><\/span>\r\n                <\/div>\r\n                <div class=\"result-item item-h\">\r\n                    <span class=\"res-label\">\u7113\u503c (h)<\/span> \r\n                    <span class=\"res-val\"><span id=\"valH\">0<\/span><small>kJ\/kg<\/small><\/span>\r\n                <\/div>\r\n                <div class=\"result-item item-td\">\r\n                    <span class=\"res-label\">\u9732\u70b9\u6e29\u5ea6<\/span> \r\n                    <span class=\"res-val\"><span id=\"valTd\">0<\/span><small>\u00b0C<\/small><\/span>\r\n                <\/div>\r\n                <div class=\"result-item item-tw\">\r\n                    <span class=\"res-label\">\u6e7f\u7403\u6e29\u5ea6<\/span> \r\n                    <span class=\"res-val\"><span id=\"valTw\">0<\/span><small>\u00b0C<\/small><\/span>\r\n                <\/div>\r\n                <div class=\"result-item item-pw\">\r\n                    <span class=\"res-label\">\u6c34\u84b8\u6c14\u5206\u538b<\/span> \r\n                    <span class=\"res-val\"><span id=\"valPw\">0<\/span><small>kPa<\/small><\/span>\r\n                <\/div>\r\n                <div class=\"result-item item-rho\">\r\n                    <span class=\"res-label\">\u7a7a\u6c14\u5bc6\u5ea6<\/span> \r\n                    <span class=\"res-val\"><span id=\"valRho\">0<\/span><small>kg\/m\u00b3<\/small><\/span>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"card chart-container\">\r\n            <canvas id=\"psyChart\"><\/canvas>\r\n            <div class=\"chart-overlay\">\r\n                <div style=\"margin-bottom:4px;\"><span style=\"color:#2563eb; font-weight:bold;\">\u2501<\/span> \u9971\u548c\u7ebf (100%)<\/div>\r\n                <div style=\"margin-bottom:4px;\"><span style=\"color:#93c5fd; font-weight:bold;\">\u2501<\/span> \u76f8\u5bf9\u6e7f\u5ea6\u7ebf<\/div>\r\n                <div><span style=\"color:#ef4444; font-weight:bold;\">\u25cf<\/span> \u5f53\u524d\u72b6\u6001\u70b9<\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\n    \/\/ --- \u7269\u7406\u8ba1\u7b97\u6838\u5fc3 (Math Core) ---\r\n    const P_ATM = 101.325; \/\/ \u6807\u51c6\u5927\u6c14\u538b kPa\r\n\r\n    function getSatPressure(t) {\r\n        return 0.61078 * Math.exp((17.27 * t) \/ (t + 237.3));\r\n    }\r\n\r\n    function calcState(t, rh) {\r\n        const Ps = getSatPressure(t);\r\n        const Pw = (rh \/ 100) * Ps;\r\n        \r\n        let d = 0;\r\n        if (P_ATM > Pw) {\r\n            d = 622 * Pw \/ (P_ATM - Pw);\r\n        }\r\n\r\n        let td = t;\r\n        if (Pw > 0) {\r\n           const alpha = Math.log(Pw\/0.61078);\r\n           td = (237.3 * alpha) \/ (17.27 - alpha);\r\n        }\r\n\r\n        const h = 1.005 * t + (d\/1000) * (2501 + 1.86 * t);\r\n\r\n        const tw = t * Math.atan(0.151977 * Math.sqrt(rh + 8.313659)) +\r\n                   Math.atan(t + rh) - Math.atan(rh - 1.676331) +\r\n                   0.00391838 * Math.pow(rh, 1.5) * Math.atan(0.023101 * rh) - 4.686035;\r\n\r\n        const v = (0.287 * (t + 273.15) * (1 + 1.6078 * (d\/1000))) \/ P_ATM;\r\n        const rho = 1\/v;\r\n\r\n        return { d, h, td, tw, Pw, rho };\r\n    }\r\n\r\n    \/\/ --- \u7ed8\u56fe\u5f15\u64ce (Drawing Engine) ---\r\n    const canvas = document.getElementById('psyChart');\r\n    const ctx = canvas.getContext('2d');\r\n    \r\n    const CHART_MIN_T = -10;\r\n    const CHART_MAX_T = 55;\r\n    const CHART_MIN_D = 0;\r\n    const CHART_MAX_D = 35;\r\n\r\n    let width, height, padding = { top: 30, right: 50, bottom: 50, left: 60 };\r\n\r\n    function mapX(t) {\r\n        return padding.left + (t - CHART_MIN_T) \/ (CHART_MAX_T - CHART_MIN_T) * (width - padding.left - padding.right);\r\n    }\r\n\r\n    function mapY(d) {\r\n        return height - padding.bottom - (d - CHART_MIN_D) \/ (CHART_MAX_D - CHART_MIN_D) * (height - padding.top - padding.bottom);\r\n    }\r\n\r\n    function drawChart() {\r\n        const dpr = window.devicePixelRatio || 1;\r\n        const rect = canvas.parentElement.getBoundingClientRect();\r\n        canvas.width = rect.width * dpr;\r\n        canvas.height = rect.height * dpr;\r\n        ctx.scale(dpr, dpr);\r\n        width = rect.width;\r\n        height = rect.height;\r\n\r\n        ctx.clearRect(0, 0, width, height);\r\n        ctx.font = \"12px sans-serif\";\r\n\r\n        \/\/ \u7f51\u683c\r\n        ctx.strokeStyle = \"#e2e8f0\";\r\n        ctx.lineWidth = 1;\r\n        ctx.beginPath();\r\n        for (let t = CHART_MIN_T; t <= CHART_MAX_T; t += 5) {\r\n            const x = mapX(t);\r\n            ctx.moveTo(x, padding.top);\r\n            ctx.lineTo(x, height - padding.bottom);\r\n            ctx.fillStyle = \"#64748b\";\r\n            ctx.fillText(t + \"\u00b0\", x - 10, height - padding.bottom + 20);\r\n        }\r\n        for (let d = 0; d <= CHART_MAX_D; d += 5) {\r\n            const y = mapY(d);\r\n            ctx.moveTo(padding.left, y);\r\n            ctx.lineTo(width - padding.right, y);\r\n            ctx.fillStyle = \"#64748b\";\r\n            ctx.fillText(d, padding.left - 25, y + 4);\r\n        }\r\n        ctx.stroke();\r\n\r\n        \/\/ \u8f74\u6807\u7b7e\r\n        ctx.save();\r\n        ctx.fillStyle = \"#1e293b\";\r\n        ctx.font = \"bold 14px sans-serif\";\r\n        ctx.fillText(\"\u5e72\u7403\u6e29\u5ea6 (\u00b0C)\", width \/ 2 - 40, height - 10);\r\n        ctx.translate(20, height \/ 2);\r\n        ctx.rotate(-Math.PI \/ 2);\r\n        ctx.fillText(\"\u542b\u6e7f\u91cf (g\/kg)\", -40, 0);\r\n        ctx.restore();\r\n\r\n        \/\/ \u66f2\u7ebf\r\n        const humidities = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\r\n        humidities.forEach(rh => {\r\n            ctx.beginPath();\r\n            ctx.lineWidth = rh === 100 ? 2.5 : 1;\r\n            ctx.strokeStyle = rh === 100 ? \"#2563eb\" : \"rgba(37, 99, 235, 0.3)\";\r\n            let started = false;\r\n            for (let t = CHART_MIN_T; t <= CHART_MAX_T; t += 0.5) {\r\n                const res = calcState(t, rh);\r\n                const x = mapX(t);\r\n                const y = mapY(res.d);\r\n                if (res.d > CHART_MAX_D) continue;\r\n                if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\r\n            }\r\n            ctx.stroke();\r\n            if(rh % 20 === 0 || rh === 100) {\r\n                 const labelT = 30;\r\n                 const res = calcState(labelT, rh);\r\n                 if(res.d < CHART_MAX_D) {\r\n                    ctx.fillStyle = \"#2563eb\";\r\n                    ctx.fillText(rh + \"%\", mapX(labelT) + 2, mapY(res.d) - 2);\r\n                 }\r\n            }\r\n        });\r\n\r\n        \/\/ \u72b6\u6001\u70b9\r\n        const currT = parseFloat(elInputT.value);\r\n        const currRH = parseFloat(elInputRH.value);\r\n        const currState = calcState(currT, currRH);\r\n\r\n        document.getElementById('valD').innerText = currState.d.toFixed(2);\r\n        document.getElementById('valH').innerText = currState.h.toFixed(2);\r\n        document.getElementById('valTd').innerText = currState.td.toFixed(2);\r\n        document.getElementById('valTw').innerText = currState.tw.toFixed(2);\r\n        document.getElementById('valPw').innerText = currState.Pw.toFixed(3);\r\n        document.getElementById('valRho').innerText = currState.rho.toFixed(3);\r\n\r\n        const ptX = mapX(currT);\r\n        const ptY = mapY(currState.d);\r\n\r\n        ctx.beginPath();\r\n        ctx.setLineDash([5, 5]);\r\n        ctx.strokeStyle = \"#ef4444\";\r\n        ctx.lineWidth = 1;\r\n        ctx.moveTo(ptX, ptY);\r\n        ctx.lineTo(ptX, height - padding.bottom);\r\n        ctx.moveTo(ptX, ptY);\r\n        ctx.lineTo(width - padding.right, ptY);\r\n        ctx.stroke();\r\n        ctx.setLineDash([]);\r\n\r\n        ctx.beginPath();\r\n        ctx.arc(ptX, ptY, 6, 0, Math.PI * 2);\r\n        ctx.fillStyle = \"#ef4444\";\r\n        ctx.fill();\r\n        ctx.strokeStyle = \"white\";\r\n        ctx.lineWidth = 2;\r\n        ctx.stroke();\r\n        \r\n        ctx.fillStyle = \"#ef4444\";\r\n        ctx.font = \"bold 12px sans-serif\";\r\n        ctx.fillText(`(${currT}\u00b0C, ${currState.d.toFixed(1)}g)`, ptX + 10, ptY - 10);\r\n    }\r\n\r\n    const elSliderT = document.getElementById('sliderT');\r\n    const elInputT = document.getElementById('inputT');\r\n    const elSliderRH = document.getElementById('sliderRH');\r\n    const elInputRH = document.getElementById('inputRH');\r\n\r\n    function update() { elInputT.value = elSliderT.value; elInputRH.value = elSliderRH.value; drawChart(); }\r\n    function updateFromInput() { elSliderT.value = elInputT.value; elSliderRH.value = elInputRH.value; drawChart(); }\r\n\r\n    elSliderT.addEventListener('input', update);\r\n    elInputT.addEventListener('input', updateFromInput);\r\n    elSliderRH.addEventListener('input', update);\r\n    elInputRH.addEventListener('input', updateFromInput);\r\n    window.addEventListener('resize', drawChart);\r\n    drawChart();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u52a8\u6001\u7113\u6e7f\u56fe\u8ba1\u7b97\u5668 (\u53cc\u5217\u5e03\u5c40\u7248) Web [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-764","post","type-post","status-publish","format-standard","hentry","category-1"],"spectra_custom_meta":{"surerank_seo_checks":["a:13:{s:14:\"h2_subheadings\";a:3:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:38:\"Page contains at least one subheading.\";s:4:\"type\";s:4:\"page\";}s:13:\"media_present\";a:3:{s:6:\"status\";s:7:\"warning\";s:7:\"message\";s:39:\"No images or videos found on this page.\";s:4:\"type\";s:4:\"page\";}s:13:\"links_present\";a:3:{s:6:\"status\";s:7:\"warning\";s:7:\"message\";s:27:\"No links found on the page.\";s:4:\"type\";s:4:\"page\";}s:10:\"url_length\";a:3:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:35:\"Page URL is short and SEO-friendly.\";s:4:\"type\";s:4:\"page\";}s:19:\"search_engine_title\";a:3:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:55:\"Search engine title is present and under 60 characters.\";s:4:\"type\";s:4:\"page\";}s:25:\"search_engine_description\";a:3:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:62:\"Search engine description is present and under 160 characters.\";s:4:\"type\";s:4:\"page\";}s:13:\"canonical_url\";a:3:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:37:\"Canonical tag is present on the page.\";s:4:\"type\";s:4:\"page\";}s:15:\"open_graph_tags\";a:3:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:40:\"Open Graph tags are present on the page.\";s:4:\"type\";s:4:\"page\";}s:16:\"keyword_in_title\";a:3:{s:6:\"status\";s:10:\"suggestion\";s:7:\"message\";s:38:\"No focus keyword set to analyze title.\";s:4:\"type\";s:7:\"keyword\";}s:22:\"keyword_in_description\";a:3:{s:6:\"status\";s:10:\"suggestion\";s:7:\"message\";s:49:\"No focus keyword set to analyze meta description.\";s:4:\"type\";s:7:\"keyword\";}s:14:\"keyword_in_url\";a:3:{s:6:\"status\";s:10:\"suggestion\";s:7:\"message\";s:36:\"No focus keyword set to analyze URL.\";s:4:\"type\";s:7:\"keyword\";}s:18:\"keyword_in_content\";a:3:{s:6:\"status\";s:10:\"suggestion\";s:7:\"message\";s:40:\"No focus keyword set to analyze content.\";s:4:\"type\";s:7:\"keyword\";}s:12:\"broken_links\";a:2:{s:6:\"status\";s:7:\"success\";s:7:\"message\";s:34:\"No broken links found on the page.\";}}"],"surerank_seo_checks_last_updated":["1764335346"],"_edit_lock":["1764595268:1"],"_edit_last":["1"],"_elementor_edit_mode":["builder"],"_elementor_template_type":["wp-post"],"_wp_page_template":["elementor_header_footer"],"_elementor_data":["[{\"id\":\"24ba7e7\",\"elType\":\"container\",\"settings\":{\"content_width\":\"full\",\"width\":{\"unit\":\"px\",\"size\":705},\"min_height\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_flex_size\":\"none\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"0ecf0a3\"}],\"_element_width\":\"initial\"},\"elements\":[{\"id\":\"ae8a62f\",\"elType\":\"widget\",\"settings\":{\"html\":\"<meta name='viewport' content='width=device-width, initial-scale=1'\\\/><!DOCTYPE html>\\r\\n<html lang=\\\"zh-CN\\\">\\r\\n<head>\\r\\n    <meta charset=\\\"UTF-8\\\">\\r\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\r\\n    <title>\\u52a8\\u6001\\u7113\\u6e7f\\u56fe\\u8ba1\\u7b97\\u5668 (\\u53cc\\u5217\\u5e03\\u5c40\\u7248)<\\\/title>\\r\\n    <style>\\r\\n        * { margin: 0; padding: 0; box-sizing: border-box; }\\r\\n        body {\\r\\n            font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, Arial, sans-serif;\\r\\n            background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\\r\\n            padding: 20px;\\r\\n            min-height: 100vh;\\r\\n            color: #1f2937;\\r\\n        }\\r\\n        .container { max-width: 1400px; margin: 0 auto; }\\r\\n        \\r\\n        \\\/* \\u5e03\\u5c40\\u7ed3\\u6784 *\\\/\\r\\n        .main-layout {\\r\\n            display: grid;\\r\\n            grid-template-columns: 360px 1fr;\\r\\n            gap: 20px;\\r\\n            align-items: start;\\r\\n        }\\r\\n\\r\\n        \\\/* \\u5361\\u7247\\u6837\\u5f0f *\\\/\\r\\n        .card {\\r\\n            background: white;\\r\\n            border-radius: 16px;\\r\\n            box-shadow: 0 10px 25px rgba(0,0,0,0.05);\\r\\n            padding: 20px;\\r\\n            overflow: hidden;\\r\\n        }\\r\\n\\r\\n        \\\/* \\u5934\\u90e8 *\\\/\\r\\n        .header {\\r\\n            grid-column: 1 \\\/ -1;\\r\\n            background: linear-gradient(135deg, #2563eb 0%, #0891b2 100%);\\r\\n            color: white;\\r\\n            padding: 20px 30px;\\r\\n            border-radius: 16px;\\r\\n            margin-bottom: 20px;\\r\\n            display: flex;\\r\\n            justify-content: space-between;\\r\\n            align-items: center;\\r\\n        }\\r\\n        .header h1 { font-size: 24px; margin-bottom: 5px; }\\r\\n        .header p { opacity: 0.8; font-size: 14px; }\\r\\n\\r\\n        \\\/* \\u8f93\\u5165\\u63a7\\u4ef6 *\\\/\\r\\n        .input-group { margin-bottom: 20px; }\\r\\n        .input-label { display: block; font-weight: 600; margin-bottom: 8px; font-size: 14px; color: #4b5563; }\\r\\n        .input-row { display: flex; align-items: center; gap: 10px; }\\r\\n        .input-field {\\r\\n            width: 80px; padding: 8px; border: 1px solid #d1d5db; border-radius: 6px;\\r\\n            font-size: 16px; text-align: center;\\r\\n        }\\r\\n        .slider { flex: 1; accent-color: #2563eb; cursor: pointer; }\\r\\n\\r\\n        \\\/* --- \\u6838\\u5fc3\\u4fee\\u6539\\uff1a\\u7ed3\\u679c\\u5217\\u8868 (\\u4e00\\u884c\\u4e24\\u4e2a) --- *\\\/\\r\\n        .result-grid {\\r\\n            display: grid;\\r\\n            grid-template-columns: 1fr 1fr; \\\/* \\u5f3a\\u5236\\u4e24\\u5217 *\\\/\\r\\n            gap: 12px; \\\/* \\u589e\\u52a0\\u95f4\\u8ddd *\\\/\\r\\n            background: #f1f5f9;\\r\\n            padding: 15px;\\r\\n            border-radius: 12px;\\r\\n            margin-top: 20px;\\r\\n        }\\r\\n        \\r\\n        .result-item {\\r\\n            display: flex;\\r\\n            flex-direction: column; \\\/* \\u4e0a\\u4e0b\\u6392\\u5217\\uff0c\\u66f4\\u9002\\u5408\\u5c0f\\u7a7a\\u95f4 *\\\/\\r\\n            padding: 10px;\\r\\n            border-radius: 8px;\\r\\n            border: 1px solid #e2e8f0;\\r\\n        }\\r\\n\\r\\n        .res-label { \\r\\n            font-size: 12px; \\r\\n            color: #64748b; \\r\\n            margin-bottom: 4px;\\r\\n        }\\r\\n        \\r\\n        .res-val { \\r\\n            font-weight: 700; \\r\\n            color: #0f172a; \\r\\n            font-family: monospace; \\r\\n            font-size: 16px; \\r\\n        }\\r\\n        \\r\\n        .res-val small {\\r\\n            font-size: 11px;\\r\\n            color: #94a3b8;\\r\\n            font-weight: normal;\\r\\n            margin-left: 2px;\\r\\n        }\\r\\n\\r\\n        \\\/* --- \\u65b0\\u589e\\uff1a\\u5dee\\u5f02\\u5316\\u80cc\\u666f\\u8272 --- *\\\/\\r\\n        .result-item.item-d { background: linear-gradient(90deg, #e0f7fa, #b2ebf2); }\\r\\n        .result-item.item-h { background: linear-gradient(90deg, #fff3e0, #ffe0b2); }\\r\\n        .result-item.item-td { background: linear-gradient(90deg, #f3e5f5, #ce93d8); }\\r\\n        .result-item.item-tw { background: linear-gradient(90deg, #e8f5e8, #c8e6c9); }\\r\\n        .result-item.item-pw { background: linear-gradient(90deg, #fff8e1, #ffecb3); }\\r\\n        .result-item.item-rho { background: linear-gradient(90deg, #fce4ec, #f48fb1); }\\r\\n        \\\/* --- \\u80cc\\u666f\\u8272\\u5b9a\\u4e49\\u7ed3\\u675f --- *\\\/\\r\\n\\r\\n        \\\/* \\u753b\\u5e03\\u533a\\u57df *\\\/\\r\\n        .chart-container {\\r\\n            position: relative;\\r\\n            height: 600px;\\r\\n            background: white;\\r\\n            border-radius: 16px;\\r\\n            border: 1px solid #e2e8f0;\\r\\n        }\\r\\n        canvas {\\r\\n            width: 100%;\\r\\n            height: 100%;\\r\\n            display: block;\\r\\n        }\\r\\n        .chart-overlay {\\r\\n            position: absolute; top: 20px; right: 20px;\\r\\n            background: rgba(255,255,255,0.95);\\r\\n            padding: 12px; border-radius: 8px;\\r\\n            border: 1px solid #cbd5e1;\\r\\n            font-size: 12px; pointer-events: none;\\r\\n            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\\r\\n        }\\r\\n\\r\\n        \\\/* \\u54cd\\u5e94\\u5f0f *\\\/\\r\\n        @media (max-width: 1000px) {\\r\\n            .main-layout { grid-template-columns: 1fr; }\\r\\n            .chart-container { height: 400px; }\\r\\n        }\\r\\n    <\\\/style>\\r\\n<\\\/head>\\r\\n<body>\\r\\n\\r\\n<div class=\\\"container\\\">\\r\\n    <div class=\\\"header\\\">\\r\\n        <div>\\r\\n            <h1>Web \\u7113\\u6e7f\\u56fe\\u53ef\\u89c6\\u5316<\\\/h1>\\r\\n            <p>Psychrometric Chart Generator<\\\/p>\\r\\n        <\\\/div>\\r\\n        <div style=\\\"text-align: right; font-size: 12px; opacity: 0.8;\\\">\\r\\n            \\u57fa\\u4e8e\\u6807\\u51c6\\u5927\\u6c14\\u538b (101.3 kPa)\\r\\n        <\\\/div>\\r\\n    <\\\/div>\\r\\n\\r\\n    <div class=\\\"main-layout\\\">\\r\\n        <div class=\\\"card\\\">\\r\\n            <h3>\\u53c2\\u6570\\u8bbe\\u7f6e<\\\/h3>\\r\\n            <hr style=\\\"border: 0; border-top: 1px solid #eee; margin: 15px 0;\\\">\\r\\n\\r\\n            <div class=\\\"input-group\\\">\\r\\n                <label class=\\\"input-label\\\">\\u5e72\\u7403\\u6e29\\u5ea6 (\\u00b0C)<\\\/label>\\r\\n                <div class=\\\"input-row\\\">\\r\\n                    <input type=\\\"range\\\" id=\\\"sliderT\\\" class=\\\"slider\\\" min=\\\"-10\\\" max=\\\"50\\\" step=\\\"0.5\\\" value=\\\"25\\\">\\r\\n                    <input type=\\\"number\\\" id=\\\"inputT\\\" class=\\\"input-field\\\" value=\\\"25\\\">\\r\\n                <\\\/div>\\r\\n            <\\\/div>\\r\\n\\r\\n            <div class=\\\"input-group\\\">\\r\\n                <label class=\\\"input-label\\\">\\u76f8\\u5bf9\\u6e7f\\u5ea6 (%)<\\\/label>\\r\\n                <div class=\\\"input-row\\\">\\r\\n                    <input type=\\\"range\\\" id=\\\"sliderRH\\\" class=\\\"slider\\\" min=\\\"0\\\" max=\\\"100\\\" step=\\\"1\\\" value=\\\"50\\\">\\r\\n                    <input type=\\\"number\\\" id=\\\"inputRH\\\" class=\\\"input-field\\\" value=\\\"50\\\">\\r\\n                <\\\/div>\\r\\n            <\\\/div>\\r\\n            \\r\\n            <div style=\\\"font-size:12px; color:#999; margin-top:5px;\\\">\\r\\n                * \\u62d6\\u52a8\\u6ed1\\u5757\\uff0c\\u56fe\\u8868\\u7ea2\\u70b9\\u5b9e\\u65f6\\u79fb\\u52a8\\r\\n            <\\\/div>\\r\\n\\r\\n            <div class=\\\"result-grid\\\">\\r\\n                <div class=\\\"result-item item-d\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u542b\\u6e7f\\u91cf (d)<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valD\\\">0<\\\/span><small>g\\\/kg<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-h\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u7113\\u503c (h)<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valH\\\">0<\\\/span><small>kJ\\\/kg<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-td\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u9732\\u70b9\\u6e29\\u5ea6<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valTd\\\">0<\\\/span><small>\\u00b0C<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-tw\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u6e7f\\u7403\\u6e29\\u5ea6<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valTw\\\">0<\\\/span><small>\\u00b0C<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-pw\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u6c34\\u84b8\\u6c14\\u5206\\u538b<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valPw\\\">0<\\\/span><small>kPa<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-rho\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u7a7a\\u6c14\\u5bc6\\u5ea6<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valRho\\\">0<\\\/span><small>kg\\\/m\\u00b3<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n            <\\\/div>\\r\\n        <\\\/div>\\r\\n\\r\\n        <div class=\\\"card chart-container\\\">\\r\\n            <canvas id=\\\"psyChart\\\"><\\\/canvas>\\r\\n            <div class=\\\"chart-overlay\\\">\\r\\n                <div style=\\\"margin-bottom:4px;\\\"><span style=\\\"color:#2563eb; font-weight:bold;\\\">\\u2501<\\\/span> \\u9971\\u548c\\u7ebf (100%)<\\\/div>\\r\\n                <div style=\\\"margin-bottom:4px;\\\"><span style=\\\"color:#93c5fd; font-weight:bold;\\\">\\u2501<\\\/span> \\u76f8\\u5bf9\\u6e7f\\u5ea6\\u7ebf<\\\/div>\\r\\n                <div><span style=\\\"color:#ef4444; font-weight:bold;\\\">\\u25cf<\\\/span> \\u5f53\\u524d\\u72b6\\u6001\\u70b9<\\\/div>\\r\\n            <\\\/div>\\r\\n        <\\\/div>\\r\\n    <\\\/div>\\r\\n<\\\/div>\\r\\n\\r\\n<script>\\r\\n    \\\/\\\/ --- \\u7269\\u7406\\u8ba1\\u7b97\\u6838\\u5fc3 (Math Core) ---\\r\\n    const P_ATM = 101.325; \\\/\\\/ \\u6807\\u51c6\\u5927\\u6c14\\u538b kPa\\r\\n\\r\\n    function getSatPressure(t) {\\r\\n        return 0.61078 * Math.exp((17.27 * t) \\\/ (t + 237.3));\\r\\n    }\\r\\n\\r\\n    function calcState(t, rh) {\\r\\n        const Ps = getSatPressure(t);\\r\\n        const Pw = (rh \\\/ 100) * Ps;\\r\\n        \\r\\n        let d = 0;\\r\\n        if (P_ATM > Pw) {\\r\\n            d = 622 * Pw \\\/ (P_ATM - Pw);\\r\\n        }\\r\\n\\r\\n        let td = t;\\r\\n        if (Pw > 0) {\\r\\n           const alpha = Math.log(Pw\\\/0.61078);\\r\\n           td = (237.3 * alpha) \\\/ (17.27 - alpha);\\r\\n        }\\r\\n\\r\\n        const h = 1.005 * t + (d\\\/1000) * (2501 + 1.86 * t);\\r\\n\\r\\n        const tw = t * Math.atan(0.151977 * Math.sqrt(rh + 8.313659)) +\\r\\n                   Math.atan(t + rh) - Math.atan(rh - 1.676331) +\\r\\n                   0.00391838 * Math.pow(rh, 1.5) * Math.atan(0.023101 * rh) - 4.686035;\\r\\n\\r\\n        const v = (0.287 * (t + 273.15) * (1 + 1.6078 * (d\\\/1000))) \\\/ P_ATM;\\r\\n        const rho = 1\\\/v;\\r\\n\\r\\n        return { d, h, td, tw, Pw, rho };\\r\\n    }\\r\\n\\r\\n    \\\/\\\/ --- \\u7ed8\\u56fe\\u5f15\\u64ce (Drawing Engine) ---\\r\\n    const canvas = document.getElementById('psyChart');\\r\\n    const ctx = canvas.getContext('2d');\\r\\n    \\r\\n    const CHART_MIN_T = -10;\\r\\n    const CHART_MAX_T = 55;\\r\\n    const CHART_MIN_D = 0;\\r\\n    const CHART_MAX_D = 35;\\r\\n\\r\\n    let width, height, padding = { top: 30, right: 50, bottom: 50, left: 60 };\\r\\n\\r\\n    function mapX(t) {\\r\\n        return padding.left + (t - CHART_MIN_T) \\\/ (CHART_MAX_T - CHART_MIN_T) * (width - padding.left - padding.right);\\r\\n    }\\r\\n\\r\\n    function mapY(d) {\\r\\n        return height - padding.bottom - (d - CHART_MIN_D) \\\/ (CHART_MAX_D - CHART_MIN_D) * (height - padding.top - padding.bottom);\\r\\n    }\\r\\n\\r\\n    function drawChart() {\\r\\n        const dpr = window.devicePixelRatio || 1;\\r\\n        const rect = canvas.parentElement.getBoundingClientRect();\\r\\n        canvas.width = rect.width * dpr;\\r\\n        canvas.height = rect.height * dpr;\\r\\n        ctx.scale(dpr, dpr);\\r\\n        width = rect.width;\\r\\n        height = rect.height;\\r\\n\\r\\n        ctx.clearRect(0, 0, width, height);\\r\\n        ctx.font = \\\"12px sans-serif\\\";\\r\\n\\r\\n        \\\/\\\/ \\u7f51\\u683c\\r\\n        ctx.strokeStyle = \\\"#e2e8f0\\\";\\r\\n        ctx.lineWidth = 1;\\r\\n        ctx.beginPath();\\r\\n        for (let t = CHART_MIN_T; t <= CHART_MAX_T; t += 5) {\\r\\n            const x = mapX(t);\\r\\n            ctx.moveTo(x, padding.top);\\r\\n            ctx.lineTo(x, height - padding.bottom);\\r\\n            ctx.fillStyle = \\\"#64748b\\\";\\r\\n            ctx.fillText(t + \\\"\\u00b0\\\", x - 10, height - padding.bottom + 20);\\r\\n        }\\r\\n        for (let d = 0; d <= CHART_MAX_D; d += 5) {\\r\\n            const y = mapY(d);\\r\\n            ctx.moveTo(padding.left, y);\\r\\n            ctx.lineTo(width - padding.right, y);\\r\\n            ctx.fillStyle = \\\"#64748b\\\";\\r\\n            ctx.fillText(d, padding.left - 25, y + 4);\\r\\n        }\\r\\n        ctx.stroke();\\r\\n\\r\\n        \\\/\\\/ \\u8f74\\u6807\\u7b7e\\r\\n        ctx.save();\\r\\n        ctx.fillStyle = \\\"#1e293b\\\";\\r\\n        ctx.font = \\\"bold 14px sans-serif\\\";\\r\\n        ctx.fillText(\\\"\\u5e72\\u7403\\u6e29\\u5ea6 (\\u00b0C)\\\", width \\\/ 2 - 40, height - 10);\\r\\n        ctx.translate(20, height \\\/ 2);\\r\\n        ctx.rotate(-Math.PI \\\/ 2);\\r\\n        ctx.fillText(\\\"\\u542b\\u6e7f\\u91cf (g\\\/kg)\\\", -40, 0);\\r\\n        ctx.restore();\\r\\n\\r\\n        \\\/\\\/ \\u66f2\\u7ebf\\r\\n        const humidities = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\\r\\n        humidities.forEach(rh => {\\r\\n            ctx.beginPath();\\r\\n            ctx.lineWidth = rh === 100 ? 2.5 : 1;\\r\\n            ctx.strokeStyle = rh === 100 ? \\\"#2563eb\\\" : \\\"rgba(37, 99, 235, 0.3)\\\";\\r\\n            let started = false;\\r\\n            for (let t = CHART_MIN_T; t <= CHART_MAX_T; t += 0.5) {\\r\\n                const res = calcState(t, rh);\\r\\n                const x = mapX(t);\\r\\n                const y = mapY(res.d);\\r\\n                if (res.d > CHART_MAX_D) continue;\\r\\n                if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\\r\\n            }\\r\\n            ctx.stroke();\\r\\n            if(rh % 20 === 0 || rh === 100) {\\r\\n                 const labelT = 30;\\r\\n                 const res = calcState(labelT, rh);\\r\\n                 if(res.d < CHART_MAX_D) {\\r\\n                    ctx.fillStyle = \\\"#2563eb\\\";\\r\\n                    ctx.fillText(rh + \\\"%\\\", mapX(labelT) + 2, mapY(res.d) - 2);\\r\\n                 }\\r\\n            }\\r\\n        });\\r\\n\\r\\n        \\\/\\\/ \\u72b6\\u6001\\u70b9\\r\\n        const currT = parseFloat(elInputT.value);\\r\\n        const currRH = parseFloat(elInputRH.value);\\r\\n        const currState = calcState(currT, currRH);\\r\\n\\r\\n        document.getElementById('valD').innerText = currState.d.toFixed(2);\\r\\n        document.getElementById('valH').innerText = currState.h.toFixed(2);\\r\\n        document.getElementById('valTd').innerText = currState.td.toFixed(2);\\r\\n        document.getElementById('valTw').innerText = currState.tw.toFixed(2);\\r\\n        document.getElementById('valPw').innerText = currState.Pw.toFixed(3);\\r\\n        document.getElementById('valRho').innerText = currState.rho.toFixed(3);\\r\\n\\r\\n        const ptX = mapX(currT);\\r\\n        const ptY = mapY(currState.d);\\r\\n\\r\\n        ctx.beginPath();\\r\\n        ctx.setLineDash([5, 5]);\\r\\n        ctx.strokeStyle = \\\"#ef4444\\\";\\r\\n        ctx.lineWidth = 1;\\r\\n        ctx.moveTo(ptX, ptY);\\r\\n        ctx.lineTo(ptX, height - padding.bottom);\\r\\n        ctx.moveTo(ptX, ptY);\\r\\n        ctx.lineTo(width - padding.right, ptY);\\r\\n        ctx.stroke();\\r\\n        ctx.setLineDash([]);\\r\\n\\r\\n        ctx.beginPath();\\r\\n        ctx.arc(ptX, ptY, 6, 0, Math.PI * 2);\\r\\n        ctx.fillStyle = \\\"#ef4444\\\";\\r\\n        ctx.fill();\\r\\n        ctx.strokeStyle = \\\"white\\\";\\r\\n        ctx.lineWidth = 2;\\r\\n        ctx.stroke();\\r\\n        \\r\\n        ctx.fillStyle = \\\"#ef4444\\\";\\r\\n        ctx.font = \\\"bold 12px sans-serif\\\";\\r\\n        ctx.fillText(`(${currT}\\u00b0C, ${currState.d.toFixed(1)}g)`, ptX + 10, ptY - 10);\\r\\n    }\\r\\n\\r\\n    const elSliderT = document.getElementById('sliderT');\\r\\n    const elInputT = document.getElementById('inputT');\\r\\n    const elSliderRH = document.getElementById('sliderRH');\\r\\n    const elInputRH = document.getElementById('inputRH');\\r\\n\\r\\n    function update() { elInputT.value = elSliderT.value; elInputRH.value = elSliderRH.value; drawChart(); }\\r\\n    function updateFromInput() { elSliderT.value = elInputT.value; elSliderRH.value = elInputRH.value; drawChart(); }\\r\\n\\r\\n    elSliderT.addEventListener('input', update);\\r\\n    elInputT.addEventListener('input', updateFromInput);\\r\\n    elSliderRH.addEventListener('input', update);\\r\\n    elInputRH.addEventListener('input', updateFromInput);\\r\\n    window.addEventListener('resize', drawChart);\\r\\n    drawChart();\\r\\n<\\\/script>\\r\\n<\\\/body>\\r\\n<\\\/html>\",\"_element_width\":\"initial\",\"_element_custom_width\":{\"unit\":\"%\",\"size\":109.898},\"_flex_size\":\"none\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"3801f29\"}]},\"elements\":[],\"widgetType\":\"html\"}],\"isInner\":false}]"],"_elementor_version":["3.33.1"],"_elementor_page_settings":["a:0:{}"],"_uag_page_assets":["a:9:{s:3:\"css\";s:263:\".uag-blocks-common-selector{z-index:var(--z-index-desktop) !important}@media (max-width: 976px){.uag-blocks-common-selector{z-index:var(--z-index-tablet) !important}}@media (max-width: 767px){.uag-blocks-common-selector{z-index:var(--z-index-mobile) !important}}\n\";s:2:\"js\";s:0:\"\";s:18:\"current_block_list\";a:7:{i:0;s:11:\"core\/search\";i:1;s:10:\"core\/group\";i:2;s:12:\"core\/heading\";i:3;s:17:\"core\/latest-posts\";i:4;s:20:\"core\/latest-comments\";i:5;s:13:\"core\/archives\";i:6;s:15:\"core\/categories\";}s:8:\"uag_flag\";b:0;s:11:\"uag_version\";s:10:\"1766657798\";s:6:\"gfonts\";a:0:{}s:10:\"gfonts_url\";s:0:\"\";s:12:\"gfonts_files\";a:0:{}s:14:\"uag_faq_layout\";b:0;}"],"views":["0"],"_elementor_page_assets":["a:1:{s:7:\"scripts\";a:1:{i:0;s:18:\"elementor-frontend\";}}"],"_elementor_css":["a:6:{s:4:\"time\";i:1766222816;s:5:\"fonts\";a:0:{}s:5:\"icons\";a:0:{}s:20:\"dynamic_elements_ids\";a:0:{}s:6:\"status\";s:4:\"file\";i:0;s:0:\"\";}"],"_elementor_element_cache":["{\"timeout\":1776631531,\"value\":{\"content\":\"<div class=\\\"elementor-element elementor-element-24ba7e7 e-con-full e-flex e-con e-parent\\\" data-id=\\\"24ba7e7\\\" data-element_type=\\\"container\\\">\\n\\t\\t\\t\\t<div class=\\\"elementor-element elementor-element-ae8a62f elementor-widget__width-initial elementor-widget elementor-widget-html\\\" data-id=\\\"ae8a62f\\\" data-element_type=\\\"widget\\\" data-widget_type=\\\"html.default\\\">\\n\\t\\t\\t\\t\\t<meta name='viewport' content='width=device-width, initial-scale=1'\\\/><!DOCTYPE html>\\r\\n<html lang=\\\"zh-CN\\\">\\r\\n<head>\\r\\n    <meta charset=\\\"UTF-8\\\">\\r\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\r\\n    <title>\\u52a8\\u6001\\u7113\\u6e7f\\u56fe\\u8ba1\\u7b97\\u5668 (\\u53cc\\u5217\\u5e03\\u5c40\\u7248)<\\\/title>\\r\\n    <style>\\r\\n        * { margin: 0; padding: 0; box-sizing: border-box; }\\r\\n        body {\\r\\n            font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, Arial, sans-serif;\\r\\n            background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\\r\\n            padding: 20px;\\r\\n            min-height: 100vh;\\r\\n            color: #1f2937;\\r\\n        }\\r\\n        .container { max-width: 1400px; margin: 0 auto; }\\r\\n        \\r\\n        \\\/* \\u5e03\\u5c40\\u7ed3\\u6784 *\\\/\\r\\n        .main-layout {\\r\\n            display: grid;\\r\\n            grid-template-columns: 360px 1fr;\\r\\n            gap: 20px;\\r\\n            align-items: start;\\r\\n        }\\r\\n\\r\\n        \\\/* \\u5361\\u7247\\u6837\\u5f0f *\\\/\\r\\n        .card {\\r\\n            background: white;\\r\\n            border-radius: 16px;\\r\\n            box-shadow: 0 10px 25px rgba(0,0,0,0.05);\\r\\n            padding: 20px;\\r\\n            overflow: hidden;\\r\\n        }\\r\\n\\r\\n        \\\/* \\u5934\\u90e8 *\\\/\\r\\n        .header {\\r\\n            grid-column: 1 \\\/ -1;\\r\\n            background: linear-gradient(135deg, #2563eb 0%, #0891b2 100%);\\r\\n            color: white;\\r\\n            padding: 20px 30px;\\r\\n            border-radius: 16px;\\r\\n            margin-bottom: 20px;\\r\\n            display: flex;\\r\\n            justify-content: space-between;\\r\\n            align-items: center;\\r\\n        }\\r\\n        .header h1 { font-size: 24px; margin-bottom: 5px; }\\r\\n        .header p { opacity: 0.8; font-size: 14px; }\\r\\n\\r\\n        \\\/* \\u8f93\\u5165\\u63a7\\u4ef6 *\\\/\\r\\n        .input-group { margin-bottom: 20px; }\\r\\n        .input-label { display: block; font-weight: 600; margin-bottom: 8px; font-size: 14px; color: #4b5563; }\\r\\n        .input-row { display: flex; align-items: center; gap: 10px; }\\r\\n        .input-field {\\r\\n            width: 80px; padding: 8px; border: 1px solid #d1d5db; border-radius: 6px;\\r\\n            font-size: 16px; text-align: center;\\r\\n        }\\r\\n        .slider { flex: 1; accent-color: #2563eb; cursor: pointer; }\\r\\n\\r\\n        \\\/* --- \\u6838\\u5fc3\\u4fee\\u6539\\uff1a\\u7ed3\\u679c\\u5217\\u8868 (\\u4e00\\u884c\\u4e24\\u4e2a) --- *\\\/\\r\\n        .result-grid {\\r\\n            display: grid;\\r\\n            grid-template-columns: 1fr 1fr; \\\/* \\u5f3a\\u5236\\u4e24\\u5217 *\\\/\\r\\n            gap: 12px; \\\/* \\u589e\\u52a0\\u95f4\\u8ddd *\\\/\\r\\n            background: #f1f5f9;\\r\\n            padding: 15px;\\r\\n            border-radius: 12px;\\r\\n            margin-top: 20px;\\r\\n        }\\r\\n        \\r\\n        .result-item {\\r\\n            display: flex;\\r\\n            flex-direction: column; \\\/* \\u4e0a\\u4e0b\\u6392\\u5217\\uff0c\\u66f4\\u9002\\u5408\\u5c0f\\u7a7a\\u95f4 *\\\/\\r\\n            padding: 10px;\\r\\n            border-radius: 8px;\\r\\n            border: 1px solid #e2e8f0;\\r\\n        }\\r\\n\\r\\n        .res-label { \\r\\n            font-size: 12px; \\r\\n            color: #64748b; \\r\\n            margin-bottom: 4px;\\r\\n        }\\r\\n        \\r\\n        .res-val { \\r\\n            font-weight: 700; \\r\\n            color: #0f172a; \\r\\n            font-family: monospace; \\r\\n            font-size: 16px; \\r\\n        }\\r\\n        \\r\\n        .res-val small {\\r\\n            font-size: 11px;\\r\\n            color: #94a3b8;\\r\\n            font-weight: normal;\\r\\n            margin-left: 2px;\\r\\n        }\\r\\n\\r\\n        \\\/* --- \\u65b0\\u589e\\uff1a\\u5dee\\u5f02\\u5316\\u80cc\\u666f\\u8272 --- *\\\/\\r\\n        .result-item.item-d { background: linear-gradient(90deg, #e0f7fa, #b2ebf2); }\\r\\n        .result-item.item-h { background: linear-gradient(90deg, #fff3e0, #ffe0b2); }\\r\\n        .result-item.item-td { background: linear-gradient(90deg, #f3e5f5, #ce93d8); }\\r\\n        .result-item.item-tw { background: linear-gradient(90deg, #e8f5e8, #c8e6c9); }\\r\\n        .result-item.item-pw { background: linear-gradient(90deg, #fff8e1, #ffecb3); }\\r\\n        .result-item.item-rho { background: linear-gradient(90deg, #fce4ec, #f48fb1); }\\r\\n        \\\/* --- \\u80cc\\u666f\\u8272\\u5b9a\\u4e49\\u7ed3\\u675f --- *\\\/\\r\\n\\r\\n        \\\/* \\u753b\\u5e03\\u533a\\u57df *\\\/\\r\\n        .chart-container {\\r\\n            position: relative;\\r\\n            height: 600px;\\r\\n            background: white;\\r\\n            border-radius: 16px;\\r\\n            border: 1px solid #e2e8f0;\\r\\n        }\\r\\n        canvas {\\r\\n            width: 100%;\\r\\n            height: 100%;\\r\\n            display: block;\\r\\n        }\\r\\n        .chart-overlay {\\r\\n            position: absolute; top: 20px; right: 20px;\\r\\n            background: rgba(255,255,255,0.95);\\r\\n            padding: 12px; border-radius: 8px;\\r\\n            border: 1px solid #cbd5e1;\\r\\n            font-size: 12px; pointer-events: none;\\r\\n            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\\r\\n        }\\r\\n\\r\\n        \\\/* \\u54cd\\u5e94\\u5f0f *\\\/\\r\\n        @media (max-width: 1000px) {\\r\\n            .main-layout { grid-template-columns: 1fr; }\\r\\n            .chart-container { height: 400px; }\\r\\n        }\\r\\n    <\\\/style>\\r\\n<\\\/head>\\r\\n<body>\\r\\n\\r\\n<div class=\\\"container\\\">\\r\\n    <div class=\\\"header\\\">\\r\\n        <div>\\r\\n            <h1>Web \\u7113\\u6e7f\\u56fe\\u53ef\\u89c6\\u5316<\\\/h1>\\r\\n            <p>Psychrometric Chart Generator<\\\/p>\\r\\n        <\\\/div>\\r\\n        <div style=\\\"text-align: right; font-size: 12px; opacity: 0.8;\\\">\\r\\n            \\u57fa\\u4e8e\\u6807\\u51c6\\u5927\\u6c14\\u538b (101.3 kPa)\\r\\n        <\\\/div>\\r\\n    <\\\/div>\\r\\n\\r\\n    <div class=\\\"main-layout\\\">\\r\\n        <div class=\\\"card\\\">\\r\\n            <h3>\\u53c2\\u6570\\u8bbe\\u7f6e<\\\/h3>\\r\\n            <hr style=\\\"border: 0; border-top: 1px solid #eee; margin: 15px 0;\\\">\\r\\n\\r\\n            <div class=\\\"input-group\\\">\\r\\n                <label class=\\\"input-label\\\">\\u5e72\\u7403\\u6e29\\u5ea6 (\\u00b0C)<\\\/label>\\r\\n                <div class=\\\"input-row\\\">\\r\\n                    <input type=\\\"range\\\" id=\\\"sliderT\\\" class=\\\"slider\\\" min=\\\"-10\\\" max=\\\"50\\\" step=\\\"0.5\\\" value=\\\"25\\\">\\r\\n                    <input type=\\\"number\\\" id=\\\"inputT\\\" class=\\\"input-field\\\" value=\\\"25\\\">\\r\\n                <\\\/div>\\r\\n            <\\\/div>\\r\\n\\r\\n            <div class=\\\"input-group\\\">\\r\\n                <label class=\\\"input-label\\\">\\u76f8\\u5bf9\\u6e7f\\u5ea6 (%)<\\\/label>\\r\\n                <div class=\\\"input-row\\\">\\r\\n                    <input type=\\\"range\\\" id=\\\"sliderRH\\\" class=\\\"slider\\\" min=\\\"0\\\" max=\\\"100\\\" step=\\\"1\\\" value=\\\"50\\\">\\r\\n                    <input type=\\\"number\\\" id=\\\"inputRH\\\" class=\\\"input-field\\\" value=\\\"50\\\">\\r\\n                <\\\/div>\\r\\n            <\\\/div>\\r\\n            \\r\\n            <div style=\\\"font-size:12px; color:#999; margin-top:5px;\\\">\\r\\n                * \\u62d6\\u52a8\\u6ed1\\u5757\\uff0c\\u56fe\\u8868\\u7ea2\\u70b9\\u5b9e\\u65f6\\u79fb\\u52a8\\r\\n            <\\\/div>\\r\\n\\r\\n            <div class=\\\"result-grid\\\">\\r\\n                <div class=\\\"result-item item-d\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u542b\\u6e7f\\u91cf (d)<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valD\\\">0<\\\/span><small>g\\\/kg<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-h\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u7113\\u503c (h)<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valH\\\">0<\\\/span><small>kJ\\\/kg<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-td\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u9732\\u70b9\\u6e29\\u5ea6<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valTd\\\">0<\\\/span><small>\\u00b0C<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-tw\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u6e7f\\u7403\\u6e29\\u5ea6<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valTw\\\">0<\\\/span><small>\\u00b0C<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-pw\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u6c34\\u84b8\\u6c14\\u5206\\u538b<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valPw\\\">0<\\\/span><small>kPa<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n                <div class=\\\"result-item item-rho\\\">\\r\\n                    <span class=\\\"res-label\\\">\\u7a7a\\u6c14\\u5bc6\\u5ea6<\\\/span> \\r\\n                    <span class=\\\"res-val\\\"><span id=\\\"valRho\\\">0<\\\/span><small>kg\\\/m\\u00b3<\\\/small><\\\/span>\\r\\n                <\\\/div>\\r\\n            <\\\/div>\\r\\n        <\\\/div>\\r\\n\\r\\n        <div class=\\\"card chart-container\\\">\\r\\n            <canvas id=\\\"psyChart\\\"><\\\/canvas>\\r\\n            <div class=\\\"chart-overlay\\\">\\r\\n                <div style=\\\"margin-bottom:4px;\\\"><span style=\\\"color:#2563eb; font-weight:bold;\\\">\\u2501<\\\/span> \\u9971\\u548c\\u7ebf (100%)<\\\/div>\\r\\n                <div style=\\\"margin-bottom:4px;\\\"><span style=\\\"color:#93c5fd; font-weight:bold;\\\">\\u2501<\\\/span> \\u76f8\\u5bf9\\u6e7f\\u5ea6\\u7ebf<\\\/div>\\r\\n                <div><span style=\\\"color:#ef4444; font-weight:bold;\\\">\\u25cf<\\\/span> \\u5f53\\u524d\\u72b6\\u6001\\u70b9<\\\/div>\\r\\n            <\\\/div>\\r\\n        <\\\/div>\\r\\n    <\\\/div>\\r\\n<\\\/div>\\r\\n\\r\\n<script>\\r\\n    \\\/\\\/ --- \\u7269\\u7406\\u8ba1\\u7b97\\u6838\\u5fc3 (Math Core) ---\\r\\n    const P_ATM = 101.325; \\\/\\\/ \\u6807\\u51c6\\u5927\\u6c14\\u538b kPa\\r\\n\\r\\n    function getSatPressure(t) {\\r\\n        return 0.61078 * Math.exp((17.27 * t) \\\/ (t + 237.3));\\r\\n    }\\r\\n\\r\\n    function calcState(t, rh) {\\r\\n        const Ps = getSatPressure(t);\\r\\n        const Pw = (rh \\\/ 100) * Ps;\\r\\n        \\r\\n        let d = 0;\\r\\n        if (P_ATM > Pw) {\\r\\n            d = 622 * Pw \\\/ (P_ATM - Pw);\\r\\n        }\\r\\n\\r\\n        let td = t;\\r\\n        if (Pw > 0) {\\r\\n           const alpha = Math.log(Pw\\\/0.61078);\\r\\n           td = (237.3 * alpha) \\\/ (17.27 - alpha);\\r\\n        }\\r\\n\\r\\n        const h = 1.005 * t + (d\\\/1000) * (2501 + 1.86 * t);\\r\\n\\r\\n        const tw = t * Math.atan(0.151977 * Math.sqrt(rh + 8.313659)) +\\r\\n                   Math.atan(t + rh) - Math.atan(rh - 1.676331) +\\r\\n                   0.00391838 * Math.pow(rh, 1.5) * Math.atan(0.023101 * rh) - 4.686035;\\r\\n\\r\\n        const v = (0.287 * (t + 273.15) * (1 + 1.6078 * (d\\\/1000))) \\\/ P_ATM;\\r\\n        const rho = 1\\\/v;\\r\\n\\r\\n        return { d, h, td, tw, Pw, rho };\\r\\n    }\\r\\n\\r\\n    \\\/\\\/ --- \\u7ed8\\u56fe\\u5f15\\u64ce (Drawing Engine) ---\\r\\n    const canvas = document.getElementById('psyChart');\\r\\n    const ctx = canvas.getContext('2d');\\r\\n    \\r\\n    const CHART_MIN_T = -10;\\r\\n    const CHART_MAX_T = 55;\\r\\n    const CHART_MIN_D = 0;\\r\\n    const CHART_MAX_D = 35;\\r\\n\\r\\n    let width, height, padding = { top: 30, right: 50, bottom: 50, left: 60 };\\r\\n\\r\\n    function mapX(t) {\\r\\n        return padding.left + (t - CHART_MIN_T) \\\/ (CHART_MAX_T - CHART_MIN_T) * (width - padding.left - padding.right);\\r\\n    }\\r\\n\\r\\n    function mapY(d) {\\r\\n        return height - padding.bottom - (d - CHART_MIN_D) \\\/ (CHART_MAX_D - CHART_MIN_D) * (height - padding.top - padding.bottom);\\r\\n    }\\r\\n\\r\\n    function drawChart() {\\r\\n        const dpr = window.devicePixelRatio || 1;\\r\\n        const rect = canvas.parentElement.getBoundingClientRect();\\r\\n        canvas.width = rect.width * dpr;\\r\\n        canvas.height = rect.height * dpr;\\r\\n        ctx.scale(dpr, dpr);\\r\\n        width = rect.width;\\r\\n        height = rect.height;\\r\\n\\r\\n        ctx.clearRect(0, 0, width, height);\\r\\n        ctx.font = \\\"12px sans-serif\\\";\\r\\n\\r\\n        \\\/\\\/ \\u7f51\\u683c\\r\\n        ctx.strokeStyle = \\\"#e2e8f0\\\";\\r\\n        ctx.lineWidth = 1;\\r\\n        ctx.beginPath();\\r\\n        for (let t = CHART_MIN_T; t <= CHART_MAX_T; t += 5) {\\r\\n            const x = mapX(t);\\r\\n            ctx.moveTo(x, padding.top);\\r\\n            ctx.lineTo(x, height - padding.bottom);\\r\\n            ctx.fillStyle = \\\"#64748b\\\";\\r\\n            ctx.fillText(t + \\\"\\u00b0\\\", x - 10, height - padding.bottom + 20);\\r\\n        }\\r\\n        for (let d = 0; d <= CHART_MAX_D; d += 5) {\\r\\n            const y = mapY(d);\\r\\n            ctx.moveTo(padding.left, y);\\r\\n            ctx.lineTo(width - padding.right, y);\\r\\n            ctx.fillStyle = \\\"#64748b\\\";\\r\\n            ctx.fillText(d, padding.left - 25, y + 4);\\r\\n        }\\r\\n        ctx.stroke();\\r\\n\\r\\n        \\\/\\\/ \\u8f74\\u6807\\u7b7e\\r\\n        ctx.save();\\r\\n        ctx.fillStyle = \\\"#1e293b\\\";\\r\\n        ctx.font = \\\"bold 14px sans-serif\\\";\\r\\n        ctx.fillText(\\\"\\u5e72\\u7403\\u6e29\\u5ea6 (\\u00b0C)\\\", width \\\/ 2 - 40, height - 10);\\r\\n        ctx.translate(20, height \\\/ 2);\\r\\n        ctx.rotate(-Math.PI \\\/ 2);\\r\\n        ctx.fillText(\\\"\\u542b\\u6e7f\\u91cf (g\\\/kg)\\\", -40, 0);\\r\\n        ctx.restore();\\r\\n\\r\\n        \\\/\\\/ \\u66f2\\u7ebf\\r\\n        const humidities = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\\r\\n        humidities.forEach(rh => {\\r\\n            ctx.beginPath();\\r\\n            ctx.lineWidth = rh === 100 ? 2.5 : 1;\\r\\n            ctx.strokeStyle = rh === 100 ? \\\"#2563eb\\\" : \\\"rgba(37, 99, 235, 0.3)\\\";\\r\\n            let started = false;\\r\\n            for (let t = CHART_MIN_T; t <= CHART_MAX_T; t += 0.5) {\\r\\n                const res = calcState(t, rh);\\r\\n                const x = mapX(t);\\r\\n                const y = mapY(res.d);\\r\\n                if (res.d > CHART_MAX_D) continue;\\r\\n                if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\\r\\n            }\\r\\n            ctx.stroke();\\r\\n            if(rh % 20 === 0 || rh === 100) {\\r\\n                 const labelT = 30;\\r\\n                 const res = calcState(labelT, rh);\\r\\n                 if(res.d < CHART_MAX_D) {\\r\\n                    ctx.fillStyle = \\\"#2563eb\\\";\\r\\n                    ctx.fillText(rh + \\\"%\\\", mapX(labelT) + 2, mapY(res.d) - 2);\\r\\n                 }\\r\\n            }\\r\\n        });\\r\\n\\r\\n        \\\/\\\/ \\u72b6\\u6001\\u70b9\\r\\n        const currT = parseFloat(elInputT.value);\\r\\n        const currRH = parseFloat(elInputRH.value);\\r\\n        const currState = calcState(currT, currRH);\\r\\n\\r\\n        document.getElementById('valD').innerText = currState.d.toFixed(2);\\r\\n        document.getElementById('valH').innerText = currState.h.toFixed(2);\\r\\n        document.getElementById('valTd').innerText = currState.td.toFixed(2);\\r\\n        document.getElementById('valTw').innerText = currState.tw.toFixed(2);\\r\\n        document.getElementById('valPw').innerText = currState.Pw.toFixed(3);\\r\\n        document.getElementById('valRho').innerText = currState.rho.toFixed(3);\\r\\n\\r\\n        const ptX = mapX(currT);\\r\\n        const ptY = mapY(currState.d);\\r\\n\\r\\n        ctx.beginPath();\\r\\n        ctx.setLineDash([5, 5]);\\r\\n        ctx.strokeStyle = \\\"#ef4444\\\";\\r\\n        ctx.lineWidth = 1;\\r\\n        ctx.moveTo(ptX, ptY);\\r\\n        ctx.lineTo(ptX, height - padding.bottom);\\r\\n        ctx.moveTo(ptX, ptY);\\r\\n        ctx.lineTo(width - padding.right, ptY);\\r\\n        ctx.stroke();\\r\\n        ctx.setLineDash([]);\\r\\n\\r\\n        ctx.beginPath();\\r\\n        ctx.arc(ptX, ptY, 6, 0, Math.PI * 2);\\r\\n        ctx.fillStyle = \\\"#ef4444\\\";\\r\\n        ctx.fill();\\r\\n        ctx.strokeStyle = \\\"white\\\";\\r\\n        ctx.lineWidth = 2;\\r\\n        ctx.stroke();\\r\\n        \\r\\n        ctx.fillStyle = \\\"#ef4444\\\";\\r\\n        ctx.font = \\\"bold 12px sans-serif\\\";\\r\\n        ctx.fillText(`(${currT}\\u00b0C, ${currState.d.toFixed(1)}g)`, ptX + 10, ptY - 10);\\r\\n    }\\r\\n\\r\\n    const elSliderT = document.getElementById('sliderT');\\r\\n    const elInputT = document.getElementById('inputT');\\r\\n    const elSliderRH = document.getElementById('sliderRH');\\r\\n    const elInputRH = document.getElementById('inputRH');\\r\\n\\r\\n    function update() { elInputT.value = elSliderT.value; elInputRH.value = elSliderRH.value; drawChart(); }\\r\\n    function updateFromInput() { elSliderT.value = elInputT.value; elSliderRH.value = elInputRH.value; drawChart(); }\\r\\n\\r\\n    elSliderT.addEventListener('input', update);\\r\\n    elInputT.addEventListener('input', updateFromInput);\\r\\n    elSliderRH.addEventListener('input', update);\\r\\n    elInputRH.addEventListener('input', updateFromInput);\\r\\n    window.addEventListener('resize', drawChart);\\r\\n    drawChart();\\r\\n<\\\/script>\\r\\n<\\\/body>\\r\\n<\\\/html>\\t\\t\\t\\t<\\\/div>\\n\\t\\t\\t\\t<\\\/div>\\n\\t\\t\",\"scripts\":[],\"styles\":[]}}"],"_uag_css_file_name":["uag-css-764.css"]},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"xianjie.me@icloud.com","author_link":"https:\/\/isunnylife.space\/?author=1"},"uagb_comment_info":0,"uagb_excerpt":"\u52a8\u6001\u7113\u6e7f\u56fe\u8ba1\u7b97\u5668 (\u53cc\u5217\u5e03\u5c40\u7248) Web [&hellip;]","_links":{"self":[{"href":"https:\/\/isunnylife.space\/index.php?rest_route=\/wp\/v2\/posts\/764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/isunnylife.space\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/isunnylife.space\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/isunnylife.space\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/isunnylife.space\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=764"}],"version-history":[{"count":4,"href":"https:\/\/isunnylife.space\/index.php?rest_route=\/wp\/v2\/posts\/764\/revisions"}],"predecessor-version":[{"id":772,"href":"https:\/\/isunnylife.space\/index.php?rest_route=\/wp\/v2\/posts\/764\/revisions\/772"}],"wp:attachment":[{"href":"https:\/\/isunnylife.space\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/isunnylife.space\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/isunnylife.space\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}