电场矢量合成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
相关产品推荐
相关产品推荐

