Girar un punto por otro punto en 2D

Quiero saber cómo calcular las nuevas coordenadas para un punto cuando se gira en un ángulo relativo a otro punto.

Tengo una flecha de bloque y quiero rotarla con un ángulo theta relativo a un punto en el medio de la base de la flecha.

Esto es necesario para permitirme dibujar un polígono entre 2 controles en pantalla. No puedo usar y rotar una imagen.

De lo que he considerado hasta ahora lo que complica aún más el asunto es que el origen de una pantalla está en la esquina superior izquierda.

Si gira el punto (px, py) alrededor del punto (ox, oy) por el ángulo theta obtendrá:

 p'x = cos (theta) * (px-ox) - sin (theta) * (py-oy) + buey
 p'y = sin (theta) * (px-ox) + cos (theta) * (py-oy) + oy

Si está utilizando GDI + para hacer eso, puede usar los métodos de Transform del objeto Graphics :

 graphics.TranslateTransform(point of origin); graphics.RotateTransform(rotation angle); 

Luego dibuja las cosas reales.

Si tiene el espacio de nombres System.Windows.Media disponible, puede usar las transformaciones integradas:

  using System.Windows.Media; var transform = new RotateTransform() {Angle = angleInDegrees, CenterX = center.X, CenterY = center.Y}; var transformedPoint = transform.Transform(point);