2017-10-13 6 views
0

레이저 빔을 표시하는 프로젝트에서 작업 중이며 반사를 통과하는 경로입니다. 엔티티가 레이저에 부딪 치면 엔티티는 alterLaser (Laser r) 메소드를 호출합니다. 반사 광선을 만들기 위해서는 Laser.createNew (x, y, (+ x)의 시계 반대 방향으로 각도를) 호출해야합니다. 내 문제는 반사 각도를 쉽게 찾을 수 있지만 x 축과 관련된 각도를 찾는 방법을 모른다.x 축에 대한 반사 각도 찾기

나는 두 개의 벡터 레이저와 거울 사이의 예각을 먼저 찾았지만 그와 x 축 사이에는 직접적인 관계가 있는지 알지 못합니다. 인터넷을 검색 한 후이 화학식 I을 발견

은 R = 1은 2 초를 + - 180 (R)은 반사 된 광선이 X 축과 이루는 각도이다

. i는 초기 광선이 x 축과 이루는 각도이고, s는 반사 광선이 x 축과 이루는 각도입니다.

이 공식은 효과가 없었지만 의도 한 사분면과 다른 사분면에서 theta를주는 경우에 사용했습니다. 그러나 그것은에 사분면 발견의 새로운 문제를 야기 여기

내 현재 코드를 살펴이다.

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

} 

}

+1

이 질문은 수학 질문과 같아서 https://math.stackexchange.com/ – Andreas

답변

0

벡터를 각도를 찾기 위해 자바에서 가장 쉬운 방법 양의 x 축에 대해 반 시계 방향으로 만드는 것은 Math.atan2 함수를 사용하는 것입니다. https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#atan2(double,%20double)

이 값은 -pi에서 pi 범위의 값을 입력하므로 다른 사분면을 대문자로 지정할 필요가 없습니다.

+0

에 문의해야합니다. 응답을 보내 주셔서 감사합니다. 그러나 x 축과 관련된 반사 각도를 찾으려고합니다. 시도한 공식에서 주어진 유일한 변수는 각도입니다. 그리고 거울과 빔 사이에 각도가 있으면 x 축과 어떻게 관련이 있는지 알 수 없습니다. –

+0

@ConorMurphy 당신이 무엇을 요구하고 있는지 불분명합니다. 문제를 보여주는 사진을 게시 할 수 있습니까? – MFisherKDX