Luis Garcia STAFF TEAM
Mensajes : 64 Puntos : 112
| Tema: Crear figura geometrica a partir de 2 puntos. Lun Mar 21, 2011 6:01 pm | |
| En este apartado veremos como crear una figura geométrica a partir de dos puntos, como lo muestra en la imagen: [Tienes que estar registrado y conectado para ver esa imagen]Para crear un polígono de n lados en la computadora vamos a necesitar el "using" para poder graficar los puntos. System.drawing; Tendremos una variable de tipo PointF que se va a llamar puntos: PointF[] puntos; // lo ponemos antes del constructor Necesitamos un control de tipo panel en el que dibujaremos el polígono, también agregamos un botón para ejecutar el código y un textbox para insertar el numero de lados de nuestra figura. En el evento paint del "control panel" insertamos este código: - Código:
-
if (puntos != null && puntos.Count() > 0) // con esto verificamos si hay algún punto { PointF Centro = new PointF(panel1.Width / 2, panel1.Height / 2); //localizamos el punto medio del control for (int i = 0; i < puntos.Count(); i++) // con esto colocaremos los puntos a partir del centro de nuestra figura { puntos[i] = new PointF(puntos[i].X + Centro.X, puntos[i].Y + Centro.Y); }
e.Graphics.DrawPolygon(Pens.Black, puntos); /*Graficamos los puntos con la función drawpoligon utilizando los argumentos del evento *paint */ }
En el evento click del botón insertamos: - Código:
-
puntos = null; // Nos aseguramos que no halla puntos PointF PInicial = new PointF(-100, -100); //Punto inicial superior izquierdo PointF Pfinal = new PointF(100, 100); //Punto Final inferior derecho int nLados = int.Parse(textBox1.Text); // El numero de lados de nuestro polígono puntos = new PointF[nLados]; /*El numero de lados de nuestra figura también será el numero de puntos que esta figura tendrá*/ float PX = 0, PY = 0; //Punto X, Punto Y float MX = 0, MnX = 0, MY = 0, MnY = 0; /*MX=MaximoX, MnX=Menor X , MY= Mayor Y, Mny=Menor Y*/ /*Calculamos el menor y el mayor de todos los puntos para tener graficamente esto: __________________________ |*(Mnx, Mny) *(MX,Mny| | | |*(Mnx,MY)________*(MX,MY)| Representando un cuadrado imaginario que contendrá nuestra figura */ if (PInicial.X > Pfinal.X) { MX = PInicial.X; MnX = Pfinal.X; } else { MX = Pfinal.X; MnX = PInicial.X; }
if (PInicial.Y > Pfinal.Y) { MY = PInicial.Y; MnY = Pfinal.Y; } else { MY = Pfinal.Y; MnY = PInicial.Y; }
PointF PCentro = new PointF((MX + MnX) / 2, (MY + MnY) / 2); //Sacamos el punto medio del cuadrado imaginario /*
¿Para que hacer todo esto? La respuesta es que para poder obtener los puntos de una figura usaremos la función de rotación sobre un eje para un punto. [Tienes que estar registrado y conectado para ver este vínculo] - Código:
-
for (int i = 0; i < nLados; i++) { if (i == 0) //Si es el primer punto { puntos[i]=new PointF(MnX, MnY); /* Nuestro primer punto será en el punto X menor y el punto Y menor de nuestro cuadrado imaginario */ } else { /*Teniendo nuestro punto central y tomando como referencia a nuestro primer punto, podremos dibujar nuestra figura.
A partir del punto central de nuestro cuadrado imaginario rotaremos nuestro punto inicial(MnX,Mny), los grados que se rotará nuestro punto es el resultado de el numero de lados de nuestra figura entre 360, utilizando trigonometria nos dice que "el numero de ángulos interiores de una figura por vértice siempre es igual a 360°" osea que un cuadrado tendrá por cada vértice un angulo de 360/4=90° por vértice.
Con esto podemos sacar una formula para calcular los grados que se rotará nuestro punto, Angulo= numeroLados/360.
Se crea un punto por cada rotación así obtendremos cada uno de los vértices de la figura y al final son unidos por la funcion drawpoligon, veamos: */ /*Función para punto X= PCentroX+ (PanteriorX-PcentroX) * cos(360/lados) - (PanteriorY-PcentroY)*sen(360/lados) */ PX = PCentro.X + (( (puntos[i - 1].X - PCentro.X) * float.Parse(Math.Cos((360 / nLados) * Math.PI / 180).ToString())) - ((puntos[i - 1].Y - PCentro.Y) * float.Parse(Math.Sin((360 / nLados) * Math.PI / 180).ToString())));
/*Función para punto Y= PCentroY+ (PanteriorX-PcentroY) * sen(360/lados) - (PanteriorY-PcentroY)*cos(360/lados) */ PY = PCentro.Y + (((puntos[i - 1].X - PCentro.Y) * float.Parse(Math.Sin((360 / nLados) * Math.PI / 180).ToString())) + ((puntos[i - 1].Y - PCentro.Y) * float.Parse(Math.Cos((360 / nLados) * Math.PI / 180).ToString())));
puntos[i]=new PointF(PX, PY); /*Guardamos el punto rotado el numero de grados calculado como un punto de tipo flotante*/ } }
panel1.Refresh();
//Refrescamos el control panel para que se ejecute el método paint del control panel1
Ejecutamos y ponemos el numero de lados para nuestra figura y visualizaremos la figura. Código fuente: [Tienes que estar registrado y conectado para ver este vínculo] | |
|