我正在研究一个显示激光束的项目,它是通过反射的路径。当一个实体被激光击中时,它会调用实体alterLaser(Laser r)方法。为了创建反射光线,我必须调用Laser.createNew(x,y,逆时针角度(+ x))。我的问题是我可以很容易地找到反射角,但我不知道如何找到相对于x轴的角度。
我首先尝试在激光和镜子两个矢量之间找到锐角,但我不知道它与x轴之间是否存在直接关系。在搜索互联网后,我发现了这个公式:
r = i + 2s - 180
其中r是反射光线与X轴的夹角。 i是初始光线与x轴的夹角,s是反射光线与x轴的夹角;
我发现这个公式不起作用,但在我尝试过的情况下,它给出了与预期象限不同的象限。但这带来了找到它所在的象限的新问题。
这里是我目前的代码:
@Override
protected void alterLaser(Laser r) {
Vec laser = new Vec(r.getStartX(),r.getStartY(),r.getEndX(),r.getEndY());
Vec mirror = new Vec(this.getStartX(),this.getStartY(),this.getEndX(),this.getEndY());
double theta,thetaq2,thetaq3,thetaq4;
theta = laser.angle() + (2 * mirror.absAngle()) - 180;
theta = Vec.absTheta(theta);
thetaq2 = 180-theta;
thetaq3 = theta+180;
thetaq4 = 360-theta;
Laser.createNew(r.getEndX(),r.getEndY(),theta,null,this);
Laser.createNew(r.getEndX(),r.getEndY(),thetaq2,null,this);
Laser.createNew(r.getEndX(),r.getEndY(),thetaq3,null,this);
Laser.createNew(r.getEndX(),r.getEndY(),thetaq4,null,this);
}
}
答案 0 :(得分:0)
在Java中找到向量相对于正x轴逆时针方向的最简单方法是使用Math.atan2函数。 https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#atan2(double,%20double)
这会将值-pi
放到pi
,这样您就不必担心不同象限的特殊包装。