2011-10-31 83 views

回答

26

這是由α角,以繞另一點一個點所需要的步驟:

  1. 由負轉換點樞軸點
  2. 使用標準方程旋轉二維(或三維)旋轉點
  3. 轉換回

旋轉的標準方程是:

X '= X COS(阿爾法) - Ý罪(阿爾法)

Y'= X 罪(阿爾法)+ Y COS( alpha)

讓我們以點(2,2)的點(15,5)爲例來說明45度。

首先,翻譯:

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

現在,通過45°旋轉:

V =(13 * COS 45° - 3 *罪45°,13 *罪45°+ 3 *餘弦45°)=(7.07 ..,11.31 ..)

最後,轉換回:

v = v + (2,2)=(9.07 ..,13.31 ..)

注:角必須用弧度指定,因此受到Pi/180

+0

謝謝。問題解決了。 – user1021793

+0

歡迎來到Stack Overflow。如果答案解決了你的問題,你應該接受它。請[閱讀關於接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – SSteve

+3

+1爲好的答案,但我會避免使用45°作爲測試用例,因爲正弦和餘弦相同。 –

2

乘以多少度如果你已經有了點的RotatedRect形式,你可以改變它的角度旋轉點。

//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

這可能有助於

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

要通過角a旋轉點p1 = (x1, y1)各地p (x0, y0)

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

其中(x2, y2)是點的新位置p1

1

我一直在尋找爲反式形成一個圖像的任何像素座標,我很難找到它的搜索結果。不知怎的,我發現其正常工作,並且幫助我理解這個問題Python代碼一個鏈接: https://cristianpb.github.io/blog/image-rotation-opencv

下面是相應的C++代碼,如果有一個人正在尋找它:

// 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]); 
    }