int Algoritam1DužinaX()
{
//
// Uklapanje elemenata isključivo horizontalno duž X ose.
//
// Algoritam je jednoprolazan,
// a to znači da će se uklapanje svih elemenata izvršiti samo jednom.
// na osnovu počenog rasporeda elemenata.
//
// Izbor elemenata za uklapanje je na osnovu rasporeda,
// koji je dobijen, sortiranjem elemenata na osnovu
// vrednosti procenta uklapanja i dimenzija elemenata.
//
// Ovakav algoritam je najbrži za predviđeni način uklapanja elemenata,
// ali je procenat popunjenosti table u većini slučajeva mali i zavisi
// isključivo od procenta uklapanja elemenata na posmatranoj poziciji.
//
// Algoritam sadrži optimizaciju koja vrši prilagođavanje površine
// pozicije za uklapanje duž X ose.
//
int broj_elemenata;
int spakovana_površina; // suma vrednosti površina svih spakovanih elemenata
int brojač_elemenata;
int procenat_uklapanja_elementa;
int indeks_elementa;
int dužina_elementa;
int širina_elementa;
int površina_elementa;
int X; // X koordinata pozicije
int Y; // Y koordinata pozicije
int dužina_pozicije;
int širina_pozicije;
int Xmax;// maksimalna dužina pozicije
int Ymax;// maksimalna širina pozicije
int X11;
int Y11;
int dužina11;
int širina11;
int X12;
int Y12;
int dužina12;
int širina12;
spakovana_površina = 0;
// izbriši sadržaj tabele 'Spakovano1D',
// podaci o spakovanim elementima
Spakovano1D.Rows.Clear();
// izbriši sadržaj tabele 'Pozicije'
// podaci o slobodnim pozicijama za uklapanje elemenata
Pozicije.Rows.Clear();
// ubaci u tabelu 'Pozicije', koordinate i dimenzije početne pozicije na tabli
X = 0;
Y = 0;
Pozicije.Rows.Add(X.ToString("000"), // X koordinata
Y.ToString("000"), // Y koordinata
Tabla_X.ToString("000"), // dužina table
Tabla_Y.ToString("000") // širina table
);
// uklapaj sve dok postoje pozicije na koje mogu da se pakuju elementi
while(Pozicije.RowCount>1)
{
// uklapaj sve dok postoje elementi za uklapanje
broj_elemenata = ElementiKopija.RowCount;
if(broj_elemenata > 0)
{
// ubaci vrednosti za dužinu i širinu prve pozicije iz tabele 'Pozicije'
dužina_pozicije = int.Parse(Pozicije[2,0].Value.ToString());
širina_pozicije = int.Parse(Pozicije[3,0].Value.ToString());
// izračunaj procenat uklapanja za svaki element za prvu poziciju
for(brojač_elemenata=0;brojač_elemenata<broj_elemenata;brojač_elemenata++)
{
// dužina elementa
dužina_elementa = int.Parse(ElementiKopija[0,brojač_elemenata].Value.ToString());
// širina elementa
širina_elementa = int.Parse(ElementiKopija[1,brojač_elemenata].Value.ToString());
// početni procenat uklapanja prvog elementa
procenat_uklapanja_elementa = 0;
// da li su ne dozvoljene vrednosti dimenzija elementa
if( dužina_pozicije < dužina_elementa || širina_pozicije < širina_elementa )
{
// element nije uklopiv na posmatranu poziciju
procenat_uklapanja_elementa = 0 ;
}
else
{
// da li je element s horizontalnom orjentacijom
if(dužina_elementa>=širina_elementa)
{
// element može da se uklopi
procenat_uklapanja_elementa++;
// favorizuj tačno uklapanje po X osi
if( dužina_pozicije == dužina_elementa )
{
// ako je dužina elementa jednaka dužini pozicije
procenat_uklapanja_elementa++;
}
// favorizuj tačno uklapanje po Y osi
if( širina_pozicije == širina_elementa )
{
// ako je širina elementa jednaka širini pozicije
procenat_uklapanja_elementa++;
}
}
}
// ubaci vrednost procenta uklapanja za posmatrani element u tabelu
ElementiKopija[3,brojač_elemenata].Value = procenat_uklapanja_elementa.ToString("000");
}
// sortiraj elemente u tabeli na osnovu vrednosti
// procenta uklapanja i veličine površine i dužine
ElementiKopija.Sort(ElementiKopija.Columns[3], ListSortDirection.Descending);
// pročitaj vrednost procenta uklapanja prvog elementa u tabeli
procenat_uklapanja_elementa = int.Parse(ElementiKopija[3,0].Value.ToString());
// ako je prvi element na spisku s najvećom vrednošću za uklapanje veći od nule
if(procenat_uklapanja_elementa > 0)
{
// prvi element je uklopiv
// ubaci koordinate pozicije,
// dimenzije i indeks elementa
// na spisak spakovanih elemenata
Spakovano1D.Rows.Add(Pozicije[0,0].Value.ToString(),// X pozicije
Pozicije[1,0].Value.ToString(),// Y pozicije
ElementiKopija[0,0].Value.ToString(),// dužina elementa
ElementiKopija[1,0].Value.ToString(),// širina elementa
ElementiKopija[4,0].Value.ToString());// indeks
// suma vrednosti površna spakovanih elemenata
površina_elementa = int.Parse(ElementiKopija[2,0].Value.ToString());
spakovana_površina = spakovana_površina + površina_elementa;
//
X11 = 0;
Y11 = 0;
dužina11 = 0;
širina11 = 0;
X12 = 0;
Y12 = 0;
dužina12 = 0;
širina12 = 0;
// Pronađi nove pozicije ako postoje
X = int.Parse(Pozicije[0,0].Value.ToString());
Y = int.Parse(Pozicije[1,0].Value.ToString());
Xmax = int.Parse(Pozicije[2,0].Value.ToString());
Ymax = int.Parse(Pozicije[3,0].Value.ToString());
dužina_elementa = int.Parse(ElementiKopija[0,0].Value.ToString());
širina_elementa = int.Parse(ElementiKopija[1,0].Value.ToString());
// Ako je element kraći od dužine pozicije na kojoj je uklopljen
if(dužina_elementa<Xmax)
{
X11 = X + dužina_elementa;
Y11 = Y;
dužina11 = Tabla_X - X11;
širina11 = širina_elementa;
}
// Ako je element kraći od širine pozicije na kojoj je uklopljen
if(širina_elementa<Ymax)
{
X12 = X;
Y12 = Y + širina_elementa;
dužina12 = Tabla_X - X12;
širina12 = Ymax - širina_elementa;
// ako je pozicija neodgovarajuća,
// izbriši je i prilagodi ostatak površine za uklapanje
// ovo je prilagođavanje površine duž X ose
if(širina12<najmanja_širina_elementa)
{
širina11 = širina11 + širina12;
širina_elementa = Ymax;
}
}
// Ako je element kraći od dužine pozicije na kojoj je uklopljen
if(dužina_elementa<Xmax)
{
Pozicije.Rows.Add(X11.ToString("000"),
Y11.ToString("000"),
dužina11.ToString("000"),
širina11.ToString("000"));
}
// Ako je element kraći od širine pozicije na kojoj je uklopljen
if(širina_elementa<Ymax)
{
Pozicije.Rows.Add(X12.ToString("000"),
Y12.ToString("000"),
dužina12.ToString("000"),
širina12.ToString("000"));
}
// izbriši popunjenu poziciju sa spiska
Pozicije.Rows.RemoveAt(0);
// sortiraj preostale pozicije po Y, a zatim po X osi
Pozicije.Sort(Pozicije.Columns[1], ListSortDirection.Ascending);
// izbriši spakovan element sa spiska elemenata i sve njegove varijante po indeksu
broj_elemenata = ElementiKopija.RowCount;
indeks_elementa = int.Parse(ElementiKopija[4,0].Value.ToString());
for(brojač_elemenata=0;brojač_elemenata<broj_elemenata;brojač_elemenata++)
{
if(indeks_elementa.ToString("000") == ElementiKopija[4,brojač_elemenata].Value.ToString())
{
ElementiKopija.Rows.RemoveAt(brojač_elemenata);
broj_elemenata--;
brojač_elemenata--;
}
}
}
else
{
// procenat_uklapanja <= 0,
// ne postoji nijedan element,
// koji se može spakovati na prvu poziciju
// izbriši poziciju sa spiska
Pozicije.Rows.RemoveAt(0);
}
}
else
{
Pozicije.RowCount = 1;
}
}
broj_spakovanih_elemenata = Spakovano1D.RowCount - 1;
return spakovana_površina;
}