Forum » Programiranje » Konveksna lupina
Konveksna lupina
Terminator ::
Zna kdo razložiti vsak korak teh dveh funkcij:
//Dobiti moramo najmanjse stevilo robov
void CChildView::OnBruteForce()
{
robovi.RemoveAll();
clock_t zacetek, konec;
zacetek = clock();
// namen for zank je iskanje robov,zato se sprehodimo skozi vse tocke in jih iscemo.
// ce je v polje 10 tock, i=0, potem je j=1,2,3,4,5,6,7,8,9
// v drugem koraku je i=1, j=2,3,4,5,6,7,8,9
// v tretjem koraku je i=2, j=3,4,5,6,7,8,9
// torej "naredimo" crto od i in j, in preverimo v naslednjem if stavku, ce je rob.
for(int i=0; i < polje.GetSize()-1; i++)
for(int j=i+1; j < polje.GetSize(); j++)
// je rob? sta enaki tocki?
if((jeRob(&polje[i], &polje[j])) && (polje[i] != polje[j]))
{
robovi.SetAtGrow(robovi.GetSize(),polje[i]);
robovi.SetAtGrow(robovi.GetSize(),polje[j]);
}
konec = clock();
double pretekel_cas = double(konec - zacetek)/CLOCKS_PER_SEC;
CString string;
string.Format("BRUTE FORCE->Cas iskanja resitve v sekundah: %f", pretekel_cas);
Invalidate();
MessageBox(string);
}
//Iskanje robnih tock
bool CChildView::jeRob(CPoint *A, CPoint *B)
{
bool prvi = true;
bool neg = true;
//Za vsak par tock ugotovljamo ali lezijo druge tocke na isti strani linije med tema dvema tockama
for(int i=0; i < polje.GetSize(); i++) //zanka od 0 do velikosti polja
{
//Imamo dve tocki A in B, ki nam dolocata linijo med tockama
if((polje[i] != *A) && (polje[i] != *B))//pogledamo kje lezijo ostale tocke
{ //nacin iskanja roba z racunanjem vektorskega produka
int vprodukt = (B->x - A->x) * (polje[i].y - A->y) - (polje[i].x - A->x) * (B->y - A->y);
if(prvi)
{
prvi = false;
if(vprodukt > 0)// pogledamo kaksen je vektorski produkt prve tocke
neg = false;//ce je vecji od 0, ni treba racunati za negativne tocke.
}
else
{
if(((neg) && (vprodukt > 0)) || ((!neg) && (vprodukt < 0)))
return false; // takoj ko najdemo nasprotno predznacen vektorski produkt-ni rob
}
}
}
return true;
}
//Dobiti moramo najmanjse stevilo robov
void CChildView::OnBruteForce()
{
robovi.RemoveAll();
clock_t zacetek, konec;
zacetek = clock();
// namen for zank je iskanje robov,zato se sprehodimo skozi vse tocke in jih iscemo.
// ce je v polje 10 tock, i=0, potem je j=1,2,3,4,5,6,7,8,9
// v drugem koraku je i=1, j=2,3,4,5,6,7,8,9
// v tretjem koraku je i=2, j=3,4,5,6,7,8,9
// torej "naredimo" crto od i in j, in preverimo v naslednjem if stavku, ce je rob.
for(int i=0; i < polje.GetSize()-1; i++)
for(int j=i+1; j < polje.GetSize(); j++)
// je rob? sta enaki tocki?
if((jeRob(&polje[i], &polje[j])) && (polje[i] != polje[j]))
{
robovi.SetAtGrow(robovi.GetSize(),polje[i]);
robovi.SetAtGrow(robovi.GetSize(),polje[j]);
}
konec = clock();
double pretekel_cas = double(konec - zacetek)/CLOCKS_PER_SEC;
CString string;
string.Format("BRUTE FORCE->Cas iskanja resitve v sekundah: %f", pretekel_cas);
Invalidate();
MessageBox(string);
}
//Iskanje robnih tock
bool CChildView::jeRob(CPoint *A, CPoint *B)
{
bool prvi = true;
bool neg = true;
//Za vsak par tock ugotovljamo ali lezijo druge tocke na isti strani linije med tema dvema tockama
for(int i=0; i < polje.GetSize(); i++) //zanka od 0 do velikosti polja
{
//Imamo dve tocki A in B, ki nam dolocata linijo med tockama
if((polje[i] != *A) && (polje[i] != *B))//pogledamo kje lezijo ostale tocke
{ //nacin iskanja roba z racunanjem vektorskega produka
int vprodukt = (B->x - A->x) * (polje[i].y - A->y) - (polje[i].x - A->x) * (B->y - A->y);
if(prvi)
{
prvi = false;
if(vprodukt > 0)// pogledamo kaksen je vektorski produkt prve tocke
neg = false;//ce je vecji od 0, ni treba racunati za negativne tocke.
}
else
{
if(((neg) && (vprodukt > 0)) || ((!neg) && (vprodukt < 0)))
return false; // takoj ko najdemo nasprotno predznacen vektorski produkt-ni rob
}
}
}
return true;
}
Imortales ::
Sej pa ti vse piše v komentarjih. Na kratko:
V OnBruteForce se ti sprehaja skozi vse točke (vsako preverja z vsemi drugimi) in nad njimi kliče jeRob. Če se ne motim ti jeRob preveri če dve točki določata rob konveksne lupine. Če jeRob vrne true, potem doda dve točki (i in j) v strukturo robovi.
jeRob ti računa vektorske produkte med točkami, ki se preverjajo in točkami ki že določajo rob. S vektorskim produktom potem preverjaš če točke zadoščajo pogojem (glej zadnji if stavek).
V OnBruteForce se ti sprehaja skozi vse točke (vsako preverja z vsemi drugimi) in nad njimi kliče jeRob. Če se ne motim ti jeRob preveri če dve točki določata rob konveksne lupine. Če jeRob vrne true, potem doda dve točki (i in j) v strukturo robovi.
jeRob ti računa vektorske produkte med točkami, ki se preverjajo in točkami ki že določajo rob. S vektorskim produktom potem preverjaš če točke zadoščajo pogojem (glej zadnji if stavek).
To sporočilo se bo samo uničilo čez 5 sekund.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | križci krožci c # (strani: 1 2 )Oddelek: Programiranje | 11872 (10531) | Yacked2 |
» | Rekurzija v javi z ArrayListOddelek: Programiranje | 1577 (1420) | marjan_h |
» | [C++] vprašanja (strani: 1 2 3 4 5 6 7 8 9 )Oddelek: Programiranje | 27332 (11878) | aljazko1995 |
» | Programski jezik C- pomočOddelek: Programiranje | 1694 (1612) | alexa-lol |
» | [C++] urejanje nizov po velikostiOddelek: Programiranje | 2277 (2058) | Matako |