C sharp - Dibujar círculo con el ratón desde el centro

 
Vista:

Dibujar círculo con el ratón desde el centro

Publicado por Ephesia (24 intervenciones) el 16/06/2015 00:49:29
Hola:

Necesito dibujar un círculo y un cuadrado elástico al mover el ratón.
Pero estos se deben dibujar desde el centro (donde se pincha con el ratón) hacia el exterior por medio del radio.

He conseguido dibujar hacia la izquierda la hacia la derecha, arriba y abajo.
No encuentro información en Internet para dibujarlos desde el centro.

¿Alguien me puede ayudar?

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Dibujar círculo con el ratón desde el centro

Publicado por Juan Carlos (1 intervención) el 16/06/2015 20:59:17
Hola perdona, si dices que has conseguido hacia la izquierda, derecha, arriba y abajo que
es lo que te falta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Dibujar círculo con el ratón desde el centro

Publicado por Ephesia (24 intervenciones) el 17/06/2015 14:07:01
Lo puedo dibujar en cualquier posición pero...

DrawCircle lo dibuja desde el vértice superior izquierdo...
DrawCircle lo codifica como inscrito en un cuadrado.

Si se modifica el punto de partida se sigue dibujando desde el vértice, más arriba o más abajo...

Lo que necesito es dibujarlo desde el centro.
Que el círculo crezca alrededor del punto donde se ha pulsado.

Por ello no se puede dibujar desde el vértice, sino con el radio.
No encuentro el algoritmo en Internet.
Como es de suponer, lo he intentado a pedal con los eventos de ratón y paint, pero no lo consigo.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dibujar círculo con el ratón desde el centro

Publicado por Carlos (35 intervenciones) el 19/06/2015 19:55:30
Aqui tienes un ejemplo de como hacerlo.
Para este ejemplo necesitas un formulario con un picturebox, luego en los eventos mousedown, mousemove mouseup y pictureboxpaint es donde sucede la magia, debes modificar un poco este ejemplo para que se adapte a tus necesidades, pero basicamente hace lo que tu pides, dibuja un circulo siempre desde el centro tomando su radio, espero te se ad e ayuda.

Codigo de la forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public partial class Form1 : Form
    {
        private Point puntoCentro;
        private int radio;
 
        private bool drawing;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void CalcularRadio(Point p1, Point p2)
        {
            //calcula el radio a partir del punto central y el punto final
            radio = (int)Math.Round(Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)), 0);
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //captura el punto central
            puntoCentro = e.Location;
            drawing = true;
        }
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            //si se esta dibujando
            if (drawing)
            {
                //calcula el radio 
                CalcularRadio(puntoCentro, e.Location);
 
                //hace que el picturebox se repinte
                pictureBox1.Invalidate();
            }
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            //termida el dibujo
            drawing = false;
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            //dibuja la circunferencia tomando como punto inicial la diferencia entre el centro y el radio
            //con una dimension del radio * 2, o sea el diametro
            e.Graphics.DrawEllipse(Pens.Black, puntoCentro.X - radio, puntoCentro.Y - radio, radio * 2, radio * 2);
        }
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dibujar círculo con el ratón desde el centro

Publicado por Ephesia (24 intervenciones) el 21/06/2015 22:15:01
Hola Carlos:

Muchísimas gracias por el código. Sí, he podido adaptarlo.
Ya dibuja círculos desde el centro.

Lo que yo buscaba era:
radio = (int)Math.Round(Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)), 0);

Para quien le interese el tema,
entre algunas mejoras, en vez de utilizar:

e.Graphics.DrawEllipse(Pens.Black, puntoCentro.X - radio, puntoCentro.Y - radio, radio * 2, radio * 2);

mejor utilizar variable tipo Graphics cargada con el Graphics del PixtureBox.

En el evento paint utilizar un bucle que lee una matriz, que se carga en el evento mouseDwon y mouseMove del picture.

De esta manera se pueden borrar los círculos generados. ( matriz[1].Clear(), picture.invalidate()...)

Para mayor sofisticación si se utiliza DrawIcon para añadir el nodo central del círculo a la par que se anula el cursor
y se activa e el evento mouseUp queda muy bien.

Nuevamente muchas gracias.

