2016-10-02 5 views
0

2 벡터의 회전을 사용하려고하지만 두 가지 문제가 있습니다. 먼저 벡터가 뒤쪽으로 회전하는 것처럼 보이고 두 번째로 벡터가 회전 할 때 두 영역 사이를 건너 뜁니다. 오히려, 내가 벡터를 회전하려면 다음을 사용하는 경우2 개의 벡터를 회전시켜 역방향으로 이동하고 영역을 건너 뜁니다. C#

public double radians() 
{ 
    return Math.Atan2(y, x); 
} 

public double len() 
{ 
    return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)); 
} 

public vector mul(double d) 
{ 
    return new vector(x * d, y * d); 
} 

public vector div(double d) 
{ 
    return new vector(x/d, y/d); 
} 

public vector unit() 
{ 
    return div(len()); 
} 

public vector rotate(vector v) 
{ 
    double theta = v.radians(); 

    return new vector(
     x * Math.Cos(theta) - y * Math.Sin(theta), 
     x * Math.Cos(theta) + y * Math.Sin(theta)) 
     .unit().mul(len()); // without this, the rotated vector is smaller than the original 
} 

,이 시계 반대 방향으로 회전 :

의 (a double xdouble y와 벡터 클래스) 나는 회전을 위해 사용하고있는 코드입니다 시계 방향보다 나는 그것이해야한다고 생각한다. 또한 내가 그것을해야 생각하는 것보다 더 많은 회전

original vector in gold, rotated in blue

: 이미지를 보여주기 위해. 설명하기가 더 어려운 또 다른 문제는 회전이 스팬의 약 4 분의 2 이상에서 원활하게 작동하지만 다른 두 개는 건너 뜁니다. 내가 발견 한 또 다른 문제는 벡터가 회전하는 각도가 작 으면 (내 테스트에서 과거 (1, 10)), 회전은 강하게 시작하지만 속도가 느려지고 결국 멈추는 것입니다. 이것은 C#의 double과 같은 정밀한 문제처럼 보였습니다. 그러나 회전 된 벡터의 길이가 변경되지 않도록 수정하여 문제를 해결하려고했습니다.

어쨌든 내 문제 중 하나 또는 모두의 원인을 발견 할 수 있다면 대단히 감사하겠습니다.

답변

0

나는 radians()rotate() 기능을 변경하여 나의 문제를 해결했다. 다른 기능은 훌륭했습니다.

radians()

고정 :

public double radians() 
{ 
    return Math.Atan2(x, y); // swap the x and y 
} 

rotate() 고정 :

public vector rotate(vector v) 
{ 
    double theta = v.radians(); 

    // use the clockwise rotation matrix: 
    // | cos(theta) sin(theta) | 
    // | -sin(theta) cos(theta) | 
    return new vector(
     x * Math.Cos(theta) + y * Math.Sin(theta), 
     x * -Math.Sin(theta) + y * Math.Cos(theta)); 
} 

은 스킵 거꾸로 회전 길이 단축과 정지를 고정.

호프가 나를 좋아하는 사람에게 도움이되기를 바랍니다.