2011-10-31 65 views

Trả lời

26

Đây là những bước cần thiết để xoay một điểm xung quanh điểm khác bằng một góc alpha:

  1. Dịch điểm bởi những tiêu cực của điểm pivot
  2. Xoay điểm bằng phương trình chuẩn cho xoay 2-d (hoặc 3-d)
  3. Dịch ngược

Phương trình tiêu chuẩn cho luân chuyển là:

x '= x cos (alpha) - y sin (alpha)

y' = x sin (alpha) + y cos (alpha)

Hãy lấy ví dụ về điểm (15,5) xung quanh điểm (2,2) 45 độ.

Thứ nhất, dịch:

v = (15,5) - (2,2) = (13,3)

Bây giờ xoay 45 °:

v = (13 * cos 45 ° - 3 * sin 45 °, 13 * sin 45 ° + 3 * cos 45 °) = (7.07 .., 11,31 ..)

Và cuối cùng, dịch lại:

v = v + (2,2) = (9,07 .., 13,31 ..)

Lưu ý: Angles phải được xác định trong radian, vì vậy nhân số độ bởi Pi/180

+0

Cảm ơn bạn . Đã giải quyết được sự cố. – user1021793

+0

Chào mừng bạn đến với Stack Overflow. Nếu câu trả lời giải quyết được vấn đề của bạn, bạn nên chấp nhận nó. Vui lòng [đọc về chấp nhận câu trả lời] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – SSteve

+3

+1 cho một câu trả lời tốt, mặc dù tôi muốn tránh sử dụng 45 ° như một trường hợp thử nghiệm như sin và cosin là như nhau. –

2

Nếu bạn đã có điểm theo hình thức RotatedRect, bạn có thể thay đổi góc của nó để xoay điểm.

//RotatedRect myRect; 
Point2f oldPoints[4]; 
myRect.points(oldPoints); //gives existing points of the rectangle. 
myRect.angle = 0;   //change the angle. 
Point2f newPoints[4]; 
myRect.points(newPoints); //gives rotated points of the rectangle. 
2

này có thể giúp

cv::Point2f rotate2d(const cv::Point2f& inPoint, const double& angRad) 
{ 
    cv::Point2f outPoint; 
    //CW rotation 
    outPoint.x = std::cos(angRad)*inPoint.x - std::sin(angRad)*inPoint.y; 
    outPoint.y = std::sin(angRad)*inPoint.x + std::cos(angRad)*inPoint.y; 
    return outPoint; 
} 

cv::Point2f rotatePoint(const cv::Point2f& inPoint, const cv::Point2f& center, const double& angRad) 
{ 
    return rotate2d(inPoint - center, angRad) + center; 
} 
6

Để xoay điểm p1 = (x1, y1) xung quanh p (x0, y0) bởi góc a:

x2 = ((x1 - x0) * cos(a)) - ((y1 - y0) * sin(a)) + x0; 
y2 = ((x1 - x0) * sin(a)) + ((y1 - y0) * cos(a)) + y0; 

nơi (x2, y2) là vị trí mới của điểm p1

1

tôi đang tìm kiếm cho trans hình thành bất kỳ tọa độ pixel nào của một Hình ảnh và tôi khó có thể tìm thấy điều đó bằng cách googling nó.Bằng cách nào đó tôi tìm thấy một liên kết mã python mà làm việc một cách chính xác và điều này đã giúp tôi hiểu vấn đề: https://cristianpb.github.io/blog/image-rotation-opencv

Sau đây là C++ mã tương ứng, nếu một số một là tìm kiếm nó:

// send the original angle and don't transform in radian 
    cv::Point2f rotatePointUsingTransformationMat(const cv::Point2f& inPoint, const cv::Point2f& center, const double& rotAngle) 
    { 
     cv::Mat rot = cv::getRotationMatrix2D(center, rotAngle, 1.0); 
     float cos = rot.at<double>(0,0); 
     float sin = rot.at<double>(0,1); 
     int newWidth = int(((center.y*2)*sin) + ((center.x*2)*cos)); 
     int newHeight = int(((center.y*2)*cos) + ((center.x*2)*sin)); 

     rot.at<double>(0,2) += newWidth/2.0 - center.x; 
     rot.at<double>(1,2) += newHeight/2.0 - center.y; 

     int v[3] = {static_cast<int>(inPoint.x),static_cast<int>(inPoint.y),1}; 
     int mat3[2][1] = {{0},{0}}; 

     for(int i=0; i<rot.rows; i++) 
     { 
      for(int j=0; j<= 0; j++) 
      { 
       int sum=0; 
       for(int k=0; k<3; k++) 
       { 
        sum = sum + rot.at<double>(i,k) * v[k]; 
       } 
       mat3[i][j] = sum; 
      } 
     } 
     return Point2f(mat3[0][0],mat3[1][0]); 
    } 
Các vấn đề liên quan