Exemplo n.º 1
0
        private static void rectangulo(Info_forma inf, PictureBox pintura)
        {
            inf.g = Graphics.FromImage((Bitmap)pintura.Image);
            List <Point> rectangulo = new List <Point>();

            // Se usan 4 listas para cada lado
            List <Point> lado_superior  = Herramienta.calcular_lado(inf.po, inf.ancho_forma, "x");
            List <Point> lado_izquierdo = Herramienta.calcular_lado(inf.po, inf.alto_forma, "y");
            List <Point> lado_derecho   = Herramienta.calcular_lado(new Point(inf.po.X + inf.ancho_forma * 100, inf.po.Y), inf.alto_forma, "y");
            List <Point> lado_inferior  = Herramienta.calcular_lado(new Point(inf.po.X, inf.po.Y + inf.alto_forma * 100), inf.ancho_forma, "x");

            rectangulo.AddRange(lado_superior);
            rectangulo.AddRange(lado_derecho);
            lado_inferior.Reverse();
            rectangulo.AddRange(lado_inferior);
            lado_izquierdo.Reverse();
            rectangulo.AddRange(lado_izquierdo);

            //Elimino los puntos repetidos
            rectangulo = rectangulo.Distinct().ToList();

            //Se dibuja la pared
            Pen borde = new Pen(Color.Black, inf.grosor_pared);

            rectangulo = Herramienta.rotar_puntos_figuras(rectangulo, inf.grados, inf.punto_medio);

            //Despues de rotar guardo los puntos en el objeto
            inf.contorno = rectangulo;

            inf.g.FillPolygon(Brocha, rectangulo.ToArray());
            inf.g.DrawPolygon(borde, rectangulo.ToArray());

            pintura.Refresh();
        }
