2011-10-31 15 views

Respuesta

26

Estos son los pasos necesarios para hacer girar un punto alrededor de otro punto por un ángulo alfa:

  1. Traducir el punto por el negativo de el punto
  2. pivote Girar el punto usando la ecuación estándar para 2-D (o 3-d) rotación
  3. Traducir volver

la ecuación estándar para la rotación es:

x '= x cos (alfa) - Y sen (alfa)

y' = x sen (alfa) + y cos (alpha)

Tomemos el ejemplo del Punto (15,5) alrededor del Punto (2,2) por 45 grados.

En primer lugar, traducir:

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

Ahora gire por 45 °:

v = (13 * cos 45 ° - 3 * sen 45 °, 13 ° * sen 45 + 3 * cos 45 °) = (7,07 .., .. 11.31)

Y, por último, traducir vuelta:

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

Nota: Los ángulos deben especificarse en radianes, por lo que multiplica el número de grados por Pi/180

+0

Gracias . Problema resuelto. – user1021793

+0

Bienvenido a Stack Overflow. Si una respuesta resuelve tu problema, debes aceptarlo. Por favor [lea sobre aceptar respuestas] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – SSteve

+3

+1 para una buena respuesta, aunque evitaría usar 45 ° como caso de prueba ya que el seno y el coseno son iguales. –

2

Si ya tiene puntos en forma de RotatedRect, puede cambiar el ángulo de la misma para hacer girar los puntos.

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

Esto podría ayudar

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

Para rotar el punto p1 = (x1, y1) alrededor p (x0, y0) por el ángulo a:

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

donde (x2, y2) es la nueva ubicación del punto de p1

1

que estaba buscando para la trans formación de cualquier coordenada de píxel de una imagen y no podría encontrarlo al buscar en Google.De alguna manera me encontré con un enlace de código Python, que funciona correctamente y que me ayudó a entender el problema: https://cristianpb.github.io/blog/image-rotation-opencv

El siguiente es el código correspondiente C++, si alguien lo está buscando:

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