• Domingo 17 de Noviembre de 2024, 21:18

Autor Tema:  Curva XY moldeable con el mouse  (Leído 1876 veces)

enzo84

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Curva XY moldeable con el mouse
« en: Martes 27 de Septiembre de 2011, 15:58 »
0
Hola a todos los programadores, este es mi primer post, me presento, mi nombre es Enzo de Argentina y estoy tratando de hacer una gráfica similar a esta: http://www.youtube.com/watch?v=TuKL_K5hgbg
Si observan bien, al minuto del video se ve lo que quiero hacer.
Básicamente es una gráfica xy donde puedo modificar la posición de los puntos y agregar o quitarlos, por medio del puntero del mouse.
Siempre he programado en C, y esto del C# es totalmente nuevo para mi, tengo el Microsoft Visual C# 2010 Express, pero no entiendo mucho.
Alguien me puede dar una mano para poder realizar este cometido? Aunque sea poder dibujarlo sobre el mismo formulario.

Muchas gracias foreros, mis respetos y saludos!

Enzo.
« última modificación: Miércoles 28 de Septiembre de 2011, 17:09 por enzo84 »

enzo84

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re:Curva XY moldeable con el mouse
« Respuesta #1 en: Miércoles 28 de Septiembre de 2011, 16:11 »
0
Bueno estuve probando, grafico con GDI sobre el mismo formulario para probar.
Uso tres puntos e hice que el del medio se mueva con el mouse con el evento MouseDown.
Funciona, pero ahora quiero partir de dos puntos, uno al inicio y otro al final.
Y luego al hacer clic, que se agreguen puntos y luego los pueda mover si me acerco a ellos.
Lo que hago es graficar un círculo en cada punto, y lo que haría para mover un punto es comparar la posición x,y del mouse si es que está dentro de este círculo cambiarlo de color para indicar que se está en condiciones de mover ese punto.
Primero lo probé con un arreglo de tres pares de puntos siendo el del medio dinámico y funcionó.
Como según creo, un arreglo es fijo, no puedo usarlo para lo que quiero, no se como agregarle puntos a un arreglo, entonces usé una lista y para pasarsela al DrawLines lo convierto a arreglo con ToArray(), pero no me une el primer punto con el segundo, y no se tampoco si es lo mejor, ojalá puedan aportar alguna idea, gracias.
Pongo el código:
Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace PruebaDeGraficos
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.             int x, y;
  15.             int finx, finy;
  16.             int ox, oy;
  17.             int maxescx, maxescy;
  18.             int rpunto;
  19.             bool clicdowncurva = false;
  20.             private List<Point> mispuntos = new List<Point>();
  21.        
  22.         public Form1()
  23.         {
  24.             InitializeComponent();
  25.             x = 150;
  26.             y = 40;
  27.             mispuntos.Add(new Point(0, 1));
  28.             mispuntos.Add(new Point(1, 1));
  29.             mispuntos.Add(new Point(2, 1));
  30.         }
  31.  
  32.         private void Form1_Paint(object sender, PaintEventArgs e)
  33.         {
  34.  
  35.             rpunto = 4;
  36.             ox = 30;
  37.             oy = 30;
  38.             finx = this.Width - 85;
  39.             finy = this.Height - 95;
  40.             maxescx = finx - ox;
  41.             maxescy = finy - oy;
  42.             mispuntos[0]=new Point(ox, finy);
  43.             mispuntos[1]=new Point(finx, finy);
  44.             System.Drawing.Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Red);
  45.             System.Drawing.Graphics formGraphics;
  46.             formGraphics = this.CreateGraphics();
  47.             formGraphics.DrawRectangle(myPen, ox,oy,maxescx,maxescy);
  48.             mispuntos[2]=new Point(x, y);
  49.             formGraphics.DrawEllipse(myPen, x-rpunto, y-rpunto, 2*rpunto, 2*rpunto);
  50.             Font pruebaFont = new Font("Haettenschweiler", 10);
  51.             Brush blackBrush = Brushes.Black;
  52.             formGraphics.DrawString(x.ToString()+" , "+y.ToString(), pruebaFont, blackBrush, x, y-20);
  53.             myPen.Color = Color.Blue;
  54.             formGraphics.DrawLines(myPen, mispuntos.ToArray());
  55.             myPen.Dispose();
  56.             formGraphics.Dispose();
  57.         }
  58.  
  59.         private void Form1_MouseMove(object sender, MouseEventArgs e)
  60.         {
  61.             if (clicdowncurva)
  62.             {
  63.                 x = e.X;
  64.                 y = e.Y;
  65.                 Invalidate();
  66.             }
  67.         }
  68.  
  69.         private void Form1_MouseDown(object sender, MouseEventArgs e)
  70.         {
  71.             clicdowncurva = true;
  72.             x = e.X;
  73.             y = e.Y;
  74.             Invalidate();
  75.  
  76.         }
  77.  
  78.         private void Form1_MouseUp(object sender, MouseEventArgs e)
  79.         {
  80.             clicdowncurva = false;
  81.         }
  82.     }
  83. }
  84.  
Edito: creo que el problema es esa lista, me cambia el orden de los puntos cuando lo paso a array me parece...
UPDATE: El problema era que asigno el punto incial y final seguidos, ahora lo cambie a:
Código: C#
  1. mispuntos[0]=new Point(ox, finy);
  2. mispuntos[2]=new Point(finx, finy);
  3. mispuntos[1]=new Point(x, y);
Y funciona, prueben si quieren, pero todavía falta para lo que quiero.
La idea es poder agregar puntos, moverlos y tambien quitarlos.
Todavía no se como.
« última modificación: Miércoles 28 de Septiembre de 2011, 17:09 por enzo84 »

enzo84

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re:Curva XY moldeable con el mouse
« Respuesta #2 en: Lunes 3 de Octubre de 2011, 01:57 »
0
Bueno, logré lo que quería aunque no puedo eliminar el parpadeo:
http://www.youtube.com/watch?v=u2TfBZw0-Gg
Escuché del double buffering, entonces, agrego la linea:
Código: C#
  1. this.DoubleBuffering=true;
Pero no funciona, peor, no me grafica la línea hasta que muevo el mouse y parece que parpadea más todavía.

Alguna idea?