EP.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dibujar círculo con el ratón desde el centro

Publicado por Carlos (35 intervenciones) el 22/06/2015 16:50:56
Me alegra que te haya servido el código, pero permíteme darte un consejo, en realidad usar el evento OnPaint, es mucho más eficiente que usar la clase graphics, sobre todo cuando necesitas dibujar una gran cantidad de gráficos o cuando necesitas cierta velocidad en los gráficos(digamos juegos, graficas de modelos matemáticos, etc), por alguna razón en .net OnPaint esta mejor optimizado, ten en cuenta que todo lo que ves en una forma incluso la misma forma en si se dibuja en este evento, incluso el propio objeto graphics se redibuja en este evento, tu bien puedes usar, (como es este caso del ejemplo que te mande), el evento OnPaint del picturebox, o bien puedes en el formulario override el OnPaint y tratar de que todo lo que vayas a dibujar lo dibujes allí, claro que con unas pocas líneas, circunferencias, rectangulos etc., no se notara mucho la diferencia, pero cuando tengas un montón de gráficos que necesitas render en tu form si notaras mucho la diferencia entre usar OnPaint y usar la clase Graphics. En tu caso puedes almacenar tus figuras como objetos donde desees pero a la hora de dibujarlas usa OnPaint, créeme, te lo digo por experiencia propia, yo he pasado algunos años trabajo en gráficos por computadora. Otro detalle, si necesitas mover tus gráficos no te olvides de activar el doble buffer para evitar que parpedeen.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dibujar círculo con el ratón desde el centro

Publicado por Carlos (35 intervenciones) el 22/06/2015 17:30:32
Para ilustrar mejor lo que te decía de la eficiencia de OnPaint sobre Graphics aquí te dejo un ejemplo sencillo de esto.
Este ejemplo dibuja una matriz de 100x100 de dos formas, una usando la clase graphics y otra usando OnPaint.
Ejecuta el ejemplo la primera vez y presiona el botón que dice ”Paint using Graphics”, luego Cierra el programa y ejecútalo de Nuevo y usa ahora el botón que dice “paint using OnPaint” y versa la diferencia, como dice el dicho, una imagen vale más que 100 palabras.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dibujar círculo con el ratón desde el centro

Publicado por Ephesia (24 intervenciones) el 22/06/2015 21:24:41
Totalmente de acuerdo Carlos!!

De hecho utilizo todo el código de dibujo en onPaint ( cuando dije paint, quise decir onPaint...)
Lo que no veo mucha diferencia es en sobreescribir (override) el evento o no, al nivel que yo quiero,
figuras geométricas sencillas, rellenos sencillos con alguna transparencia, polígonos, etc...

Y también de acuerdo.. utilizo doble buffer y código adaptado para usar sus múltiples ventajas en lo referente al repintado y el parpadeo.

Ya miraré el código ofrecido y te comento, pero pareces tener mucho nivel.

Yo simplemente intento aprender un poquito.
Estoy haciendo un programa de morfometría para investigadores. Sobre todo biólogos,
de código abierto y gratuito, hoy en día en el campo de la investigación los científicos(excepto algunos que estudian cáncer, etc), no disponemos de un euro y los pocos recursos los pagamos de nuestro bolsillo, por
ello un programa de morfometría podría ser útil, pretendo ayudar.
Muchas gracias igualmente.

Saludos
EP
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dibujar círculo con el ratón desde el centro

Publicado por Carlos (35 intervenciones) el 23/06/2015 16:00:23
Great,
No conozco nada sobre morfometria, anqué por el nombre deduzco que se debe tratar de alguna ciencia para medir organismos o algo así.
Me alegra que te haya sido de ayuda, cualquier otra ayuda que necesites en el desarrollo de tu programa puedes contactarme y con gusto te la brindare.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dibujar círculo con el ratón desde el centro

Publicado por Ephesia (24 intervenciones) el 23/06/2015 16:37:02
Hola:
Probé tu programa de demostración.
Efectivamente las diferencias son notables.
Buen ejemplo.

Efectivamente son programas para hacer mediciones de fotografías de organismos que tengan incluidas una escala
(vamos, como en el CSI) y luego estadística de los datos.

