正弦波参数调节

正弦波参数调节

<div class="control">
    <label>振幅 A: <span id="a-val">1.0</span></label>
    <input type="range" id="a" min="0" max="2" step="0.1" value="1">
</div>

<div class="control">
    <label>角频率 ω: <span id="w-val">1.0</span></label>
    <input type="range" id="w" min="0.1" max="4" step="0.1" value="1">
</div>

<div class="control">
    <label>相位 φ: <span id="p-val">0.0</span></label>
    <input type="range" id="p" min="-3.14" max="3.14" step="0.1" value="0">
</div>

<canvas id="wave"></canvas>
<div class="watermark">橄榄树教育</div>

<script>
    // 动态设置Canvas分辨率
    const canvas = document.getElementById('wave');
    const ctx = canvas.getContext('2d');
    
    function resizeCanvas() {
        const devicePixelRatio = window.devicePixelRatio || 1;
        const width = canvas.clientWidth * devicePixelRatio;
        const height = canvas.clientHeight * devicePixelRatio;
        
        if (canvas.width !== width || canvas.height !== height) {
            canvas.width = width;
            canvas.height = height;
            draw(); // 分辨率变化时重绘
        }
    }
    
    // 初始绘制函数
    function draw() {
        const A = parseFloat(document.getElementById('a').value);
        const ω = parseFloat(document.getElementById('w').value);
        const φ = parseFloat(document.getElementById('p').value);
        
        // 更新显示值
        document.getElementById('a-val').textContent = A.toFixed(1);
        document.getElementById('w-val').textContent = ω.toFixed(1);
        document.getElementById('p-val').textContent = φ.toFixed(1);
        
        // 清空画布
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        
        // 绘制坐标轴(适配高DPI设备)
        ctx.beginPath();
        ctx.strokeStyle = '#999';
        ctx.lineWidth = 2;
        ctx.moveTo(0, canvas.height/2);
        ctx.lineTo(canvas.width, canvas.height/2);
        ctx.moveTo(canvas.width/2, 0);
        ctx.lineTo(canvas.width/2, canvas.height);
        ctx.stroke();
        
        // 绘制正弦波(使用物理像素坐标)
        ctx.beginPath();
        ctx.strokeStyle = 'blue';
        ctx.lineWidth = 3;
        
        const scale = canvas.width / 600 * 50; // 动态缩放比例
        for(let x = 0; x < canvas.width; x++) {
            const xVal = (x - canvas.width/2) / scale;
            const y = canvas.height/2 - A * scale * Math.sin(ω * xVal + φ);
            ctx.lineTo(x, y);
        }
        ctx.stroke();
    }
    
    // 添加事件监听
    document.querySelectorAll('input').forEach(slider => {
        slider.addEventListener('input', draw);
    });
    
    // 响应式处理
    window.addEventListener('resize', () => {
        resizeCanvas();
    });
    
    // 初始化
    resizeCanvas();
    draw();
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值