{"id":167,"date":"2025-11-05T23:02:11","date_gmt":"2025-11-05T15:02:11","guid":{"rendered":"https:\/\/www.aihx.top\/?p=167"},"modified":"2025-11-05T23:02:11","modified_gmt":"2025-11-05T15:02:11","slug":"%e6%ba%b6%e6%b6%b2%e3%80%81%e8%83%b6%e4%bd%93%e3%80%81%e6%b5%8a%e6%b6%b2%e7%9a%84%e5%88%86%e7%a6%bb%e5%8e%9f%e7%90%86%e6%a8%a1%e6%8b%9f","status":"publish","type":"post","link":"https:\/\/www.aihx.top\/?p=167","title":{"rendered":"\u6eb6\u6db2\u3001\u80f6\u4f53\u3001\u6d4a\u6db2\u7684\u5206\u79bb\u539f\u7406\u6a21\u62df"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u6eb6\u6db2\u3001\u80f6\u4f53\u3001\u6d4a\u6db2\u7684\u5206\u79bb\u539f\u7406\u6a21\u62df<\/title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;\n        }\n        \n        body {\n            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n            min-height: 100vh;\n            padding: 20px;\n            color: #333;\n        }\n        \n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            background-color: rgba(255, 255, 255, 0.95);\n            border-radius: 15px;\n            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n            overflow: hidden;\n        }\n        \n        header {\n            background: linear-gradient(90deg, #4b6cb7 0%, #182848 100%);\n            color: white;\n            padding: 25px;\n            text-align: center;\n        }\n        \n        h1 {\n            font-size: 2.4rem;\n            margin-bottom: 10px;\n        }\n        \n        .subtitle {\n            font-size: 1.2rem;\n            opacity: 0.9;\n            max-width: 800px;\n            margin: 0 auto;\n            line-height: 1.5;\n        }\n        \n        .content {\n            display: flex;\n            flex-wrap: wrap;\n            padding: 20px;\n        }\n        \n        .process-container {\n            flex: 1;\n            min-width: 300px;\n            margin: 10px;\n            padding: 20px;\n            background-color: #f8f9fa;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);\n        }\n        \n        h2 {\n            text-align: center;\n            margin-bottom: 20px;\n            color: #2c3e50;\n            border-bottom: 2px solid #3498db;\n            padding-bottom: 10px;\n        }\n        \n        .animation-container {\n            position: relative;\n            height: 320px;\n            border: 1px solid #ddd;\n            border-radius: 8px;\n            margin-bottom: 20px;\n            background-color: #fff;\n            overflow: hidden;\n        }\n        \n        canvas {\n            display: block;\n            width: 100%;\n            height: 100%;\n        }\n        \n        .controls {\n            display: flex;\n            justify-content: center;\n            gap: 15px;\n            margin-bottom: 20px;\n        }\n        \n        button {\n            padding: 10px 20px;\n            background-color: #3498db;\n            color: white;\n            border: none;\n            border-radius: 5px;\n            cursor: pointer;\n            transition: all 0.3s;\n            font-weight: bold;\n        }\n        \n        button:hover {\n            background-color: #2980b9;\n            transform: translateY(-2px);\n        }\n        \n        .explanation {\n            background-color: #e8f4fc;\n            padding: 20px;\n            border-radius: 8px;\n            font-size: 1rem;\n            line-height: 1.6;\n        }\n        \n        .systems-comparison {\n            flex-basis: 100%;\n            margin-top: 30px;\n            padding: 25px;\n            background-color: #f8f9fa;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);\n        }\n        \n        .systems-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n            gap: 20px;\n            margin-top: 20px;\n        }\n        \n        .system-card {\n            background: white;\n            border-radius: 10px;\n            padding: 20px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);\n            transition: transform 0.3s;\n        }\n        \n        .system-card:hover {\n            transform: translateY(-5px);\n        }\n        \n        .system-card h3 {\n            color: #2c3e50;\n            margin-bottom: 15px;\n            padding-bottom: 10px;\n            border-bottom: 2px solid;\n        }\n        \n        .solution-card h3 {\n            border-color: #3498db;\n        }\n        \n        .colloid-card h3 {\n            border-color: #e74c3c;\n        }\n        \n        .suspension-card h3 {\n            border-color: #f39c12;\n        }\n        \n        .system-features {\n            list-style-type: none;\n        }\n        \n        .system-features li {\n            padding: 8px 0;\n            border-bottom: 1px dashed #eee;\n        }\n        \n        .system-features li:last-child {\n            border-bottom: none;\n        }\n        \n        footer {\n            text-align: center;\n            padding: 20px;\n            background-color: #2c3e50;\n            color: white;\n            font-size: 0.95rem;\n        }\n        \n        @media (max-width: 768px) {\n            .content {\n                flex-direction: column;\n            }\n            \n            .process-container {\n                min-width: 100%;\n            }\n            \n            .systems-grid {\n                grid-template-columns: 1fr;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <header>\n            <h1>\u6eb6\u6db2\u3001\u80f6\u4f53\u3001\u6d4a\u6db2\u7684\u5206\u79bb\u539f\u7406\u6a21\u62df<\/h1>\n            <p class=\"subtitle\">\u901a\u8fc7\u52a8\u753b\u6f14\u793a\u7406\u89e3\u4e09\u79cd\u5206\u6563\u7cfb\u7684\u7279\u5f81\u53ca\u5206\u79bb\u65b9\u6cd5\uff1a\u8fc7\u6ee4\u9002\u7528\u4e8e\u6d4a\u6db2\uff0c\u6e17\u6790\u9002\u7528\u4e8e\u80f6\u4f53\uff0c\u800c\u6eb6\u6db2\u662f\u5747\u5300\u4f53\u7cfb\u65e0\u9700\u673a\u68b0\u5206\u79bb<\/p>\n        <\/header>\n        \n        <div class=\"content\">\n            <div class=\"process-container\">\n                <h2>\u8fc7\u6ee4\u5206\u79bb\uff08\u6d4a\u6db2\u4e0e\u80f6\u4f53\uff09<\/h2>\n                <div class=\"animation-container\">\n                    <canvas id=\"filtrationCanvas\"><\/canvas>\n                <\/div>\n                <div class=\"controls\">\n                    <button id=\"startFiltration\">\u5f00\u59cb\u8fc7\u6ee4<\/button>\n                    <button id=\"resetFiltration\">\u91cd\u7f6e<\/button>\n                <\/div>\n                <div class=\"explanation\">\n                    <p><strong>\u8fc7\u6ee4\u539f\u7406\uff1a<\/strong>\u5229\u7528\u591a\u5b54\u4ecb\u8d28\uff08\u5982\u6ee4\u7eb8\uff09\u5206\u79bb\u60ac\u6d6e\u5728\u6db2\u4f53\u4e2d\u7684\u56fa\u4f53\u9897\u7c92\u3002\u5f53\u6df7\u5408\u7269\u901a\u8fc7\u8fc7\u6ee4\u4ecb\u8d28\u65f6\uff0c\u8f83\u5927\u7684\u56fa\u4f53\u9897\u7c92\u88ab\u622a\u7559\uff0c\u800c\u6db2\u4f53\u548c\u5c0f\u9897\u7c92\u901a\u8fc7\u3002<\/p>\n                    <p><strong>\u5e94\u7528\uff1a<\/strong>\u9002\u7528\u4e8e\u6d4a\u6db2\uff08\u60ac\u6d6e\u6db2\uff09\u7684\u5206\u79bb\uff0c\u80f6\u4f53\u9897\u7c92\u8f83\u5c0f\u53ef\u80fd\u901a\u8fc7\u6ee4\u7eb8\uff0c\u6eb6\u6db2\u5b8c\u5168\u901a\u8fc7\u3002<\/p>\n                <\/div>\n            <\/div>\n            \n            <div class=\"process-container\">\n                <h2>\u6e17\u6790\u5206\u79bb\uff08\u80f6\u4f53\u4e0e\u6eb6\u6db2\uff09<\/h2>\n                <div class=\"animation-container\">\n                    <canvas id=\"dialysisCanvas\"><\/canvas>\n                <\/div>\n                <div class=\"controls\">\n                    <button id=\"startDialysis\">\u5f00\u59cb\u6e17\u6790<\/button>\n                    <button id=\"resetDialysis\">\u91cd\u7f6e<\/button>\n                <\/div>\n                <div class=\"explanation\">\n                    <p><strong>\u6e17\u6790\u539f\u7406\uff1a<\/strong>\u5229\u7528\u534a\u900f\u819c\u5206\u79bb\u5c0f\u5206\u5b50\u548c\u80f6\u4f53\u9897\u7c92\u3002\u5c0f\u5206\u5b50\uff08\u79bb\u5b50\u3001\u5c0f\u5206\u5b50\uff09\u53ef\u4ee5\u81ea\u7531\u901a\u8fc7\u534a\u900f\u819c\uff0c\u800c\u80f6\u4f53\u9897\u7c92\u88ab\u622a\u7559\u3002<\/p>\n                    <p><strong>\u5e94\u7528\uff1a<\/strong>\u9002\u7528\u4e8e\u80f6\u4f53\u4e0e\u6eb6\u6db2\u7684\u5206\u79bb\uff0c\u8840\u6db2\u900f\u6790\uff08\u6d17\u80be\uff09\u3001\u80f6\u4f53\u7eaf\u5316\u7b49\u3002<\/p>\n                <\/div>\n            <\/div>\n            \n            <div class=\"systems-comparison\">\n                <h2>\u4e09\u79cd\u5206\u6563\u7cfb\u7684\u7279\u5f81\u6bd4\u8f83<\/h2>\n                <div class=\"systems-grid\">\n                    <div class=\"system-card solution-card\">\n                        <h3>\u6eb6\u6db2<\/h3>\n                        <ul class=\"system-features\">\n                            <li><strong>\u5206\u6563\u8d28\u5927\u5c0f\uff1a<\/strong>\uff1c1nm\uff08\u5206\u5b50\/\u79bb\u5b50\u7ea7\u522b\uff09<\/li>\n                            <li><strong>\u7a33\u5b9a\u6027\uff1a<\/strong>\u975e\u5e38\u7a33\u5b9a\uff0c\u957f\u671f\u653e\u7f6e\u4e0d\u6c89\u964d<\/li>\n                            <li><strong>\u900f\u5149\u6027\uff1a<\/strong>\u900f\u660e\uff0c\u5149\u7ebf\u5b8c\u5168\u901a\u8fc7<\/li>\n                            <li><strong>\u8fc7\u6ee4\uff1a<\/strong>\u80fd\u901a\u8fc7\u6ee4\u7eb8<\/li>\n                            <li><strong>\u534a\u900f\u819c\uff1a<\/strong>\u80fd\u901a\u8fc7\u534a\u900f\u819c<\/li>\n                            <li><strong>\u5b9e\u4f8b\uff1a<\/strong>\u76d0\u6c34\u3001\u7cd6\u6c34<\/li>\n                        <\/ul>\n                    <\/div>\n                    \n                    <div class=\"system-card colloid-card\">\n                        <h3>\u80f6\u4f53<\/h3>\n                        <ul class=\"system-features\">\n                            <li><strong>\u5206\u6563\u8d28\u5927\u5c0f\uff1a<\/strong>1-100nm\uff08\u80f6\u4f53\u9897\u7c92\uff09<\/li>\n                            <li><strong>\u7a33\u5b9a\u6027\uff1a<\/strong>\u8f83\u7a33\u5b9a\uff0c\u957f\u671f\u653e\u7f6e\u4e0d\u6c89\u964d<\/li>\n                            <li><strong>\u900f\u5149\u6027\uff1a<\/strong>\u534a\u900f\u660e\uff0c\u6709\u4e01\u8fbe\u5c14\u6548\u5e94<\/li>\n                            <li><strong>\u8fc7\u6ee4\uff1a<\/strong>\u80fd\u901a\u8fc7\u6ee4\u7eb8<\/li>\n                            <li><strong>\u534a\u900f\u819c\uff1a<\/strong>\u4e0d\u80fd\u901a\u8fc7\u534a\u900f\u819c<\/li>\n                            <li><strong>\u5b9e\u4f8b\uff1a<\/strong>\u725b\u5976\u3001\u8840\u6db2<\/li>\n                        <\/ul>\n                    <\/div>\n                    \n                    <div class=\"system-card suspension-card\">\n                        <h3>\u6d4a\u6db2\uff08\u60ac\u6d6e\u6db2\uff09<\/h3>\n                        <ul class=\"system-features\">\n                            <li><strong>\u5206\u6563\u8d28\u5927\u5c0f\uff1a<\/strong>\uff1e100nm\uff08\u8089\u773c\u53ef\u89c1\uff09<\/li>\n                            <li><strong>\u7a33\u5b9a\u6027\uff1a<\/strong>\u4e0d\u7a33\u5b9a\uff0c\u9759\u7f6e\u540e\u6c89\u964d<\/li>\n                            <li><strong>\u900f\u5149\u6027\uff1a<\/strong>\u4e0d\u900f\u660e\uff0c\u5149\u7ebf\u4e0d\u80fd\u901a\u8fc7<\/li>\n                            <li><strong>\u8fc7\u6ee4\uff1a<\/strong>\u4e0d\u80fd\u901a\u8fc7\u6ee4\u7eb8<\/li>\n                            <li><strong>\u534a\u900f\u819c\uff1a<\/strong>\u4e0d\u80fd\u901a\u8fc7\u534a\u900f\u819c<\/li>\n                            <li><strong>\u5b9e\u4f8b\uff1a<\/strong>\u6ce5\u6c34\u3001\u77f3\u7070\u4e73<\/li>\n                        <\/ul>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <footer>\n            <p>\u6eb6\u6db2\u3001\u80f6\u4f53\u3001\u6d4a\u6db2\u7684\u5206\u79bb\u539f\u7406\u6a21\u62df\u52a8\u753b \u00a9 2025 | \u6cc9\u6e2f\u4e8c\u4e2d\u5316\u5b66\u7ec4\u9648\u547d\u6765<\/p>\n        <\/footer>\n    <\/div>\n\n    <script>\n        \/\/ \u8fc7\u6ee4\u52a8\u753b\n        const filtrationCanvas = document.getElementById('filtrationCanvas');\n        const filtrationCtx = filtrationCanvas.getContext('2d');\n        \n        \/\/ \u8bbe\u7f6eCanvas\u5c3a\u5bf8\n        function setCanvasSize(canvas) {\n            const container = canvas.parentElement;\n            canvas.width = container.clientWidth;\n            canvas.height = container.clientHeight;\n        }\n        \n        setCanvasSize(filtrationCanvas);\n        window.addEventListener('resize', () => setCanvasSize(filtrationCanvas));\n        \n        \/\/ \u8fc7\u6ee4\u76f8\u5173\u53d8\u91cf\n        let filtrationAnimationId;\n        let filtrationParticles = [];\n        let filteredParticles = [];\n        let isFiltrationRunning = false;\n        \n        \/\/ \u7c92\u5b50\u7c7b\n        class Particle {\n            constructor(x, y, radius, color, speedX, speedY, type) {\n                this.x = x;\n                this.y = y;\n                this.radius = radius;\n                this.color = color;\n                this.speedX = speedX;\n                this.speedY = speedY;\n                this.type = type; \/\/ 'suspension', 'colloid', 'solution'\n            }\n            \n            draw(ctx) {\n                ctx.beginPath();\n                ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);\n                ctx.fillStyle = this.color;\n                ctx.fill();\n                ctx.closePath();\n            }\n            \n            update(ctx, filterY) {\n                this.x += this.speedX;\n                this.y += this.speedY;\n                \n                \/\/ \u78b0\u5230\u8fc7\u6ee4\u4ecb\u8d28\n                if (this.y + this.radius >= filterY && this.speedY > 0) {\n                    \/\/ \u6d4a\u6db2\u9897\u7c92\uff08\u5927\u9897\u7c92\uff09\u88ab\u622a\u7559\n                    if (this.type === 'suspension') {\n                        this.speedY = 0;\n                        this.speedX = 0;\n                    } else {\n                        \/\/ \u80f6\u4f53\u548c\u6eb6\u6db2\u901a\u8fc7\n                        if (this.y > filterY + 10) {\n                            filteredParticles.push(this);\n                            const index = filtrationParticles.indexOf(this);\n                            if (index > -1) {\n                                filtrationParticles.splice(index, 1);\n                            }\n                        }\n                    }\n                }\n                \n                this.draw(ctx);\n            }\n        }\n        \n        \/\/ \u521d\u59cb\u5316\u8fc7\u6ee4\u573a\u666f\n        function initFiltration() {\n            filtrationParticles = [];\n            filteredParticles = [];\n            \n            const width = filtrationCanvas.width;\n            const height = filtrationCanvas.height;\n            \n            \/\/ \u521b\u5efa\u6d4a\u6db2\u3001\u80f6\u4f53\u548c\u6eb6\u6db2\u6df7\u5408\u7269\n            \/\/ \u6d4a\u6db2\u9897\u7c92\uff08\u5927\u9897\u7c92\uff09\n            for (let i = 0; i < 8; i++) {\n                const radius = Math.random() * 3 + 5; \/\/ 5-8px\n                const color = '#f39c12'; \/\/ \u6a59\u8272\n                const x = Math.random() * (width - 60) + 30;\n                const y = Math.random() * (height \/ 3);\n                const speedX = (Math.random() - 0.5) * 0.3;\n                const speedY = Math.random() * 0.3 + 0.3;\n                \n                filtrationParticles.push(new Particle(x, y, radius, color, speedX, speedY, 'suspension'));\n            }\n            \n            \/\/ \u80f6\u4f53\u9897\u7c92\uff08\u4e2d\u7b49\u9897\u7c92\uff09\n            for (let i = 0; i < 12; i++) {\n                const radius = Math.random() * 2 + 2; \/\/ 2-4px\n                const color = '#e74c3c'; \/\/ \u7ea2\u8272\n                const x = Math.random() * (width - 60) + 30;\n                const y = Math.random() * (height \/ 3);\n                const speedX = (Math.random() - 0.5) * 0.5;\n                const speedY = Math.random() * 0.5 + 0.5;\n                \n                filtrationParticles.push(new Particle(x, y, radius, color, speedX, speedY, 'colloid'));\n            }\n            \n            \/\/ \u6eb6\u6db2\u5206\u5b50\uff08\u5c0f\u9897\u7c92\uff09\n            for (let i = 0; i < 20; i++) {\n                const radius = 1; \/\/ 1px\n                const color = '#3498db'; \/\/ \u84dd\u8272\n                const x = Math.random() * (width - 60) + 30;\n                const y = Math.random() * (height \/ 3);\n                const speedX = (Math.random() - 0.5) * 0.8;\n                const speedY = Math.random() * 0.8 + 0.8;\n                \n                filtrationParticles.push(new Particle(x, y, radius, color, speedX, speedY, 'solution'));\n            }\n        }\n        \n        \/\/ \u7ed8\u5236\u8fc7\u6ee4\u573a\u666f\n        function drawFiltrationScene() {\n            const width = filtrationCanvas.width;\n            const height = filtrationCanvas.height;\n            const filterY = height * 0.6;\n            \n            \/\/ \u6e05\u7a7a\u753b\u5e03\n            filtrationCtx.clearRect(0, 0, width, height);\n            \n            \/\/ \u7ed8\u5236\u5bb9\u5668\n            filtrationCtx.strokeStyle = '#7f8c8d';\n            filtrationCtx.lineWidth = 2;\n            filtrationCtx.strokeRect(15, 15, width - 30, height - 30);\n            \n            \/\/ \u7ed8\u5236\u8fc7\u6ee4\u4ecb\u8d28\n            filtrationCtx.fillStyle = 'rgba(189, 195, 199, 0.7)';\n            filtrationCtx.fillRect(20, filterY - 5, width - 40, 10);\n            \n            \/\/ \u7ed8\u5236\u8fc7\u6ee4\u4ecb\u8d28\u4e0a\u7684\u5b54\n            filtrationCtx.fillStyle = 'rgba(149, 165, 166, 0.9)';\n            for (let i = 25; i < width - 25; i += 12) {\n                filtrationCtx.beginPath();\n                filtrationCtx.arc(i, filterY, 1.5, 0, Math.PI * 2);\n                filtrationCtx.fill();\n            }\n            \n            \/\/ \u7ed8\u5236\u9897\u7c92\n            filtrationParticles.forEach(particle => {\n                particle.update(filtrationCtx, filterY);\n            });\n            \n            \/\/ \u7ed8\u5236\u5df2\u8fc7\u6ee4\u7684\u9897\u7c92\n            filteredParticles.forEach(particle => {\n                particle.draw(filtrationCtx);\n            });\n            \n            \/\/ \u6dfb\u52a0\u6807\u7b7e\n            filtrationCtx.fillStyle = '#2c3e50';\n            filtrationCtx.font = 'bold 14px Arial';\n            filtrationCtx.fillText('\u6df7\u5408\u7269\uff08\u6d4a\u6db2+\u80f6\u4f53+\u6eb6\u6db2\uff09', 25, 35);\n            filtrationCtx.fillText('\u8fc7\u6ee4\u4ecb\u8d28\uff08\u6ee4\u7eb8\uff09', width \/ 2 - 40, filterY - 15);\n            filtrationCtx.fillText('\u6ee4\u6db2\uff08\u80f6\u4f53+\u6eb6\u6db2\uff09', 25, filterY + 40);\n            filtrationCtx.fillText('\u6b8b\u7559\u7269\uff08\u6d4a\u6db2\uff09', 25, filterY - 30);\n            \n            \/\/ \u6dfb\u52a0\u56fe\u4f8b\n            filtrationCtx.font = '12px Arial';\n            filtrationCtx.fillStyle = '#f39c12';\n            filtrationCtx.fillText('\u25cf \u6d4a\u6db2\u9897\u7c92', width - 120, 35);\n            filtrationCtx.fillStyle = '#e74c3c';\n            filtrationCtx.fillText('\u25cf \u80f6\u4f53\u9897\u7c92', width - 120, 55);\n            filtrationCtx.fillStyle = '#3498db';\n            filtrationCtx.fillText('\u25cf \u6eb6\u6db2\u5206\u5b50', width - 120, 75);\n        }\n        \n        \/\/ \u8fc7\u6ee4\u52a8\u753b\u5faa\u73af\n        function animateFiltration() {\n            drawFiltrationScene();\n            \n            if (isFiltrationRunning) {\n                filtrationAnimationId = requestAnimationFrame(animateFiltration);\n            }\n        }\n        \n        \/\/ \u6e17\u6790\u52a8\u753b\n        const dialysisCanvas = document.getElementById('dialysisCanvas');\n        const dialysisCtx = dialysisCanvas.getContext('2d');\n        \n        setCanvasSize(dialysisCanvas);\n        window.addEventListener('resize', () => setCanvasSize(dialysisCanvas));\n        \n        \/\/ \u6e17\u6790\u76f8\u5173\u53d8\u91cf\n        let dialysisAnimationId;\n        let leftParticles = [];\n        let rightParticles = [];\n        let isDialysisRunning = false;\n        \n        \/\/ \u6e17\u6790\u7c92\u5b50\u7c7b\n        class DialysisParticle {\n            constructor(x, y, radius, color, type) {\n                this.x = x;\n                this.y = y;\n                this.radius = radius;\n                this.color = color;\n                this.type = type; \/\/ 'colloid' \u6216 'solution'\n                this.speedX = (Math.random() - 0.5) * 0.8;\n                this.speedY = (Math.random() - 0.5) * 0.8;\n            }\n            \n            draw(ctx) {\n                ctx.beginPath();\n                ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);\n                ctx.fillStyle = this.color;\n                ctx.fill();\n                ctx.closePath();\n            }\n            \n            update(ctx, membraneX) {\n                \/\/ \u5e03\u6717\u8fd0\u52a8\n                this.x += this.speedX;\n                this.y += this.speedY;\n                \n                \/\/ \u8fb9\u754c\u78b0\u649e\u68c0\u6d4b\n                const width = dialysisCanvas.width;\n                const height = dialysisCanvas.height;\n                \n                if (this.x - this.radius < 20 || this.x + this.radius > width - 20) {\n                    this.speedX = -this.speedX;\n                }\n                \n                if (this.y - this.radius < 20 || this.y + this.radius > height - 20) {\n                    this.speedY = -this.speedY;\n                }\n                \n                \/\/ \u534a\u900f\u819c\u78b0\u649e\u68c0\u6d4b\n                if (this.type === 'solution') {\n                    \/\/ \u6eb6\u6db2\u5206\u5b50\u53ef\u4ee5\u7a7f\u8fc7\u819c\n                    if ((this.x < membraneX &#038;&#038; this.x + this.radius >= membraneX) || \n                        (this.x > membraneX && this.x - this.radius <= membraneX)) {\n                        \/\/ \u6709\u4e00\u5b9a\u6982\u7387\u7a7f\u8fc7\u819c\n                        if (Math.random() < 0.03) {\n                            \/\/ \u79fb\u52a8\u5230\u53e6\u4e00\u4fa7\n                            if (this.x < membraneX) {\n                                this.x = membraneX + this.radius + 1;\n                            } else {\n                                this.x = membraneX - this.radius - 1;\n                            }\n                            \n                            \/\/ \u66f4\u65b0\u7c92\u5b50\u5217\u8868\n                            if (leftParticles.includes(this)) {\n                                const index = leftParticles.indexOf(this);\n                                leftParticles.splice(index, 1);\n                                rightParticles.push(this);\n                            } else if (rightParticles.includes(this)) {\n                                const index = rightParticles.indexOf(this);\n                                rightParticles.splice(index, 1);\n                                leftParticles.push(this);\n                            }\n                        } else {\n                            \/\/ \u53cd\u5f39\n                            this.speedX = -this.speedX;\n                        }\n                    }\n                } else {\n                    \/\/ \u80f6\u4f53\u9897\u7c92\u4e0d\u80fd\u7a7f\u8fc7\u819c\n                    if ((this.x < membraneX &#038;&#038; this.x + this.radius >= membraneX) || \n                        (this.x > membraneX && this.x - this.radius <= membraneX)) {\n                        this.speedX = -this.speedX;\n                    }\n                }\n                \n                this.draw(ctx);\n            }\n        }\n        \n        \/\/ \u521d\u59cb\u5316\u6e17\u6790\u573a\u666f\n        function initDialysis() {\n            leftParticles = [];\n            rightParticles = [];\n            \n            const width = dialysisCanvas.width;\n            const height = dialysisCanvas.height;\n            const membraneX = width \/ 2;\n            \n            \/\/ \u5de6\u4fa7\uff1a\u80f6\u4f53\u548c\u6eb6\u6db2\u6df7\u5408\u7269\n            for (let i = 0; i < 15; i++) {\n                const isSolution = Math.random() > 0.5;\n                const radius = isSolution ? 1 : 3;\n                const color = isSolution ? '#3498db' : '#e74c3c';\n                const type = isSolution ? 'solution' : 'colloid';\n                const x = Math.random() * (membraneX - 40) + 25;\n                const y = Math.random() * (height - 50) + 25;\n                \n                leftParticles.push(new DialysisParticle(x, y, radius, color, type));\n            }\n            \n            \/\/ \u53f3\u4fa7\uff1a\u7eaf\u6eb6\u5242\uff08\u6c34\u5206\u5b50\uff09\n            for (let i = 0; i < 10; i++) {\n                const radius = 1;\n                const color = '#2ecc71';\n                const type = 'solution';\n                const x = Math.random() * (width - membraneX - 40) + membraneX + 25;\n                const y = Math.random() * (height - 50) + 25;\n                \n                rightParticles.push(new DialysisParticle(x, y, radius, color, type));\n            }\n        }\n        \n        \/\/ \u7ed8\u5236\u6e17\u6790\u573a\u666f\n        function drawDialysisScene() {\n            const width = dialysisCanvas.width;\n            const height = dialysisCanvas.height;\n            const membraneX = width \/ 2;\n            \n            \/\/ \u6e05\u7a7a\u753b\u5e03\n            dialysisCtx.clearRect(0, 0, width, height);\n            \n            \/\/ \u7ed8\u5236\u5bb9\u5668\n            dialysisCtx.strokeStyle = '#7f8c8d';\n            dialysisCtx.lineWidth = 2;\n            dialysisCtx.strokeRect(15, 15, width - 30, height - 30);\n            \n            \/\/ \u7ed8\u5236\u534a\u900f\u819c\n            dialysisCtx.strokeStyle = 'rgba(52, 152, 219, 0.7)';\n            dialysisCtx.setLineDash([5, 3]);\n            dialysisCtx.lineWidth = 3;\n            dialysisCtx.beginPath();\n            dialysisCtx.moveTo(membraneX, 20);\n            dialysisCtx.lineTo(membraneX, height - 20);\n            dialysisCtx.stroke();\n            dialysisCtx.setLineDash([]);\n            \n            \/\/ \u7ed8\u5236\u9897\u7c92\n            leftParticles.forEach(particle => {\n                particle.update(dialysisCtx, membraneX);\n            });\n            \n            rightParticles.forEach(particle => {\n                particle.update(dialysisCtx, membraneX);\n            });\n            \n            \/\/ \u6dfb\u52a0\u6807\u7b7e\n            dialysisCtx.fillStyle = '#2c3e50';\n            dialysisCtx.font = 'bold 14px Arial';\n            dialysisCtx.fillText('\u80f6\u4f53+\u6eb6\u6db2\u6df7\u5408\u7269', 25, 35);\n            dialysisCtx.fillText('\u534a\u900f\u819c', membraneX - 25, 35);\n            dialysisCtx.fillText('\u7eaf\u6eb6\u5242', membraneX + 20, 35);\n            \n            \/\/ \u6dfb\u52a0\u56fe\u4f8b\n            dialysisCtx.font = '12px Arial';\n            dialysisCtx.fillStyle = '#e74c3c';\n            dialysisCtx.fillText('\u25cf \u80f6\u4f53\u9897\u7c92', width - 120, 35);\n            dialysisCtx.fillStyle = '#3498db';\n            dialysisCtx.fillText('\u25cf \u6eb6\u6db2\u5206\u5b50', width - 120, 55);\n            dialysisCtx.fillStyle = '#2ecc71';\n            dialysisCtx.fillText('\u25cf \u6eb6\u5242\u5206\u5b50', width - 120, 75);\n        }\n        \n        \/\/ \u6e17\u6790\u52a8\u753b\u5faa\u73af\n        function animateDialysis() {\n            drawDialysisScene();\n            \n            if (isDialysisRunning) {\n                dialysisAnimationId = requestAnimationFrame(animateDialysis);\n            }\n        }\n        \n        \/\/ \u4e8b\u4ef6\u76d1\u542c\n        document.getElementById('startFiltration').addEventListener('click', function() {\n            if (!isFiltrationRunning) {\n                isFiltrationRunning = true;\n                this.textContent = '\u6682\u505c\u8fc7\u6ee4';\n                animateFiltration();\n            } else {\n                isFiltrationRunning = false;\n                this.textContent = '\u7ee7\u7eed\u8fc7\u6ee4';\n                cancelAnimationFrame(filtrationAnimationId);\n            }\n        });\n        \n        document.getElementById('resetFiltration').addEventListener('click', function() {\n            isFiltrationRunning = false;\n            cancelAnimationFrame(filtrationAnimationId);\n            document.getElementById('startFiltration').textContent = '\u5f00\u59cb\u8fc7\u6ee4';\n            initFiltration();\n            drawFiltrationScene();\n        });\n        \n        document.getElementById('startDialysis').addEventListener('click', function() {\n            if (!isDialysisRunning) {\n                isDialysisRunning = true;\n                this.textContent = '\u6682\u505c\u6e17\u6790';\n                animateDialysis();\n            } else {\n                isDialysisRunning = false;\n                this.textContent = '\u7ee7\u7eed\u6e17\u6790';\n                cancelAnimationFrame(dialysisAnimationId);\n            }\n        });\n        \n        document.getElementById('resetDialysis').addEventListener('click', function() {\n            isDialysisRunning = false;\n            cancelAnimationFrame(dialysisAnimationId);\n            document.getElementById('startDialysis').textContent = '\u5f00\u59cb\u6e17\u6790';\n            initDialysis();\n            drawDialysisScene();\n        });\n        \n        \/\/ \u521d\u59cb\u5316\n        window.onload = function() {\n            initFiltration();\n            drawFiltrationScene();\n            \n            initDialysis();\n            drawDialysisScene();\n        };\n    <\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>\u6eb6\u6db2\u3001\u80f6\u4f53\u3001\u6d4a\u6db2\u7684\u5206\u79bb\u539f\u7406\u6a21\u62df \u6eb6\u6db2\u3001\u80f6\u4f53\u3001\u6d4a\u6db2\u7684\u5206\u79bb\u539f\u7406\u6a21\u62df \u901a\u8fc7\u52a8\u753b\u6f14\u793a\u7406\u89e3\u4e09\u79cd\u5206\u6563\u7cfb\u7684\u7279\u5f81\u53ca\u5206\u79bb\u65b9\u6cd5\uff1a\u8fc7 [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-167","post","type-post","status-publish","format-standard","hentry","category-1"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.aihx.top\/index.php?rest_route=\/wp\/v2\/posts\/167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aihx.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aihx.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aihx.top\/index.php?rest_route=\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aihx.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=167"}],"version-history":[{"count":3,"href":"https:\/\/www.aihx.top\/index.php?rest_route=\/wp\/v2\/posts\/167\/revisions"}],"predecessor-version":[{"id":173,"href":"https:\/\/www.aihx.top\/index.php?rest_route=\/wp\/v2\/posts\/167\/revisions\/173"}],"wp:attachment":[{"href":"https:\/\/www.aihx.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aihx.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aihx.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}