2011-03-05 4 views
2

한 교차에서 다른 교차로 회전을 계산하려고합니다. 십자가에있는 선들 사이의 대응은 알려져있다.회전 계산 알고리즘

시계 방향 또는 반 시계 방향으로 180도 내에서 회전을 계산해야하며 현재 90도 내에서 계산할 수 있지만 알고리즘은 더 큰 값으로 실패합니다. 문제는 A = 350 및 A '= 80과 같이 일치하는 베어링이 약 360도 회전 할 때인 것처럼 보입니다. 십자가의 각 선에 대해 이것을 반복하면 잘못된 총 회전이 계산됩니다.

알고리즘은 현재 두 줄 사이의 회전을 비교하기 위해 다음과 같이 작동합니다. 여기서 crossB와 crossA는 각각의 교차점에 해당하는 베어링입니다.

   if ((crossB < 360 && crossB >= 270) 
        && (crossA >= 0 && crossA < 90)) 
       { 
        angle = -((360) - crossB) - crossA; 
       } 
       else if ((crossA < 360 && crossA >= 270) 
        && (crossB >= 0 && crossB < 90) 
       { 
        angle = crossB + (360 - crossA); 
       } 
       else 
       { 
        angle = crossB - crossA; 
       } 

알고리즘을 개선하거나 변경하여 회전을 결정할 수있는 방법에 대한 의견이 있으십니까?

+0

입력이 0과 360 사이에 오도록하려면 모듈러스 연산자 (%)를 사용하여 해당 범위에 있는지 확인하십시오. 'int deg = val % 360;' - 그것은 val에서 값을 취하고 360에서 val을 360으로 나누고 나머지를 deg로 지정합니다. –

+0

위의 알고리즘이 평균을 계산하기 위해 각 해당 라인 사이의 각도를 확인하기 때문에 항상 360도 이내입니다. 그러나 정확한 회전을 제공하지 않는 베어링의 특정 변경 사항이 있습니다. –

답변

2

정확하게 이해하면 벡터가 베어링 각도 (도)로 표현되는 두 벡터 사이의 최소 각도를 찾고 싶습니다. 그런 경우가 있다면 당신은 빼기 당신이 그것을 수행 생각 방식으로 작동 NASA's open source WorldWind project

/** 
* Computes the shortest distance between this and angle, as an angle. 
* 
* @param angle the angle to measure angular distance to. 
* 
* @return the angular distance between this and <code>value</code>. 
*/ 
public Angle angularDistanceTo(Angle angle) 
{ 
    if (angle == null) 
    { 
     String message = Logging.getMessage("nullValue.AngleIsNull"); 
     Logging.logger().severe(message); 
     throw new IllegalArgumentException(message); 
    } 

    double differenceDegrees = angle.subtract(this).degrees; 
    if (differenceDegrees < -180) 
     differenceDegrees += 360; 
    else if (differenceDegrees > 180) 
     differenceDegrees -= 360; 

    double absAngle = Math.abs(differenceDegrees); 
    return Angle.fromDegrees(absAngle); 
} 

에서 다음 코드를 사용할 수 있어야합니다. 알고리즘은 객체 지향적이지 않은 접근 방식에 쉽게 적응할 수 있어야합니다.

+0

감사합니다. 이 시도 =] –

+0

위대한 작품, 고마워요! –

+0

다행 당신을 위해 일했다. – I82Much