Exemplo n.º 2
0
        private static void rectangulo_deformado(Info_forma info, PictureBox pintura, int modo)
        {
            info.g = Graphics.FromImage((Bitmap)pintura.Image);

            Random random = new Random();

            /* Está función la desarrollé en la primera versión en el 2019,
             * parametros originales que recibia la función:
             * float x, float y, float ancho, float alto, int tipo, List<PointF> pi*/
            int   inicioy, iniciox, ultimay, cierrex;
            int   x = info.po.X;
            int   y = info.po.Y;
            int   ancho = info.ancho_forma;
            int   alto = info.alto_forma;
            int   contador = 1;
            int   distancia_des_ancho = (int)Math.Truncate(alto * 0.30) + 1, distancia_des_alto = (int)Math.Truncate(ancho * 0.30) + 1;
            int   hund_izq = 0, hund_der = info.ancho_lienzo;
            Point point1   = new Point();
            Point point2   = new Point();
            Pen   contorno = new Pen(Color.Black, info.grosor_pared);

            // Se usan 4 listas para cada lado
            List <Point> lado_arriba    = new List <Point>();
            List <Point> lado_derecho   = new List <Point>();
            List <Point> lado_izquierdo = new List <Point>();
            List <Point> lado_abajo     = new List <Point>();

            /*
             * Una variable llamada "desplazar hacia el centro" determina si 2 puntos se mueven.
             * si es cualquier número a excepción de 0 no moverá los vertices
             * si es cero los vertices serán atraidos al centro
             * __________
             |        __|
             |       |__   <--- "desplazar_al_centro = 0"
             |          |
             |__________|
             */

            int conteo = 0, desplazar_al_centro = 0;
            int random_profundidad = 0;

            //Ancho superior
            while (contador <= ancho)
            {
                /*Esta parte fue agregada para controlar la distancia de deformacion
                 * y la posibilidad*/
                if (conteo == 0)
                {
                    conteo              = 1;
                    random_profundidad  = random.Next(1, distancia_des_ancho);
                    desplazar_al_centro = random.Next(0, info.posibilidad.Value);
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                else
                {
                    conteo = conteo + 1;
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                //-------------------------------------------
                if (desplazar_al_centro != 0)
                {
                    if (contador == 1)
                    {
                        point1.X = x;
                        point1.Y = y;
                        point2.X = (100 * contador) + x;
                        point2.Y = point1.Y;
                    }
                    else
                    {
                        point1.X = point2.X;
                        point1.Y = y;
                        point2.X = (100 * contador) + x;
                        point2.Y = point1.Y;
                    }
                }
                else
                {
                    if (contador == 1)
                    {
                        point1.X = x;
                        point1.Y = y + (random_profundidad * 100);
                        point2.X = (100 * contador) + x;
                        point2.Y = point1.Y;
                    }
                    else
                    {
                        point1.X = point2.X;
                        point1.Y = y + (random_profundidad * 100);
                        point2.X = (100 * contador) + x;
                        point2.Y = point1.Y;
                    }
                }
                contador = contador + 1;
                lado_arriba.Add(point1);
                lado_arriba.Add(point2);
            }
            // Guarda la Y del primer segmento
            inicioy = lado_arriba[0].Y;
            // Guarda la Y del ultimo segmento


            ultimay  = lado_arriba[lado_arriba.Count - 1].Y;
            contador = distancia_des_ancho;
            conteo   = 0;
            //lado derecho
            while (contador <= alto)
            {
                int punto_inicial_x = (100 * ancho) + x;
                //Esta parte fue agragada para la distancia
                if (conteo == 0)
                {
                    conteo              = 1;
                    random_profundidad  = random.Next(1, distancia_des_alto);
                    desplazar_al_centro = random.Next(0, info.posibilidad.Value);
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                else
                {
                    conteo = conteo + 1;
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                //-------------------------------------------
                if (contador == distancia_des_ancho)
                {
                    point1.X = punto_inicial_x;
                    point1.Y = ultimay;
                    point2.X = point1.X;
                    point2.Y = (100 * contador) + y;
                }
                else
                {
                    if (desplazar_al_centro != 0)
                    {
                        point1.X = punto_inicial_x;
                        point1.Y = point2.Y;
                        point2.X = point1.X;
                        point2.Y = (100 * contador) + y;
                    }
                    else
                    {
                        point1.X = punto_inicial_x - (random_profundidad * 100);
                        point1.Y = point2.Y;
                        point2.X = point1.X;
                        point2.Y = (100 * contador) + y;
                    }
                }
                if (point2.X <= hund_der)
                {
                    hund_der = point2.X - 100;
                }

                contador = contador + 1;
                lado_derecho.Add(point1);
                lado_derecho.Add(point2);
            }

            iniciox = lado_derecho[lado_derecho.Count - 1].X;
            cierrex = iniciox;

            contador = distancia_des_ancho;

            //lado izquierdo

            while (contador <= alto)
            {
                if (conteo == 0)
                {
                    conteo              = 1;
                    random_profundidad  = random.Next(1, distancia_des_alto);
                    desplazar_al_centro = random.Next(0, info.posibilidad.Value);
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                else
                {
                    conteo = conteo + 1;
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                //-------------------------------------------
                if (contador == distancia_des_ancho)
                {
                    point1.X = x;
                    point1.Y = inicioy;
                    point2.X = point1.X;
                    point2.Y = (100 * contador) + y;
                }
                else
                {
                    if (desplazar_al_centro != 0)
                    {
                        point1.X = x;
                        point1.Y = point2.Y;
                        point2.X = point1.X;
                        point2.Y = (100 * contador) + y;
                    }
                    else
                    {
                        point1.X = x + (random_profundidad * 100);
                        point1.Y = point2.Y;
                        point2.X = point1.X;
                        point2.Y = (100 * contador) + y;
                    }
                }
                if (point2.X >= hund_izq)
                {
                    hund_izq = point2.X + 100;
                }

                contador = contador + 1;
                lado_izquierdo.Add(point1);
                lado_izquierdo.Add(point2);
            }

            iniciox = lado_izquierdo[lado_izquierdo.Count - 1].X;
            ultimay = lado_izquierdo[lado_izquierdo.Count - 1].Y;

            contador = distancia_des_alto;
            conteo   = 0;

            //Ancho inferior

            while (contador <= ancho + 1)
            {
                int punto_inicial_y = (100 * alto) + y;
                //Esta parte fue agragada para la distancia
                if (conteo == 0)
                {
                    conteo              = 1;
                    random_profundidad  = random.Next(1, distancia_des_ancho);
                    desplazar_al_centro = random.Next(0, info.posibilidad.Value);
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                else
                {
                    conteo = conteo + 1;
                    if (conteo == info.distancia.Value)
                    {
                        conteo = 0;
                    }
                }
                //-------------------------------------------
                if (point2.X >= hund_der - 100)
                {
                    point1.X = point2.X;
                    point1.Y = punto_inicial_y;
                    point2.X = cierrex;
                    point2.Y = point1.Y;
                    lado_abajo.Add(point1);
                    lado_abajo.Add(point2);
                    break;
                }
                if (contador == distancia_des_alto)
                {
                    point1.X = iniciox;
                    point1.Y = punto_inicial_y;
                    point2.X = hund_izq;
                    point2.Y = point1.Y;
                }
                else
                {
                    if (desplazar_al_centro != 0)
                    {
                        point1.X = point2.X;
                        point1.Y = punto_inicial_y;
                        point2.X = (100 * contador) + x;
                        point2.Y = point1.Y;
                    }
                    else
                    {
                        point1.X = point2.X;
                        point1.Y = punto_inicial_y - (random_profundidad * 100);
                        point2.X = (100 * contador) + x;
                        point2.Y = point1.Y;
                    }
                }
                contador = contador + 1;
                lado_abajo.Add(point1);
                lado_abajo.Add(point2);
            }

            // Tipo de deformacion 2
            if (modo == 2)
            {
                //deformacion b, tiene un problema de estetica: en ocasiones los vertices de las esquinas desaparecen, en las siguientes lineas lo soluciono
                deformar_lados(lado_arriba);
                deformar_lados(lado_abajo);
                deformar_lados(lado_derecho);
                deformar_lados(lado_izquierdo);
            }

            List <Point> irregular = new List <Point>();

            for (int c = 0; c < lado_arriba.Count; c++)
            {
                irregular.Add(lado_arriba[c]);
            }
            for (int c = 0; c < lado_derecho.Count; c++)
            {
                irregular.Add(lado_derecho[c]);
            }
            for (int c = lado_abajo.Count - 1; c >= 0; c--)
            {
                irregular.Add(lado_abajo[c]);
            }
            for (int c = lado_izquierdo.Count - 1; c >= 0; c--)
            {
                irregular.Add(lado_izquierdo[c]);
            }

            //Limpio de la lista los elementos duplicados
            irregular = irregular.Distinct().ToList();

            //Se rotan los puntos
            irregular = Herramienta.rotar_puntos_figuras(irregular, info.grados, info.punto_medio);

            //Guardo los puntos en el objeto
            info.contorno = irregular;
            info.g.FillPolygon(Brocha, irregular.ToArray());
            info.g.DrawPolygon(contorno, irregular.ToArray());

            pintura.Refresh();
        }