简体   繁体   中英

find angle of reflection relative to x-axis

I am working on a project that displays a laser beam and it's path through reflections. When an entity is hit by a laser it calls the entities alterLaser(Laser r) method. In order to create a reflecting ray I must call Laser.createNew(x,y,angle counter clockwise of (+x)). My problem is that I can find the angle of reflection easily but I don't know how to find that angle relative to the x-axis.

I first tried finding the acute angle in between the two vectors laser and mirror but I do not know if there is a direct relationship between that and the x-axis. After searching the internet I found this formula:

r = i + 2s - 180

where r is the angle the reflected ray makes with the X-axis. i is the angle the initial ray makes with the x-axis and s is the angle the reflected ray makes with the x-axis;

I found this formula wasn't working, but in the cases I tried it was giving theta in a different quadrant than the intended quadrant. But that poses the new problem of finding which quadrant it is in.

here is a look at my current code:

@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);

}

}

The easiest way in Java to find the angle a vector makes counterclockwise with respect to positive x axis is to use the Math.atan2 function. https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#atan2(double,%20double)

This will put the value on the range -pi to pi so you don't have to worry about special casing the different quadrants.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM