none
ROTAR control de usuario o FIGURA HECHA EN GRAPHICS PATH C# RRS feed

  • Pregunta

  • Buen día a todos, como están ?, quisiera saber si me podrían ayudar a rotar esta figura hecha en grapichs path :

    Esta asi :  y necesito que quede asi  =           

    La figura esta dentro de un control de usuario , si no se puede rotar , entonces si es posible rotar el control de usuario, seria bueno y si no se puede ninguna de las dos anteriores, entonces volverla a dibujar.

    gracias a todos los magos que me puedan ayudar 

    les dejo el código de la figura

    using System.Drawing.Drawing2D;
    
    namespace Odonto
    {
        public partial class Control_Odontograma : UserControl
        {
    
            List<KeyValuePair<int, GraphicsPath>> fig;
    
            {
                InitializeComponent();
            }
    
            private void Control_Odontograma_Load(object sender, EventArgs e)
            {
    
                fig = new List<KeyValuePair<int, GraphicsPath>>();
    
    
    
                GraphicsPath gp = new GraphicsPath();
    
                gp = new GraphicsPath();
    
                gp.AddEllipse(Rectangle.FromLTRB(20, 20, 40, 40));
                fig.Add(new KeyValuePair<int, GraphicsPath>(10000, gp));
    
    
                gp = new GraphicsPath();
    
                gp.AddLine(40, 30, 60, 30);
                gp.AddArc(Rectangle.FromLTRB(0, 0, 60, 60), 0F, 90F);
                gp.AddLine(30, 60, 30, 40);
                gp.AddArc(Rectangle.FromLTRB(20, 20, 40, 40), 90F, -90F);
                gp.CloseFigure();
                fig.Add(new KeyValuePair<int, GraphicsPath>(1000, gp));
    
                gp = new GraphicsPath();
    
                gp.AddLine(30, 40, 30, 60);
                gp.AddArc(Rectangle.FromLTRB(0, 0, 60, 60), 90F, 90F);
                gp.AddLine(0, 30, 20, 30);
                gp.AddArc(Rectangle.FromLTRB(20, 20, 40, 40), 180F, -90F);
                gp.CloseFigure();
                fig.Add(new KeyValuePair<int, GraphicsPath>(100, gp));
    
                gp = new GraphicsPath();
    
                gp.AddLine(20, 30, 0, 30);
                gp.AddArc(Rectangle.FromLTRB(0, 0, 60, 60), 180F, 90F);
                gp.AddLine(30, 0, 30, 20);
                gp.AddArc(Rectangle.FromLTRB(20, 20, 40, 40), 270F, -90F);
                gp.CloseFigure();
                fig.Add(new KeyValuePair<int, GraphicsPath>(10, gp));
    
                gp = new GraphicsPath();
    
                gp.AddLine(30, 20, 30, 0);
                gp.AddArc(Rectangle.FromLTRB(0, 0, 60, 60), 270F, 90F);
                gp.AddLine(60, 30, 40, 30);
                gp.AddArc(Rectangle.FromLTRB(20, 20, 40, 40), 0F, -90F);
                gp.CloseFigure();
                fig.Add(new KeyValuePair<int, GraphicsPath>(1, gp));
            }
    
     private void Control_Odontograma_Paint(object sender, PaintEventArgs e)
            {
    
                foreach (KeyValuePair<int, GraphicsPath> item in fig)
                {
                    e.Graphics.DrawPath(Pens.Black, item.Value);
                }

    Pdt: el codigo me lo proporciono otra fuente, por ende la verdad no entiendo el diseño, gracias.


    miércoles, 29 de marzo de 2017 17:11

Respuestas

  • No se puede rotar el propio control de usuario en Winforms (en WPF sí que se podría). Pero sí que puedes rotar el contenido que pintas dentro. Hay dos formas de hacerlo.

    La primera sería rotar todos los elementos que tienes dentro del GraphicsPath. Para ello, habría que tomar cada uno de los puntos que tienes y cambiarles las coordenadas. Por ejemplo, donde tienes AddLine(60,30,40,30) eso traza una línea desde el punto (60,30) al (40,30). A estos puntos les puedes aplicar un giro alrededor del origen de rotación; basta multiplicarlos por una matriz de rotación que tenga dentro el seno y coseno del ángulo de giro, es un cálculo muy simple de geometría analítica.

    La segunda solución es aplicarle una rotación al propio e.Graphics dentro del evento Paint (antes del bucle foreach que hace el dibujo dentro del e.Graphics). Esto se hace con el método RotateTransform:

    e.Graphics.RotateTransform(45)

    https://msdn.microsoft.com/en-us/library/a0z3f662(v=vs.110).aspx

    • Marcado como respuesta William Losada jueves, 30 de marzo de 2017 12:37
    jueves, 30 de marzo de 2017 6:57

Todas las respuestas

  • No se puede rotar el propio control de usuario en Winforms (en WPF sí que se podría). Pero sí que puedes rotar el contenido que pintas dentro. Hay dos formas de hacerlo.

    La primera sería rotar todos los elementos que tienes dentro del GraphicsPath. Para ello, habría que tomar cada uno de los puntos que tienes y cambiarles las coordenadas. Por ejemplo, donde tienes AddLine(60,30,40,30) eso traza una línea desde el punto (60,30) al (40,30). A estos puntos les puedes aplicar un giro alrededor del origen de rotación; basta multiplicarlos por una matriz de rotación que tenga dentro el seno y coseno del ángulo de giro, es un cálculo muy simple de geometría analítica.

    La segunda solución es aplicarle una rotación al propio e.Graphics dentro del evento Paint (antes del bucle foreach que hace el dibujo dentro del e.Graphics). Esto se hace con el método RotateTransform:

    e.Graphics.RotateTransform(45)

    https://msdn.microsoft.com/en-us/library/a0z3f662(v=vs.110).aspx

    • Marcado como respuesta William Losada jueves, 30 de marzo de 2017 12:37
    jueves, 30 de marzo de 2017 6:57
  • Gracias por tu aporte, ya pude solucionarlo con una matrix y con Rotate Transform te agradezco por tu ayuda
    jueves, 30 de marzo de 2017 12:37