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; } } }
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); }