Generator dimenzija pravougaonih dvodimenzionalnih elemena
/*****************************************************************************************************
* Program name : Generator dimenzija pravougaonih dvodimenzionalnih elemenata *
* Program ver. : 3.1 Finalna verzija *
* Created by : SharpDevelop *
* Code author : Perić Željko *
* Code language : C# *
* Date created : 20.08.2013 *
* Time created : 21:22 *
* *
* *
* Program Description : Program je kreiran za potrebe testiranja programa za uklapanje *
* pravougaonih dvodimenzionalnih elemenata na ortogonalnoj tabli. *
* *
* Pravougaoni dvodimenzionalni element karakterišu 'DUŽINA' i 'ŠIRINA'. *
* Ove dve karakteristike sa svojim vrednostima se nazivaju 'DIMENZIJE'. *
* Program generiše traženi par vrednosti, za dimenzije elemenata, *
* uz pomoć programske funkcije za generisanje slučajnih brojeva. *
* Vrednosti za dužinu i širinu mogu biti različite ili iste. *
* Sam pojam dužina ne podrazumeva veću vrednost u odnosu na širinu. *
* Vrednosti su pozitivni celi brojevi deljivi brojem deset. *
* *
* *
* Opcije koje kontrolišu način generisanja dimezija su : *
* *
* 1 - 'Rotacija elementa' *
* *
* 2 - 'Kopije elemenata' *
* *
* 3 - 'Dozvoljena oscilacija dimenzija' *
* *
* *
* Prva opcija se odnosi na mogućnost da se već generisane vrednosti za *
* dužinu i širinu elementa međusobno zamene i na taj način dobije novi *
* par vrednosti koji bi bio upamćen kao dimenzije novog elementa. *
* *
* Primer : *
* *
* Element br.( dužina, širina ) *
* *
* Element 1 ( 100, 50 ) rotiranjem se dobija Element 2 ( 100, 50 ) *
* *
* *
* Kopija elementa je onaj element koji ima iste vrednosti za dužinu i *
* širinu kao i neki drugi element. *
* *
* Primer : *
* *
* Element 1 ( 100, 50 ) jeste kopija Elementa 2 ( 100, 50 ) *
* Element 1 ( 100, 50 ) nije kopija Elementa 2 ( 50, 100 ) *
* *
* Druga opcija sprečava generisanje istih vrednosti za dužinu i širinu *
* elemenata, odnosno onemogućava pojavu kopija elemenata. *
* U nekim slučajevima ova opcija je onemogućena jer zavisi od izbora *
* ostalih opcija u programu, druga i treća opcija su isključive. *
* Broj dimenzija koje se mogu generisati kada je ova opcija uključena *
* zavisi od odnosa odabranih vrednosti za opsege najmanje i najveće *
* širine i dužine elemenata i mogućnosti rotacije elemenata. *
* Ako je odnos vrednosti nepovoljan, u zadatim opsezima nije moguće *
* generisati željeni broj jedinstvenih dimenzija. *
* *
* *
* Treća opcija kontroliše razliku u dimenzijama između elemenata tako što *
* određuje maksimalnu razliku u dimenzijama, između elementa koji je već *
* generisan i elementa koji tek treba da se generiše. Na ovaj način se *
* dobijaju ujednačene dimenzija elemenata, i mnogo veći broj istih *
* dimenzija. Uključenjem treće opcije isključuje se druga opcija. *
* *
* *
* Generisane dimenzije su pored prikaza u tabeli, snimljene u tekstualnom *
* dokumentu 'Dimenzije elemenata.txt' u fascikli gde se nalazi izvršna *
* verzija programa. *
* *
* *
* Broj dimenzija elemenata koje program može da generiše u zavisnosti od *
* odabranih opcija je prikazan u polju 'Max. broj elemenata' *
* *
* *
* Notice : Dozvoljeni opsezi vrednosti za promenljive unutar programa koje korisnik sam unosi *
* preko odgovarajaćih polja grafičkog korisničkog interfejsa su međusobno zavisne: *
* *
* Polje Min Maks *
* *
* 'Broj elemenata' 1 10000 *
* *
* 'Najmanja dužina' 10 'Najveća dužina' - 10 *
* 'Najmanja širina' 10 'Najveća širina' - 10 *
* *
* 'Najveća dužina' 'Najmanja dužina' + 10 10000 *
* 'Najveća širina' 'Najmanja širina' + 10 10000 *
* *
* 'Oscilacija dužine' 0 'Najveća dužina' - 'Najmanja dužina' *
* 'Oscilacija širine' 0 'Najveća širina' - 'Najmanja širina' *
* *
* *
* *
* Sve najbolje, *
* Autor *
* *
*****************************************************************************************************/
using System;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace Generator_dimenzija_pravougaonih_dvodimenzionalnih_elemenata
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// Izbriši sadržaj tabele elemenata
Tabela_Dimenzije_Elemenata.Rows.Clear();
Tabela_Dimenzije_Elemenata.RowCount = 100;
Tabela_Dimenzije_Elemenata.Enabled = false;
}
#region - Metode 'Generiši Dimenzije', za generisanje vrednosti dimenzija -
void Generiši_Dimenzije_Bez_Kopija()
{
#region - Deklaracija i inicijalizacija promenljivih -
const string naziv_dokumenta = "Dimenzije elemenata.txt";
string linija = string.Empty;
StreamWriter snimi = new StreamWriter(naziv_dokumenta,false,Encoding.UTF8);
Random slučajan_broj = new Random();
int željeni_broj_elemenata = (int)Željeni_Broj_Elemenata_Polje.Value;
int mogući_broj_dimenzija = 0;
int najmanja_dužina = (int)Najmanja_Dužina_Polje.Value;
int najmanja_širina = (int)Najmanja_Širina_Polje.Value;
int najveća_dužina = (int)Najveća_Dužina_Polje.Value;
int najveća_širina = (int)Najveća_Širina_Polje.Value;
int opseg_dužine = 0;
int opseg_širine = 0;
int dužina = 0;
int širina = 0;
int i = 0;
int j = 0;
int k = 0;
int brojač = 0;
int [] iste_vrednosti_oba_opsega;
int [] različite_vrednosti_opsega_dužina;
int [] različite_vrednosti_opsega_širina;
int [,] dimenzije;
int z = 0;
int d = 0;
int š = 0;
bool različito = true;
#endregion
//
// Izračunaj mogući broj jedinstvenih dimenzija elemenata,
// pri zadatim vrednostima opsega
// za najveću i najmanju vrednost dužine i širine elementa
// u zavisnosti od dozvoljene ili ne dozoljene rotacije elemenata
//
#region - Metoda -
opseg_dužine = (najveća_dužina - najmanja_dužina)/10 + 1;
opseg_širine = (najveća_širina - najmanja_širina)/10 + 1;
for(i=najmanja_dužina;i<=najveća_dužina;i+=10)
{
for(j=najmanja_širina;j<=najveća_širina;j+=10)
{
if(i==j)
{
k++; // broj istih vrednosti dva opsega
}
}
}
i = opseg_dužine - k; // broj različitih vrednosti za opseg dužine
j = opseg_širine - k; // broj različitih vrednosti za opseg širine
//
// Mogući broj jedinstvenih dimenzija elemenata
//
// Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
mogući_broj_dimenzija = (k*k) + (k*i*2) + (k*j*2) + (i*j*2);
}
// Ako je rotacija elemenata ne dozvoljena
else
{
mogući_broj_dimenzija = (k*k) + (k*i) + (k*j) + (i*j);
}
dimenzije = new int[mogući_broj_dimenzija,2];
Tabela_Dimenzije_Elemenata.Rows.Clear();
Tabela_Dimenzije_Elemenata.RowCount = željeni_broj_elemenata;
#endregion
//
// Pronađi sve moguće dimenzije
// s jedinstvenim parovima vrednosti za dužinu i širinu
//
#region - Metode -
// Prvi slučaj :
// Vrednosti opsega za dužinu i širinu su potpuno različite
// Granice opsega se ne preklapaju
#region - Metoda -
if(k==0)
{
i = 0;
j = 0;
brojač = 0;
dužina = 0;
širina = 0;
for(i=najmanja_dužina;i<=najveća_dužina;i+=10)
{
for(j=najmanja_širina;j<=najveća_širina;j+=10)
{
dužina = i;
širina = j;
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
// Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
// Zameni vrednosti za dužinu i širinu
dužina = j;
širina = i;
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
}
}
}
}
#endregion
// Drugi slučaj :
// Opsezi za dužinu i širinu imaju istih vrednosti
// Granice opsega se preklapaju
#region - Metoda -
else if(k>0)
{
i = 0;
j = 0;
brojač = 0;
z = k;
d = opseg_dužine - k;
š = opseg_širine - k;
dužina = 0;
širina = 0;
iste_vrednosti_oba_opsega = new int[z];
različite_vrednosti_opsega_dužina = new int[d];
različite_vrednosti_opsega_širina = new int[š];
// Uporedi vrednosti oba opsega
// i razdvoji vrednosti po određenom kriterijumu
#region - Metoda -
// Izdvoji iste vrednosti iz oba opsega
z = 0;
for(i=najmanja_dužina;i<=najveća_dužina;i+=10)
{
for(j=najmanja_širina;j<=najveća_širina;j+=10)
{
if(i==j)
{
iste_vrednosti_oba_opsega[z] = i;
z++;
}
}
}
// Izdvoji različite vrednosti iz opsega dužine
d = 0;
for(i=najmanja_dužina;i<=najveća_dužina;i+=10)
{
različito = true;
for(j=0;j<z;j++)
{
if(i==iste_vrednosti_oba_opsega[j])
{
različito = false;
break;
}
}
if(različito)
{
različite_vrednosti_opsega_dužina[d] = i;
d++;
}
}
// Izdvoji različite vrednosti iz opsega širine
š = 0;
for(i=najmanja_širina;i<=najveća_širina;i+=10)
{
različito = true;
for(j=0;j<z;j++)
{
if(i==iste_vrednosti_oba_opsega[j])
{
različito = false;
break;
}
}
if(različito)
{
različite_vrednosti_opsega_širina[š] = i;
š++;
}
}
#endregion
// Generiši dimenzije iz niza istih vrednosti oba opsega
#region- Metoda -
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
dužina = iste_vrednosti_oba_opsega[i];
širina = iste_vrednosti_oba_opsega[j];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
}
}
#endregion
// Generiši dimenzije iz niza različitih vrednosti za opseg dužina
// i niza istih vrednosti oba opsega
#region- Metoda -
for(i=0;i<d;i++)
{
for(j=0;j<z;j++)
{
dužina = različite_vrednosti_opsega_dužina[i];
širina = iste_vrednosti_oba_opsega[j];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
// Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
// Zameni vrednosti za dužinu i širinu
dužina = iste_vrednosti_oba_opsega[j];
širina = različite_vrednosti_opsega_dužina[i];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
}
}
}
#endregion
// Generiši dimenzije iz niza različitih vrednosti za opseg širina
// i niza istih vrednosti oba opsega
#region- Metoda -
for(i=0;i<š;i++)
{
for(j=0;j<z;j++)
{
// Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
dužina = različite_vrednosti_opsega_širina[i];
širina = iste_vrednosti_oba_opsega[j];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
}
// Zameni vrednosti za dužinu i širinu
dužina = iste_vrednosti_oba_opsega[j];
širina = različite_vrednosti_opsega_širina[i];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
}
}
#endregion
// Generiši dimenzije iz niza različitih vrednosti za opseg dužina i
// niza različitih vrednosti za opseg širina
#region - Metoda -
for(i=0;i<d;i++)
{
for(j=0;j<š;j++)
{
dužina = različite_vrednosti_opsega_dužina[i];
širina = različite_vrednosti_opsega_širina[j];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
// Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
// Zameni vrednosti za dužinu i širinu
dužina = različite_vrednosti_opsega_širina[j];
širina = različite_vrednosti_opsega_dužina[i];
// Upamti vrednosti za dužinu i širinu
dimenzije[brojač,0] = dužina;
dimenzije[brojač,1] = širina;
brojač++;
}
}
}
#endregion
}
#endregion
#endregion
//
// Prepiši dimenzije za željeni broj elemenata u tabelu Dimenzije Elemenata
// po slučajnom izboru elemenata
//
#region - Metoda -
dužina = 0;
širina = 0;
brojač = 0;
i = 0;
if(mogući_broj_dimenzija>željeni_broj_elemenata)
{
while(brojač<željeni_broj_elemenata)
{
i = slučajan_broj.Next(0,mogući_broj_dimenzija);
if(dimenzije[i,0]>0)
{
dužina = dimenzije[i,0];
širina = dimenzije[i,1];
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString();
dimenzije[i,0] = -1;
brojač++;
}
}
}
else
{
while(brojač<željeni_broj_elemenata)
{
dužina = dimenzije[brojač,0];
širina = dimenzije[brojač,1];
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString();
brojač++;
}
}
#endregion
//
// Sortiraj dimenzije na osnovu vrednosti dužine i širine elementata
//
Prilagodi_Format_Podataka_U_Tabeli_Za_Sortiranje();
Tabela_Dimenzije_Elemenata.Sort(Column1, ListSortDirection.Descending);
Prilagodi_Format_Vrednostima_U_Tabeli_Za_Potrebe_Pregleda();
//
// Snimi dimenzije u fajl 'Dimenzije elemenata.txt'
//
#region - Metoda -
dužina = 0;
širina = 0;
brojač = 0;
while (brojač<Tabela_Dimenzije_Elemenata.RowCount)
{
dužina = int.Parse(Tabela_Dimenzije_Elemenata[0,brojač].Value.ToString());
širina = int.Parse(Tabela_Dimenzije_Elemenata[1,brojač].Value.ToString());
linija = dužina.ToString() + "," + širina.ToString();
snimi.WriteLine(linija);
brojač++;
}
snimi.Close();
snimi.Dispose();
#endregion
}
void Generiši_Dimenzije_Sa_Dozvoljenom_Oscilacijom_Dimenzija()
{
#region - Deklaracija i inicijalizacija promenljivih -
const string naziv_dokumenta = "Dimenzije elemenata.txt";
string linija = string.Empty;
StreamWriter snimi = new StreamWriter(naziv_dokumenta,false,Encoding.UTF8);
Random slučajan_broj = new Random();
int željeni_broj_elemenata = (int)Željeni_Broj_Elemenata_Polje.Value;
int najmanja_dužina = (int)Najmanja_Dužina_Polje.Value;
int najmanja_širina = (int)Najmanja_Širina_Polje.Value;
int najveća_dužina = (int)Najveća_Dužina_Polje.Value+1;
int najveća_širina = (int)Najveća_Širina_Polje.Value+1;
int dozvoljena_najmanja_dužina = najmanja_dužina;
int dozvoljena_najmanja_širina = najmanja_širina;
int dozvoljena_najveća_dužina = najveća_dužina;
int dozvoljena_najveća_širina = najveća_širina;
int željena_oscilacija_dužine = (int)Oscilacija_Dužine_Polje.Value;
int željena_oscilacija_širine = (int)Oscilacija_Širine_Polje.Value;
int brojač = 0;
int dužina = 0;
int širina = 0;
Tabela_Dimenzije_Elemenata.Rows.Clear();
Tabela_Dimenzije_Elemenata.RowCount = željeni_broj_elemenata;
#endregion
//
// Generiši dimenzije prvog elementa
//
#region - Metoda -
dužina = slučajan_broj.Next(dozvoljena_najmanja_dužina,dozvoljena_najveća_dužina);
// Vrednost mora biti deljiva brojem deset
while((dužina%10) != 0)
{
dužina = slučajan_broj.Next(dozvoljena_najmanja_dužina,dozvoljena_najveća_dužina);
}
širina = slučajan_broj.Next(dozvoljena_najmanja_širina,dozvoljena_najveća_širina);
// Vrednost mora biti deljiva brojem deset
while((širina%10) != 0)
{
širina = slučajan_broj.Next(dozvoljena_najmanja_širina,dozvoljena_najveća_širina);
}
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString();
brojač++;
//Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
//Zameni i upamti vrednosti za dužinu i širinu
Tabela_Dimenzije_Elemenata[0,brojač].Value = širina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = dužina.ToString();
brojač++;
}
#endregion
//
// Generiši dimenzije ostalih elemenata
// uz primenu dozvoljene oscilacije dimenzija predhodnog elementa
//
#region - Metoda -
while (brojač<željeni_broj_elemenata)
{
if(Oscilacija_Dužine_Izbor.Checked)
{
dozvoljena_najmanja_dužina = dužina - željena_oscilacija_dužine;
if(dozvoljena_najmanja_dužina<najmanja_dužina)
{
dozvoljena_najmanja_dužina = najmanja_dužina;
}
dozvoljena_najveća_dužina = dužina + željena_oscilacija_dužine;
if(dozvoljena_najveća_dužina>najveća_dužina)
{
dozvoljena_najveća_dužina = najveća_dužina;
}
}
if(Oscilacija_Širine_Izbor.Checked)
{
dozvoljena_najmanja_širina = širina - željena_oscilacija_širine;
if(dozvoljena_najmanja_širina<najmanja_širina)
{
dozvoljena_najmanja_širina = najmanja_širina;
}
dozvoljena_najveća_širina = širina + željena_oscilacija_širine;
if(dozvoljena_najveća_širina>najveća_širina)
{
dozvoljena_najveća_širina = najveća_širina;
}
}
dužina = slučajan_broj.Next(dozvoljena_najmanja_dužina,dozvoljena_najveća_dužina);
// Vrednost mora biti deljiva brojem deset
while((dužina%10) != 0)
{
dužina = slučajan_broj.Next(dozvoljena_najmanja_dužina,dozvoljena_najveća_dužina);
}
širina = slučajan_broj.Next(dozvoljena_najmanja_širina,dozvoljena_najveća_širina);
// Vrednost mora biti deljiva brojem deset
while((širina%10) != 0)
{
širina = slučajan_broj.Next(dozvoljena_najmanja_širina,dozvoljena_najveća_širina);
}
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString();
brojač++;
//Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked && brojač<željeni_broj_elemenata)
{
//Zameni i upamti vrednosti za dužinu i širinu
Tabela_Dimenzije_Elemenata[0,brojač].Value = širina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = dužina.ToString();
brojač++;
}
}
#endregion
//
// Sortiraj dimenzije na osnovu vrednosti dužine i širine elementata
//
Prilagodi_Format_Podataka_U_Tabeli_Za_Sortiranje();
Tabela_Dimenzije_Elemenata.Sort(Column1, ListSortDirection.Descending);
Prilagodi_Format_Vrednostima_U_Tabeli_Za_Potrebe_Pregleda();
//
// Snimi dimenzije u fajl 'Dimenzije elemenata.txt'
//
#region - Metoda -
dužina = 0;
širina = 0;
brojač = 0;
while (brojač<željeni_broj_elemenata)
{
dužina = int.Parse(Tabela_Dimenzije_Elemenata[0,brojač].Value.ToString());
širina = int.Parse(Tabela_Dimenzije_Elemenata[1,brojač].Value.ToString());
linija = dužina.ToString() + "," + širina.ToString();
snimi.WriteLine(linija);
brojač++;
}
snimi.Close();
snimi.Dispose();
#endregion
}
void Generiši_Dimenzije_Bez_Ograničenja()
{
#region - Deklaracija i inicijalizacija promenljivih -
const string naziv_dokumenta = "Dimenzije elemenata.txt";
string linija = string.Empty;
StreamWriter snimi = new StreamWriter(naziv_dokumenta,false,Encoding.UTF8);
Random slučajan_broj = new Random();
int željeni_broj_elemenata = (int)Željeni_Broj_Elemenata_Polje.Value;
int najmanja_dužina = (int)Najmanja_Dužina_Polje.Value;
int najmanja_širina = (int)Najmanja_Širina_Polje.Value;
int najveća_dužina = (int)Najveća_Dužina_Polje.Value+1;
int najveća_širina = (int)Najveća_Širina_Polje.Value+1;
int brojač = 0;
int dužina = 0;
int širina = 0;
Tabela_Dimenzije_Elemenata.Rows.Clear();
Tabela_Dimenzije_Elemenata.RowCount = željeni_broj_elemenata;
#endregion
//
// Generiši željeni broj dimenzija elemenata
//
#region - Metoda -
while (brojač<željeni_broj_elemenata)
{
dužina = slučajan_broj.Next(najmanja_dužina,najveća_dužina);
// Vrednost mora biti deljiva brojem deset
while((dužina%10) != 0)
{
dužina = slučajan_broj.Next(najmanja_dužina,najveća_dužina);
}
širina = slučajan_broj.Next(najmanja_širina,najveća_širina);
// Vrednost mora biti deljiva brojem deset
while((širina%10) != 0)
{
širina = slučajan_broj.Next(najmanja_širina,najveća_širina);
}
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString();
brojač++;
//Ako je dozvoljena rotacija elemenata
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked && brojač<željeni_broj_elemenata)
{
//Zameni i upamti vrednosti za dužinu i širinu
Tabela_Dimenzije_Elemenata[0,brojač].Value = širina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = dužina.ToString();
brojač++;
}
}
#endregion
//
// Sortiraj dimenzije na osnovu vrednosti dužine i širine elementata
//
Prilagodi_Format_Podataka_U_Tabeli_Za_Sortiranje();
Tabela_Dimenzije_Elemenata.Sort(Column1, ListSortDirection.Descending);
Prilagodi_Format_Vrednostima_U_Tabeli_Za_Potrebe_Pregleda();
//
// Snimi dimenzije u fajl 'Dimenzije elemenata.txt'
//
#region - Metoda -
dužina = 0;
širina = 0;
brojač = 0;
while (brojač<Tabela_Dimenzije_Elemenata.RowCount)
{
dužina = int.Parse(Tabela_Dimenzije_Elemenata[0,brojač].Value.ToString());
širina = int.Parse(Tabela_Dimenzije_Elemenata[1,brojač].Value.ToString());
linija = dužina.ToString() + "," + širina.ToString();
snimi.WriteLine(linija);
brojač++;
}
snimi.Close();
snimi.Dispose();
#endregion
}
void Generiši_Dimenzije_Click(object sender, EventArgs e)
{
Tabela_Dimenzije_Elemenata.Enabled = true;
Generiši_Dimenzije();
}
void Generiši_Dimenzije()
{
Cursor = Cursors.WaitCursor;
if(Ne_Dozvoljene_Kopije_Elemenata_Izbor.Checked && Ne_Dozvoljene_Kopije_Elemenata_Izbor.Enabled)
{
Generiši_Dimenzije_Bez_Kopija();
}
else if(Oscilacija_Dužine_Izbor.Checked || Oscilacija_Širine_Izbor.Checked)
{
Generiši_Dimenzije_Sa_Dozvoljenom_Oscilacijom_Dimenzija();
}
else
{
Generiši_Dimenzije_Bez_Ograničenja();
}
Cursor = Cursors.Default;
}
#endregion
#region - Metode za ispitivanje i sortiranje -
void Da_Li_Može_Bez_Kopija_Elemenata()
{
#region - Deklaracija i inicijalizacija promenljivih -
int željeni_broj_elemenata = (int)Željeni_Broj_Elemenata_Polje.Value;
int mogući_broj_dimenzija = 0;
int najmanja_dužina = (int)Najmanja_Dužina_Polje.Value;
int najmanja_širina = (int)Najmanja_Širina_Polje.Value;
int najveća_dužina = (int)Najveća_Dužina_Polje.Value;
int najveća_širina = (int)Najveća_Širina_Polje.Value;
int opseg_dužine = 0;
int opseg_širine = 0;
int i = 0;
int j = 0;
int k = 0;
#endregion
//
// Izračunaj mogući broj jedinstvenih dimenzija elemenata,
// pri zadatim vrednostima opsega
// za najveću i najmanju vrednost dužine i širine elementa
// u zavisnosti od dozvoljene ili ne dozoljene rotacije elemenata
//
#region - Metoda -
opseg_dužine = (najveća_dužina - najmanja_dužina)/10 + 1;
opseg_širine = (najveća_širina - najmanja_širina)/10 + 1;
for(i=najmanja_dužina;i<=najveća_dužina;i+=10)
{
for(j=najmanja_širina;j<=najveća_širina;j+=10)
{
if(i==j)
{
k++; // broj istih vrednosti dva opsega
}
}
}
i = opseg_dužine - k; // broj različitih vrednosti za opseg dužine
j = opseg_širine - k; // broj različitih vrednosti za opseg širine
//
// Mogući broj jedinstvenih dimenzija elemenata
//
// Ako je rotacija elemenata dozvoljena
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked)
{
mogući_broj_dimenzija = (k*k) + (k*i*2) + (k*j*2) + (i*j*2);
}
// Ako rotacija elemenata nije dozvoljena
else
{
mogući_broj_dimenzija = (k*k) + (k*i) + (k*j) + (i*j);
}
// Ako je izabrana opcija bez kopija
if(Ne_Dozvoljene_Kopije_Elemenata_Izbor.Checked)
{
// Ako je mogući broj jedinstvenih dimenzija elemenata
// veći od dozvoljenog maksimuma
if(mogući_broj_dimenzija>10000)
{
mogući_broj_dimenzija = 10000;
}
// Prikaži mogući broj dimenzija
Maksimalni_Broj_Elemenata_Polje.Text = mogući_broj_dimenzija.ToString();
Željeni_Broj_Elemenata_Polje.Maximum = mogući_broj_dimenzija;
}
// Ako je dozvoljeno generisati kopije
else if(Dozvoljene_Kopije_Elemenata_Izbor.Checked)
{
// Prikaži dozvoljeni maksimum broja elemenata
Maksimalni_Broj_Elemenata_Polje.Text = "10000";
Željeni_Broj_Elemenata_Polje.Maximum = 10000;
}
#endregion
}
void Tabela_Dimenzije_Elemenata_Column_Header_Click(object sender, DataGridViewCellMouseEventArgs e)
{
//
// Sortiraj dimenzije elemenata u tabeli
// suprotnim redosledom sortiranja od predhodnog
//
Prilagodi_Format_Podataka_U_Tabeli_Za_Sortiranje();
if(Tabela_Dimenzije_Elemenata.SortOrder == SortOrder.Descending)
{
Tabela_Dimenzije_Elemenata.Sort(Tabela_Dimenzije_Elemenata.Columns[e.ColumnIndex], ListSortDirection.Ascending);
}
else
{
Tabela_Dimenzije_Elemenata.Sort(Tabela_Dimenzije_Elemenata.Columns[e.ColumnIndex], ListSortDirection.Descending);
}
Prilagodi_Format_Vrednostima_U_Tabeli_Za_Potrebe_Pregleda();
}
void Prilagodi_Format_Podataka_U_Tabeli_Za_Sortiranje()
{
int dužina = 0;
int širina = 0;
int brojač = 0;
//Prilagodi format vrednostima u tabeli za potrebe sortiranja
while(brojač<Tabela_Dimenzije_Elemenata.RowCount)
{
dužina = int.Parse(Tabela_Dimenzije_Elemenata[0,brojač].Value.ToString());
širina = int.Parse(Tabela_Dimenzije_Elemenata[1,brojač].Value.ToString());
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString("00000");
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString("00000");
brojač++;
}
}
void Prilagodi_Format_Vrednostima_U_Tabeli_Za_Potrebe_Pregleda()
{
int dužina = 0;
int širina = 0;
int brojač = 0;
//Prilagodi format vrednostima u tabeli za potrebe pregleda
brojač = 0;
while(brojač<Tabela_Dimenzije_Elemenata.RowCount)
{
dužina = int.Parse(Tabela_Dimenzije_Elemenata[0,brojač].Value.ToString());
širina = int.Parse(Tabela_Dimenzije_Elemenata[1,brojač].Value.ToString());
Tabela_Dimenzije_Elemenata[0,brojač].Value = dužina.ToString();
Tabela_Dimenzije_Elemenata[1,brojač].Value = širina.ToString();
brojač++;
}
}
void Sortiraj_Dimenzije_Elemenata(object sender, DataGridViewSortCompareEventArgs e)
{
// Obrada događaja SortCompare,
// koji se pokreće svaki put
// kada se upoređuju vrednosti ćelija zbog sortiranja tabele.
// Sortira podatke u tabeli na osnovu odabranog redosleda,
// rastućeg ili opadajućeg, prvo upoređujući vrednosti ćelija u prvoj,
// odabranoj koloni, a zatim, ukoliko su vrednosti iste,
// upoređujući pripadajuće vrednosti dimenzija elemenata u ćelijama u drugoj koloni.
int odabrana_kolona = 0;
int druga_kolona = 0;
// Određuje koja kolona se prvo sortira
odabrana_kolona = e.Column.Index;
// Određuje koja kolona se alternativno sortira
if(odabrana_kolona == 0)
druga_kolona = 1;
else
druga_kolona = 0;
// Upoređuje i sortira vrednosti ćelija u prvoj, odabranoj, koloni
e.SortResult = System.String.Compare(
Tabela_Dimenzije_Elemenata.Rows[e.RowIndex1].Cells[odabrana_kolona].Value.ToString(),
Tabela_Dimenzije_Elemenata.Rows[e.RowIndex2].Cells[odabrana_kolona].Value.ToString());
// Ako su upoređene vrednosti u prvoj koloni iste
// uporedi vrednosti u drugoj koloni
if (e.SortResult == 0)
{
e.SortResult = System.String.Compare(
Tabela_Dimenzije_Elemenata.Rows[e.RowIndex1].Cells[druga_kolona].Value.ToString(),
Tabela_Dimenzije_Elemenata.Rows[e.RowIndex2].Cells[druga_kolona].Value.ToString());
}
e.Handled = true;
}
#endregion
#region - Obrada događaja 'Promena izbora opcija' -
void Oscilacija_Dužine_Izbor_Promenjen(object sender, EventArgs e)
{
if(Oscilacija_Dužine_Izbor.Checked)
{
Oscilacija_Dužine_Polje.Enabled = true;
Ne_Dozvoljene_Kopije_Elemenata_Izbor.Enabled = false;
Dozvoljene_Kopije_Elemenata_Izbor.Checked = true;
}
else
{
Oscilacija_Dužine_Polje.Enabled = false;
if(!Oscilacija_Širine_Izbor.Checked)
{
Ne_Dozvoljene_Kopije_Elemenata_Izbor.Enabled = true;
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
}
void Oscilacija_Širine_Izbor_Promenjen(object sender, EventArgs e)
{
if(Oscilacija_Širine_Izbor.Checked)
{
Oscilacija_Širine_Polje.Enabled = true;
Ne_Dozvoljene_Kopije_Elemenata_Izbor.Enabled = false;
Dozvoljene_Kopije_Elemenata_Izbor.Checked = true;
}
else
{
Oscilacija_Širine_Polje.Enabled = false;
if(!Oscilacija_Dužine_Izbor.Checked)
{
Ne_Dozvoljene_Kopije_Elemenata_Izbor.Enabled = true;
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
}
void Dozvoljene_Kopije_Elemenata_Izbor_Promenjen(object sender, EventArgs e)
{
if(Dozvoljene_Kopije_Elemenata_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Ne_Dozvoljene_Kopije_Elemenata_Izbor_Promenjen(object sender, EventArgs e)
{
if(Ne_Dozvoljene_Kopije_Elemenata_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Dozvoljena_Rotacija_Elementa_Izbor_Promenjen(object sender, EventArgs e)
{
if(Dozvoljena_Rotacija_Elementa_Izbor.Checked &&
!Oscilacija_Dužine_Izbor.Checked &&
!Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Ne_Dozvoljena_Rotacija_Elemenata_Izbor_Promenjen(object sender, EventArgs e)
{
if(Ne_Dozvoljena_Rotacija_Elemenata_Izbor.Checked &&
!Oscilacija_Dužine_Izbor.Checked &&
!Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
#endregion
#region - Obrada događaja 'Promena ulaznih vrednosti' -
void Željeni_Broj_Elemenata_Polje_Promena(object sender, EventArgs e)
{
if(!Oscilacija_Dužine_Izbor.Checked && !Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Najmanja_Dužina_Polje_Promena(object sender, EventArgs e)
{
if(Najmanja_Dužina_Polje.Value%10!=0)
{
MessageBox.Show(" Poslednja cifra unetog broja mora biti nula. \n" +
" npr. 10 , 50 , 100 , 110 , 250 , 600 , ... ",
" Greška pri unosu podataka !",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
Najmanja_Dužina_Polje.Value = Najmanja_Dužina_Polje.Minimum;
}
else
{
Najveća_Dužina_Polje.Minimum = Najmanja_Dužina_Polje.Value + 10;
Oscilacija_Dužine_Polje.Maximum = Najveća_Dužina_Polje.Value - Najmanja_Dužina_Polje.Value;
}
if(!Oscilacija_Dužine_Izbor.Checked && !Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Najveća_Dužina_Polje_Promena(object sender, EventArgs e)
{
if(Najveća_Dužina_Polje.Value%10!=0)
{
MessageBox.Show(" Poslednja cifra unetog broja mora biti nula. \n" +
" npr. 10 , 50 , 100 , 110 , 250 , 600 , ... ",
" Greška pri unosu podataka !",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
Najveća_Dužina_Polje.Value = Najveća_Dužina_Polje.Maximum;
}
else
{
Najmanja_Dužina_Polje.Maximum = Najveća_Dužina_Polje.Value - 10;
Oscilacija_Dužine_Polje.Maximum = Najveća_Dužina_Polje.Value - Najmanja_Dužina_Polje.Value;
}
if(!Oscilacija_Dužine_Izbor.Checked && !Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Najmanja_Širina_Polje_Promena(object sender, EventArgs e)
{
if(Najmanja_Širina_Polje.Value%10!=0)
{
MessageBox.Show(" Poslednja cifra unetog broja mora biti nula. \n" +
" npr. 10 , 50 , 100 , 110 , 250 , 600 , ... ",
" Greška pri unosu podataka !",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
Najmanja_Širina_Polje.Value = Najmanja_Širina_Polje.Minimum;
}
else
{
Najveća_Širina_Polje.Minimum = Najmanja_Širina_Polje.Value + 10;
Oscilacija_Širine_Polje.Maximum = Najveća_Širina_Polje.Value - Najmanja_Širina_Polje.Value;
}
if(!Oscilacija_Dužine_Izbor.Checked && !Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Najveća_Širina_Polje_Promena(object sender, EventArgs e)
{
if(Najveća_Širina_Polje.Value%10!=0)
{
MessageBox.Show(" Poslednja cifra unetog broja mora biti nula. \n" +
" npr. 10 , 50 , 100 , 110 , 250 , 600 , ... ",
" Greška pri unosu podataka !",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
Najveća_Širina_Polje.Value = Najveća_Širina_Polje.Maximum;
}
else
{
Najmanja_Širina_Polje.Maximum = Najveća_Širina_Polje.Value - 10;
Oscilacija_Širine_Polje.Maximum = Najveća_Širina_Polje.Value - Najmanja_Širina_Polje.Value;
}
if(!Oscilacija_Dužine_Izbor.Checked && !Oscilacija_Širine_Izbor.Checked)
{
Da_Li_Može_Bez_Kopija_Elemenata();
}
}
void Oscilacija_Dužine_Polje_Promena(object sender, EventArgs e)
{
if(Oscilacija_Dužine_Polje.Value%10!=0)
{
MessageBox.Show(" Poslednja cifra unetog broja mora biti nula. \n" +
" npr. 10 , 50 , 100 , 110 , 250 , 600 , ... ",
" Greška pri unosu podataka !",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
Oscilacija_Dužine_Polje.Value = Oscilacija_Dužine_Polje.Minimum;
}
}
void Oscilacija_Širine_Polje_Promena(object sender, EventArgs e)
{
if(Oscilacija_Širine_Polje.Value%10!=0)
{
MessageBox.Show(" Poslednja cifra unetog broja mora biti nula. \n" +
" npr. 10 , 50 , 100 , 110 , 250 , 600 , ... ",
" Greška pri unosu podataka !",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
Oscilacija_Širine_Polje.Value = Oscilacija_Širine_Polje.Minimum;
}
}
#endregion
#region - Obrada događaja 'Zahtev za pomoć' -
void Isključi_Pomoć(object sender, EventArgs e)
{
toolTip1.Active = false;
}
void Željeni_Broj_Elemenata_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Broj elemenata";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Polje 'Broj elemenata' je namenjeno,\n" +
"za izbor željenog broja elemenata,\n" +
"za koje treba generisati dimenzije.\n",
Željeni_Broj_Elemenata_Polje,0,0);
}
void Maksimalni_Broj_Elemenata_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Maksimalan broj elemenata";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Polje 'Maksimalan broj elemenata' je namenjeno,\n" +
"za prikaz maksimalnog broja elemenata,\n" +
"za koje generator može da generiše dimenzije.\n",
Maksimalni_Broj_Elemenata_Polje,0,0);
}
void Najmanja_Dužina_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Najmanja dužina";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Polje 'Najmanja dužina' je namenjeno,\n" +
"za izbor najmanje dužine elementa,\n" +
"koju generator sme da generiše.\n",
Najmanja_Dužina_Polje,0,0);
}
void Najmanja_Širina_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Najmanja širina";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Polje 'Najmanja širina' je namenjeno,\n" +
"za izbor najmanje širine elementa,\n" +
"koju generator sme da generiše.\n",
Najmanja_Širina_Polje,0,0);
}
void Najveća_Dužina_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Najveća dužina";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Polje 'Najveća dužina' je namenjeno,\n" +
"za izbor najveće dužine elementa,\n" +
"koju generator sme da generiše.\n",
Najveća_Dužina_Polje,0,0);
}
void Najveća_Širina_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Najveća širina";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Polje 'Najveća širina' je namenjeno,\n" +
"za izbor najveće širine elementa,\n" +
"koju generator sme da generiše.\n",
Najveća_Širina_Polje,0,0);
}
void Dozvoljena_Rotacija_Elementa_Izbor_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Rotacija elemenata";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Opcija 'Rotacija elemenata' omogućava da se već generisane vrednosti za ,\n" +
"dužinu i širinu elementa međusobno zamene i na taj način dobije novi ,\n" +
"par vrednosti koji bi bio upamćen kao dimenzije novog elementa.\n",
Dozvoljena_Rotacija_Elementa_Izbor,0,0);
}
void Dozvoljene_Kopije_Elemenata_Izbor_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Kopije elemenata";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Opcija 'Kopije elemenata' kontroliše generisanje\n" +
"istih vrednosti za dužinu i širinu elemenata,\n" +
"odnosno pojavu kopija elemenata.\n",
Dozvoljene_Kopije_Elemenata_Izbor,0,0);
}
void Oscilacija_Dužine_Polje_Pomoć(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Dozvoljena oscilacija dimenzija";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Opcija 'Dozvoljena oscilacija dimenzija'\n" +
"kontroliše razliku u dimenzijama između elemenata tako što\n" +
"određuje maksimalnu razliku u dimenzijama, između elementa koji je već\n" +
"generisan i elementa koji tek treba da se generiše. Na ovaj način se\n" +
"dobijaju ujednačene dimenzije elemenata, i mnogo veći broj istih dimenzija\n",
Oscilacija_Dužine_Polje,0,0);
}
void Generiši_Dimenzije_Dugme_Help(object sender, HelpEventArgs hlpevent)
{
toolTip1.Active = true;
toolTip1.ToolTipTitle = " Generiši";
toolTip1.ToolTipIcon = ToolTipIcon.Info;
toolTip1.Show("Klikni da bi pokrenuo generator.\n",
Generiši_Dimenzije_Dugme,70,-70);
}
#endregion
}
}
/************************************************************************
* Program Licence : *
* *
* Copyright 2013 , Perić Željko *
* (periczeljkosmederevo@yahoo.com) *
* *
* According to it's main purpose , this program is licensed *
* under the therms of 'Free Software' licence agreement. *
* *
* If You do not know what those therms applies to *
* please read explanation at the following link : *
* (http://www.gnu.org/philosophy/free-sw.html.en) *
* *
* Since it is Free Software this program has no warranty of any kind. *
************************************************************************
* Ethical Notice : *
* *
* It is not ethical to change program code signed by it's author *
* and then to redistribute it under the same author name , *
* especially if it is incorrect. *
* *
* It is recommended that if You make improvement in program code , *
* to make remarks of it and then to sign it with Your own name , *
* for further redistribution as new major version of program. *
* *
* Author name and references of old program code version should be *
* kept , for tracking history of program development. *
* *
* For any further information please contact code author at his email. *
************************************************************************/
/************************************
* List Of Revisions *
************************************
* Major revision of version 2.0 *
* Perić Željko 20.02.2014 *
* new comments *
* new options *
* help function *
* sort function changed *
* spelling checked *
* New version number 3.0 *
************************************/
/************************************
* List Of Revisions *
************************************
* Minor revision of version 3.0 *
* Perić Željko 09.12.2015 *
* new comments *
* sort methods changed *
* spelling checked *
* New version number 3.1 *
************************************/