예제 #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;
                }
            }
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
                        }
                    }
                }
            }
        }
예제 #4
0
        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);
            }
        }