You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

电场矢量合成16种旋转场景实现求助(附JavaScript代码)

电场可视化合矢量角度计算问题

我正在实现电场可视化功能,目前已接近预期效果,但需要处理16种旋转场景,目前仅完成第13-16种,其余12种场景的合矢量角度计算逻辑还没搞定。

项目使用3个canvas箭头:

  • 绿色箭头:代表绿色电荷产生的电场线
  • 蓝色箭头:对应蓝色电荷的电场线
  • 白色箭头:表示合矢量

旋转场景共16种,对应两个箭头在不同象限的组合情况,第13-16种是两个箭头处于同一象限的场景,这部分的合矢量角度计算逻辑已实现,但其余跨象限的12种场景逻辑缺失。

现有相关JavaScript代码如下:

let angle1;
    let angle2;

    let e1x;
    let e1y;
    let e2x;
    let e2y;

    let eRx;
    let eRy;

    let resultantAngle;

    if(q1Value && q2Value > 0){

        canvas1.style.transform = `rotate(${positivo1}deg)`;
        canvas2.style.transform = `rotate(${positivo2}deg)`;

        if(positivo1 > 0 && positivo1 < 90){
            angle1 = positivo1;
        }
        if(positivo1 > 90 && positivo1 < 180){
            angle1 = 180 - positivo1;
        }
        if(positivo1 > 180 && positivo1 < 270){
            angle1 = positivo1 - 180;
        }
        if(positivo1 > 270 && positivo1 < 360){
            angle1 = 360 - positivo1;
        }
        
        if(positivo2 > 0 && positivo2 < 90){
            angle2 = positivo2;
        }
        if(positivo2 > 90 && positivo2 < 180){
            angle2 = 180 - positivo2;
        }
        if(positivo2 > 180 && positivo2 < 270){
            angle2 = positivo2 - 180;
        }
        if(positivo2 > 270 && positivo2 < 360){
            angle2 = 360 - positivo2;
        }

        e1x = e1*Math.cos(angle1*Math.PI/180);
        e1y = e1*Math.sin(angle1*Math.PI/180);
        e2x = e2*Math.cos(angle2*Math.PI/180);
        e2y = e2*Math.sin(angle2*Math.PI/180);

        eRx = e1x + e2x;
        eRy = e1y + e2y;

        let resultant = Math.sqrt(Math.pow(eRx,2)+Math.pow(eRy,2));

        let tanAlpha = eRy/eRx;
        let alpha = (Math.atan(tanAlpha) * 180 / Math.PI);

        //13
        if((positivo1 && positivo2 > 0) && (positivo1 && positivo2 < 90)){ 
            resultantAngle = alpha;
        }
        //14
        if((positivo1 && positivo2 > 90) && (positivo1 && positivo2 < 180)){ 
            resultantAngle = 180 - alpha;
        }
        //15
        if((positivo1 && positivo2 > 180) && (positivo1 && positivo2 < 270)){ 
            resultantAngle = alpha - 180;
        }
        //16
        if((positivo1 && positivo2 > 270) && (positivo1 && positivo2 < 360)){ 
            resultantAngle = 360 - alpha;
        }
        

        //1
        if((positivo1 > 0 && positivo1 < 90) && (positivo2 > 90 && positivo2 < 180)){
            resultantAngle
        }
        //2
        if((positivo1 > 0 && positivo1 < 90) && (positivo2 > 180 && positivo2 <270)){
            resultantAngle
        }
        //3
        if((positivo1 > 0 && positivo1 < 90) && (positivo2 > 270 && positivo2 < 360)){
            resultantAngle
        }

        //4
        if((positivo1 > 90 && positivo1 < 180) && (positivo2 > 0 && positivo2 < 90)){
            resultantAngle
        }

        //5
        if((positivo1 > 90 && positivo1 < 180) && (positivo2 > 180 && positivo2 < 270)){
            resultantAngle
        }
        //6
        if((positivo1 > 90 && positivo1 < 180) && (positivo2 > 270 && positivo2 < 360)){
            resultantAngle
        }

        //7
        if((positivo1 > 180 && positivo1 < 270) && (positivo2 > 0 && positivo2 < 90)){
            resultantAngle
        }
        //8
        if((positivo1 > 180 && positivo1 < 270) && (positivo2 > 90 && positivo2 < 180)){
            resultantAngle
        }
        //9
        if((positivo1 > 180 && positivo1 < 270) && (positivo2 > 270 && positivo2 < 360)){
            resultantAngle
        }

        //10
        if((positivo1 > 270 && positivo1 < 360) && (positivo2 > 0 && positivo2 < 90)){
            resultantAngle
        }
        //11
        if((positivo1 > 270 && positivo1 < 360) && (positivo2 > 90 && positivo2 < 180)){
            resultantAngle
        }
        //12
        if((positivo1 > 270 && positivo1 < 360) && (positivo2 > 180 && positivo2 < 270)){
            resultantAngle
        }
        canvas3.style.transform = `rotate(${resultantAngle}deg)`
        
    }
});

内容的提问来源于stack exchange,提问作者Nashe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:20:39