2014-06-11 1 views
0

이 문제를 설명하기 위해 아래 그림을 예로 들어 설명합니다.몸체를 따라 강체에 지정된 점을 변환하는 방법은 무엇입니까?

여기서 알 수있는 바와 같이, 라인 AB 및 그 할당 포인트 p1이있다. 이 줄에는 CD라는 해당 줄이 있습니다. 나는 점 p2의 좌표를 찾고있다. 점 p2와 선 CD의 관계는 점 p1과 선 AB 사이의 관계 (같은 거리 d와 같은 길이 m)와 같아야합니다. 나는 점 A, B, P1, C, D의 좌표를 가지고 있으며 p2를 찾고 있습니다. 일반적으로, d와 m은 CD와 p2의 축척 인수를 받아 들일 수 있습니다.

아시다시피, 문제는 라인 CD의 왼쪽에있는 p3과 같은 또 다른 가짜 해결책을 가지고 있습니다. 우리는이를 피해야합니다.

제 실제 문제는 10 줄의 AB와 500 줄 정도의 점이 서로 다른 줄 AB에 p1과 같은 것입니다. 나는 10 개의 대응하는 선 CD를 가지고 있는데, 나는 500 개의 대응 지점 p2를 찾고있다.

대수와 기하학을 사용하여 문제를 해결할 수 있지만 C++에서 구현하기위한 빠르고 효율적인 방법을 찾고 있습니다.

귀하의 의견과 제안에 대해 진심으로 감사드립니다. 모든

enter image description here

+0

는이 숙제를 스스로 해결에서 어떤 시도를 했습니까? –

+0

이건 숙제가 아니야, 친애하는 @PaulEvans. 그것은 큰 문제의 일부입니다. 앞에서 언급했듯이, 대수적이고 기하학적 인 해법은 분명히 있습니다. 그러나 가능한 한 빨리 대수를 찾으려고합니다. – aryodgh

+1

이것은 수학 문제처럼 보입니다. 프로그래밍 문제는 아닙니다. – MrFlick

답변

1

첫째, 당신은 편의를 위해 A 점과 같은 단일 지점에 대한 회전 및 번역, 같은 AB의 움직임을 표현해야합니다. 그런 다음 AB와 함께 회전해야하는 다른 점에 대해서는 점 A를 빼서 AB 점의 공간으로 이동 한 다음 변환 후 새 점 A를 다시 추가하여 다시 월드 공간으로 변환해야합니다 및 회전.

나는 atm에 수식을 쓰지 않지만, ill는 예제를 파헤 치려고합니다.

편집
테스트되지 않은 코드 :

void transform_points(const point2f &center, vector<point2f> &points, const point2f &offset, float angle) 
{ 
    // transform points into a space where 'center' is the origin 
    mat3f to_origin = mat3f(1, 0, -center.x, 
          0, 1, -center.y, 
          0, 0, 1); 

    // rotate the points around the origin 
    mat3f rot = mat3f(cos(angle), -sin(angle), 0, 
         sin(angle), cos(angle), 0, 
         0, 0, 1); 

    // move the points back into world space 
    mat3f to_world = mat3f(1, 0, center.x, 
          0, 1, center.y, 
          0, 0, 1); 

    // offset the points by 'offset' 
    mat3f off = mat3f(1, 0, offset.x, 
         0, 1, offset.y, 
         0, 0, 1); 

    // concatenate all transformations for efficiency 
    mat3f xform = off * to_world * rot * to_origin; 

    // this loop could be parallelized using SIMD or multiple cores 
    for(auto &p : points) 
     p = xform * p; 
}