una sobre rotar rotacion respecto punto grados figura como aplicar c# rotation gdi trigonometry

c# - sobre - Girar un punto alrededor de otro punto



rotar un punto (2)

Tengo una tarea para dibujar un gráfico específico. Como parte de esta tarea, necesito rotar algunos puntos en 45 grados.

Ya pasé 2 días tratando de calcular una fórmula, pero no pude hacerlo bien. He estado buscando por todo el lugar, incluido este sitio web en particular, me estoy acercando mucho, pero todavía no estoy allí.

Aquí está: necesito dibujar 4 puntos diferentes

Tengo una fórmula específica para calcular la posición allí, que está fuera del alcance de la pregunta, pero esto es lo que estoy obteniendo de ello:

int radius = 576; int diameter = radius * 2; Point blueA = new Point(561, 273); Point greenB = new Point(273, 561); Point yellowC = new Point (849, 561); Point redD = new Point (561, 849);

Ahora necesito rotar estos puntos en 45 grados. Utilizo el siguiente código para lograrlo:

double rotationAngle = 45; double rotationRadians = rotationAngle * (Math.PI / 180); int center = radius; result.X = (int)(Math.Cos(rotationRadians) * ((double)result.X - (double)center) - (double)Math.Sin(rotationRadians) * ((double)result.Y - center) + (double)center); result.Y = (int)(Math.Sin(rotationRadians) * ((double)result.X - (double)center) + (double)Math.Cos(rotationRadians) * ((double)result.Y - center) + (double)center);

Pero eso es lo que estoy consiguiendo:

Cualquier ayuda sería muy apreciada.


El problema es int center = radius que está configurando int radius = 576 . Esto no tiene sentido ya que seguramente está girando alrededor de un punto que debería tener una ubicación x e y.

Dado que está girando alrededor del origen, el centro x e y deben ser 0 no 576 .

Así que, dado eso, intente esto.

/// <summary> /// Rotates one point around another /// </summary> /// <param name="pointToRotate">The point to rotate.</param> /// <param name="centerPoint">The center point of rotation.</param> /// <param name="angleInDegrees">The rotation angle in degrees.</param> /// <returns>Rotated point</returns> static Point RotatePoint(Point pointToRotate, Point centerPoint, double angleInDegrees) { double angleInRadians = angleInDegrees * (Math.PI / 180); double cosTheta = Math.Cos(angleInRadians); double sinTheta = Math.Sin(angleInRadians); return new Point { X = (int) (cosTheta * (pointToRotate.X - centerPoint.X) - sinTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.X), Y = (int) (sinTheta * (pointToRotate.X - centerPoint.X) + cosTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.Y) }; }

Utilizar como tal.

Point center = new Point(0, 0); Point newPoint = RotatePoint(blueA, center, 45);

Obviamente, si el punto central siempre es 0,0 , puede simplificar la función en consecuencia, o bien hacer que el punto central sea opcional a través de un parámetro predeterminado, o sobrecargando el método. Probablemente también querrá encapsular algunas de las matemáticas reutilizables en otros métodos estáticos también.

p.ej

/// <summary> /// Converts an angle in decimal degress to radians. /// </summary> /// <param name="angleInDegrees">The angle in degrees to convert.</param> /// <returns>Angle in radians</returns> static double DegreesToRadians(double angleInDegrees) { return angleInDegrees * (Math.PI / 180); } /// <summary> /// Rotates a point around the origin /// </summary> /// <param name="pointToRotate">The point to rotate.</param> /// <param name="angleInDegrees">The rotation angle in degrees.</param> /// <returns>Rotated point</returns> static Point RotatePoint(Point pointToRotate, double angleInDegrees) { return RotatePoint(pointToRotate, new Point(0, 0), angleInDegrees); }

Utilizar como tal.

Point newPoint = RotatePoint(blueA, 45);

Finalmente, si está utilizando el GDI, también puede simplemente hacer un RotateTransform . Consulte: http://msdn.microsoft.com/en-us/library/a0z3f662.aspx

Graphics g = this.CreateGraphics(); g.TranslateTransform(blueA); g.RotateTransform(45);


Tu matemática me parece extraña. Creo que dx = r * Cos (theta) y dy = r * Sin (theta).

Aquí hay un pequeño programa que escribí porque esto me molestaba, y no he hecho matemáticas hace años.

Point center = new Point() { X = 576, Y = 576 }; Point previous = new Point() { X = 849, Y=561 }; double rotation = 45; double rotationRadians = rotation * (Math.PI / 180); //get radius based on the previous point and r squared = a squared + b squared double r = Math.Sqrt(Math.Pow(previous.X - center.X, 2) + Math.Pow(previous.Y - center.Y, 2)); Console.WriteLine("r = " + r.ToString()); //calculate previous angle double previousAngle = Math.Atan((previous.Y - center.Y) / (previous.X - center.X)); Console.WriteLine("Previous angle: " + previousAngle.ToString()); double newAngle = previousAngle + rotationRadians; Point newP = new Point(); newP.X = center.X + r * Math.Cos(newAngle); newP.Y = center.Y + r * Math.Sin(newAngle); Console.WriteLine("(" + newP.X.ToString() + ", " + newP.Y.ToString() + ")"); Console.ReadLine();