Tomando tus palabras sobre la ayuda te formulo la siguiente pregunta sobre el mismo tema.
Teniendo el código siguiente:

public class circle
{
public Point puntoDeInicio = new Point();
public Point puntoFinal = new Point();
}

private List<circle> todosDecirculo = new List<circle>();

private void pctImagen_Paint(object sender, PaintEventArgs e)
{
gCirculos = e.Graphics;
//gCirculos.SmoothingMode = SmoothingMode.HighQuality;
//gCirculos.SmoothingMode = SmoothingMode.AntiAlias;
//Si se activa se ve más escalonado y grueso

foreach (var trazado in todosDecirculo)
{
int dis = (trazado.puntoFinal.X - trazado.puntoDeInicio.X) * (trazado.puntoFinal.X -
trazado.puntoDeInicio.X) +(trazado.puntoFinal.Y - trazado.puntoDeInicio.Y) *
(trazado.puntoFinal.Y - trazado.puntoDeInicio.Y);

double s = Math.Sqrt(dis);

//Dibuja
gCirculos.DrawEllipse(pcol, trazado.puntoDeInicio.X, trazado.puntoDeInicio.Y,
Convert.ToInt16(s), Convert.ToInt16(s));
}
}

Efectivamente se dibuja una elipse con el movimiento del ratón peeeeeeeero...
si activo:

gCirculos.SmoothingMode = SmoothingMode.HighQuality;
gCirculos.SmoothingMode = SmoothingMode.AntiAlias;


el trazado es más escalonado y grueso que sin no utilizo este código...
Se supone que es para lo contrario, para mejorar el trazado con antialising...

¿Alguna idea de porqué ocurre esto?

(Si pongo estas líneas en otro lugar, por ejemplo en elmouseUp del picture, da un error de parámetro...)

Saludos.
Ep
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dibujar círculo con el ratón desde el centro

Publicado por Carlos (35 intervenciones) el 25/06/2015 21:27:46
Perdona que no te respondí antes, es que no revise el site en unos días,
Bueno aquí va mi respuesta más vale tarde que nunca.
En realidad, lo primero que debes tener en cuenta es que graphics de .net trabaja en modo pixelar, no vectorial, lo que acarrea que el dibujo nunca tendría una calidad muy buena aunque si aceptable para la mayoría de los casos.
Teniendo esto en cuenta y aceptándolo, pues .net ofrece un conjunto de elementos que permiten lograr diferentes calidades en los dibujos, como ya notaste el “SmoothingMode” que controla el suavizado del trazado es uno de ellos, existen otros pero su uso depende de qué tipo de grafico deseas tratar, figuras(líneas, círculos, rectángulos…), imagines, etc.
Realmente para lo que deseas que es dibujar círculos, el “SmoothingMode” es la opción que tienes para modificar la calidad.
En tu cogido al hacer:
gCirculos.SmoothingMode = SmoothingMode.HighQuality;
gCirculos.SmoothingMode = SmoothingMode.AntiAlias;

Lo que estas haciendo en realidad es estableciendo el SmoothingMode a AntiAlias ya que la segunda línea sobrescribe la primera, aunque realmente no sé cuál es la diferencia entre HighQuality y AntiAlias, ya que visualmente el resultado es igual, prueba con una y luego con otra para ver cual se ve mejor.
La impresión de que el trazado es más grueso y escalonado, es en realidad un percepción debido al propio proceso de antialiasing, en que también influye, como es lógico, la resolución del monitor donde estés mirando los gráficos, mientras más fina sea la línea más notaras este efecto, con una línea de más de 1pixel de grosor este efecto disminuirá.

Aquí adjunto te mando un sencillo ejemplo de cómo puedes dibujar circunferencias en C#.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dibujar círculo con el ratón desde el centro

Publicado por Ephesia (24 intervenciones) el 27/06/2015 19:40:18
Hola!

Muchísimas gracias por tu magnífico ejemplo del uso de SmoothingMode.
En tu programa se aprecia perfectamente en cualquier grosor de línea, los efectos de suavizado.
Pero en el mío (según el código facilitado) usando cualquiera de las opciones,
no hace ningún efecto de mejora, es más, empeora los trazados (en cualquier grosor de línea)...
misterios...

Cordiales saludos.
EP.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar