Tengo una tarea de dibujar un gráfico específico. Como parte de esta tarea es necesario girar algunas de dot en 45 grados.

He pasado ya 2 días tratando de calcular una fórmula, pero no podía hacerlo bien.
He estado buscando por todo el lugar, incluyendo este sitio web en particular, estoy muy cerca, pero todavía no estoy allí.

Aquí está:
Tengo que sacar 4 puntos diferentes

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

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);

Rotar un punto alrededor de otro punto

Ahora necesito a rotar este puntos en 45 grados. Puedo utilizar el código siguiente 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 yo estoy haciendo:

Rotar un punto alrededor de otro punto

Cualquier ayuda sería muy apreciada

InformationsquelleAutor Vlad Spreys | 2012-12-04

2 Comentarios

  1. 41

    El problema es int center = radius que se ajuste int radius = 576. Esto no tiene sentido, como seguramente usted está girando alrededor de un punto que debe tener un x y y ubicación.

    Dado que están girando alrededor del origen en el centro de x y y deben ser 0 no 576.

    Así, dado que, de probar 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)
        };
    }

    Uso como tal.

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

    Obviamente, si el punto central es siempre 0,0, a continuación, usted puede simplificar la función en consecuencia, o bien hacer el punto central opcional a través de un parámetro predeterminado, o por la sobrecarga del método. Usted también probablemente desea encapsular algunos de los reutilizables de matemáticas en otros métodos estáticos demasiado.

    por ejemplo,

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

    Uso como tal.

    Point newPoint = RotatePoint(blueA, 45);

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

    Graphics g = this.CreateGraphics();
    g.TranslateTransform(blueA);
    g.RotateTransform(45);
    • Acabo de ver este post después de que he publicado. Esta fórmula funciona.
    • es perfecto! Gracias. Aquí está la captura de pantalla actual: s8.postimage.org/e7r44klcl/result.png
    • Estás en lo correcto. Un contribuyente a un OS lib debe tener a mano una copia porque el paréntesis fueron jodido y que salió mal en la unidad de pruebas.
  2. 1

    Estás matemáticas parece extraño para mí. Creo dx = r*Cos(theta) y dy = r*Sin(theta).

    He aquí un pequeño programa que yo he escrito, porque este era el que me molesta, y no he hecho la matemática es 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();
    • Yo uso el método en diferentes partes del código y en algún momento tuve el «anterior» el punto con coordenadas: X = 576 Y = 20. En este caso me estoy poniendo el «DivideByZeroException» Aquí está el resultado, si pongo el «try -> la captura de» bloque en: s10.postimage.org/azjdc7rex/exception.png

Dejar respuesta

Please enter your comment!
Please enter your name here