Principales respuestas
ROTAR control de usuario o FIGURA HECHA EN GRAPHICS PATH C#

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