Ejemplo n.º 1
0
        public void InsertarPiezaEnUnStock(Rectangulo pieza)
        {
            foreach (Stock stock in listaStocks)
            {
                Nodo arbol       = stock.Arbol;
                Nodo segundoNodo = new Nodo(new Rectangulo(pieza));
                // Si el stock está vacío, lo inserto directamente
                if (arbol == null)
                {
                    segundoNodo.Rect.X = 0;
                    segundoNodo.Rect.Y = 0;
                    stock.Arbol        = segundoNodo;
                    return;
                }
                // Si tiene piezas, entonces busco el operador de
                // integración de modo que ocupe la menor área.
                else
                {
                    Rectangulo piezaIntegrada;
                    // Devuelve H o V
                    String tipoIntegracion = SePuedeInsertar(pieza, stock);

                    // Integrar con operador H
                    if (tipoIntegracion == "H")
                    {
                        float anchoIntegrado = arbol.Rect.W + segundoNodo.Rect.W;
                        float altoIntegrado  = Math.Max(arbol.Rect.H, segundoNodo.Rect.H);
                        piezaIntegrada = new Rectangulo(0, 0, anchoIntegrado, altoIntegrado);
                    }
                    // Integrar con operador V
                    else if (tipoIntegracion == "V")
                    {
                        float anchoIntegrado = Math.Max(arbol.Rect.W, segundoNodo.Rect.W);
                        float altoIntegrado  = arbol.Rect.H + segundoNodo.Rect.H;
                        piezaIntegrada = new Rectangulo(0, 0, anchoIntegrado, altoIntegrado);
                    }
                    // No se puede integrar
                    else
                    {
                        continue;
                    }

                    // Crear un nodo que contiene el rectángulo integrado
                    Nodo nodo_rectanguloIntegrado = new Nodo(piezaIntegrada);

                    // Agrega el tipo de integración al rectángulo
                    nodo_rectanguloIntegrado.TipoIntegracion = tipoIntegracion;

                    // Agrega los hijos izquierdo y derecho al nodo, considerando que es una pila
                    nodo_rectanguloIntegrado.Izquierdo = arbol;
                    nodo_rectanguloIntegrado.Derecho   = segundoNodo;

                    Utilitarios.CalcularPosiciones(nodo_rectanguloIntegrado);
                    Utilitarios.CalcularPosicionesAbsolutas(nodo_rectanguloIntegrado, 0, 0);
                    stock.Arbol = nodo_rectanguloIntegrado;

                    return;
                }
            }
        }
Ejemplo n.º 2
0
        public static Nodo ConstruirArbolYCalcularPosicionesAPartirDeLista(List <String> ListaStr, List <Rectangulo> listaPiezas)
        {
            // Construimos el árbol a partir de la notación postfija del cromosoma
            Nodo arbol = Utilitarios.ConstruirArbolDeUnaLista(ListaStr, listaPiezas);

            // Una vez construido el árbol, calculamos las posiciones relativas (dependiendo del bloque al que pertenenece)
            Utilitarios.CalcularPosiciones(arbol);
            return(arbol);
        }