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 double CalcularDesperdicio(List <Stock> listaStocks, List <Rectangulo> listaPiezas) { double area1 = 0; foreach (Rectangulo pieza in listaPiezas) { area1 += pieza.W * pieza.H; } double area2 = 0, area3 = 0, area4 = 0; int i = 1; foreach (Stock stock in listaStocks) { if (stock.Arbol != null) { // Calcular las posiciones absolutas Utilitarios.CalcularPosicionesAbsolutas(stock.Arbol, 0, 0); // Convertirlo a lista List <Rectangulo> listaPiezas_Stock = Utilitarios.ConvertirALista(stock.Arbol); area2 += stock.W * stock.H; area3 += (stock.Arbol.Rect.W + stock.Arbol.Rect.H) * i; foreach (Rectangulo pieza in listaPiezas_Stock) { if (Utilitarios.SeEncuentraEnLista(pieza, stock.ListaDefectos)) { //area1 -= pieza.W * pieza.H; area4 += pieza.W * pieza.H; } } i += 3; //desperdicio += (anchoStock * altoStock - anchoOcupadoPiezas * altoOcupadoPiezas); } } return(5 * (area1 / area2) + 5 * (area1 / area3) - 5 * (area4 / area1)); }
public void Algoritmo2() { foreach (Stock stock in listaStocks) { if (stock.Arbol != null) { // Calcular las posiciones absolutas Utilitarios.CalcularPosicionesAbsolutas(stock.Arbol, 0, 0); // Convertirlo a lista List <Rectangulo> listaPiezas_Stock = Utilitarios.ConvertirALista(stock.Arbol); foreach (Rectangulo pieza in listaPiezas_Stock) { // Si la pieza cae en una región con defecto if (Utilitarios.SeEncuentraEnLista(pieza, stock.ListaDefectos)) { InsertarPiezaEnUnStock(pieza); } } } } }
public static void CalcularPosicionesAbsolutas(Nodo raiz, float x, float y) { Rectangulo pieza = raiz.Rect; int pieza_id = pieza.Id; // Si es una hoja, entonces dibujar la pieza y detener la recursion if (raiz.Izquierdo == null && raiz.Derecho == null) { float x_abs_pieza = raiz.Rect.X + x; float y_abs_pieza = raiz.Rect.Y + y; raiz.Rect.X_abs = x_abs_pieza; raiz.Rect.Y_abs = y_abs_pieza; return; } // Si es un arbol, llamar de forma recursiva a sus hijos else { float x_abs_bloque = raiz.Rect.X + x; float y_abs_bloque = raiz.Rect.Y + y; Utilitarios.CalcularPosicionesAbsolutas(raiz.Izquierdo, x_abs_bloque, y_abs_bloque); Utilitarios.CalcularPosicionesAbsolutas(raiz.Derecho, x_abs_bloque, y_abs_bloque); } }