Teva
9.12.2011, 17:01
ovako.
Imam algoritam u pseudokodu koji treba implementiram u C.
Al ne mogu da razumem ****ni pseudokod. Probao sam milion različitih varijanti i ništa.
Fja treba da izbaci sve antipodalne parove, i da nadje najveći od njih, tj. par sa najvećim rastojanjem.
PSEUDO
The input is a polygon P={p1,...,pn}.
begin
p0:=pn;
q:=NEXT[p];
while (Area(p,NEXT[p],NEXT[q]) > Area(p,NEXT[p],q)) do
q:=NEXT[q];
q0:=q;
while (q != p0) do
begin
p:=NEXT[p];
Print(p,q);
while (Area(p,NEXT[p],NEXT[q]) > Area(p,NEXT[p],q) do
begin
q:=NEXT[q];
if ((p,q) != (q0,p0)) then Print(p,q)
else return
end;
if (Area(p,NEXT[p],NEXT[q]) = Area(p,NEXT[p],q)) then
if ((p,q) != (q0,p0)) then Print(p,NEXT[q])
else Print(NEXT[p],q)
end
end.
Note that Print(p,q) signifies the output of (p,q) as an anti-podal pair and Area(p,q,r) signifies the signed-area of triangle pqr.
Although this procedure is not as intuitive as the usual Rotating Calipers algorithm, it is essentially the same, and avoids any angle computations.
MOJ KOD
antipodal antipodalni_parovi(tacka* a, int n){
tacka p0,q0;
antipodal ni[5000];
double pom = 0;
p0 = a[n-1];
int p = 0, q = 1, k = 0;
while( vektorski_proizvod(a[p],a[p+1],a[q+1]) > vektorski_proizvod(a[p],a[p+1],a[q]) ){
q = q + 1;
q0 = a[q];
while( !poredjenje(a[q],p0) ){
p = p + 1;
ni[k] = output(a,p,q);
k++;
while( vektorski_proizvod(a[p],a[p+1],a[q+1]) > vektorski_proizvod(a[p],a[p+1],a[q]) ){
q = q + 1;
if(rastojanje(a[p],a[q]) != rastojanje(q0,p0) ){// !( poredjenje(a[p],q0) && poredjenje(a[q], p0) ) ){
ni[k] = output(a,p,q);
k++;
}
else break;
}
if( vektorski_proizvod(a[p],a[p+1],a[q+1]) == vektorski_proizvod(a[p],a[p+1],a[q]) ){
if( rastojanje(a[p],a[q]) != rastojanje(q0,p0) ){
ni[k] = output(a,p,q+1);
k++;
}
else {
ni[k] = output(a,p+1,q);
k++;
}
}
}
}
int i,j;
pom = ni[0].raz;
for(i=1;i<k;i++){
if(ni[i].raz > pom){
pom = ni[i].raz;
j = i;
}
}
return ni[j];
}
a je niz koji sadrži konveksni omotač.
Antipodal struktura ima dve int vrednosti (a i b) kao pozicije dve tačke, i double vrednost (raz) razdaljinu. Output napravi strukturu i vrati, poredjenje proverava dal su obe koord tacaka iste i vraca true ako su iste i false ako nisu...
Problem je u tome što bruteforce i ovaj algoritam izbace drugačije vrednosti. Odnosno neki put se poklope neki put ne, što znači da mi je promakako neki slučaj al ja ne znam koji. Ceo dan gledam i ne shvatam.
Imam algoritam u pseudokodu koji treba implementiram u C.
Al ne mogu da razumem ****ni pseudokod. Probao sam milion različitih varijanti i ništa.
Fja treba da izbaci sve antipodalne parove, i da nadje najveći od njih, tj. par sa najvećim rastojanjem.
PSEUDO
The input is a polygon P={p1,...,pn}.
begin
p0:=pn;
q:=NEXT[p];
while (Area(p,NEXT[p],NEXT[q]) > Area(p,NEXT[p],q)) do
q:=NEXT[q];
q0:=q;
while (q != p0) do
begin
p:=NEXT[p];
Print(p,q);
while (Area(p,NEXT[p],NEXT[q]) > Area(p,NEXT[p],q) do
begin
q:=NEXT[q];
if ((p,q) != (q0,p0)) then Print(p,q)
else return
end;
if (Area(p,NEXT[p],NEXT[q]) = Area(p,NEXT[p],q)) then
if ((p,q) != (q0,p0)) then Print(p,NEXT[q])
else Print(NEXT[p],q)
end
end.
Note that Print(p,q) signifies the output of (p,q) as an anti-podal pair and Area(p,q,r) signifies the signed-area of triangle pqr.
Although this procedure is not as intuitive as the usual Rotating Calipers algorithm, it is essentially the same, and avoids any angle computations.
MOJ KOD
antipodal antipodalni_parovi(tacka* a, int n){
tacka p0,q0;
antipodal ni[5000];
double pom = 0;
p0 = a[n-1];
int p = 0, q = 1, k = 0;
while( vektorski_proizvod(a[p],a[p+1],a[q+1]) > vektorski_proizvod(a[p],a[p+1],a[q]) ){
q = q + 1;
q0 = a[q];
while( !poredjenje(a[q],p0) ){
p = p + 1;
ni[k] = output(a,p,q);
k++;
while( vektorski_proizvod(a[p],a[p+1],a[q+1]) > vektorski_proizvod(a[p],a[p+1],a[q]) ){
q = q + 1;
if(rastojanje(a[p],a[q]) != rastojanje(q0,p0) ){// !( poredjenje(a[p],q0) && poredjenje(a[q], p0) ) ){
ni[k] = output(a,p,q);
k++;
}
else break;
}
if( vektorski_proizvod(a[p],a[p+1],a[q+1]) == vektorski_proizvod(a[p],a[p+1],a[q]) ){
if( rastojanje(a[p],a[q]) != rastojanje(q0,p0) ){
ni[k] = output(a,p,q+1);
k++;
}
else {
ni[k] = output(a,p+1,q);
k++;
}
}
}
}
int i,j;
pom = ni[0].raz;
for(i=1;i<k;i++){
if(ni[i].raz > pom){
pom = ni[i].raz;
j = i;
}
}
return ni[j];
}
a je niz koji sadrži konveksni omotač.
Antipodal struktura ima dve int vrednosti (a i b) kao pozicije dve tačke, i double vrednost (raz) razdaljinu. Output napravi strukturu i vrati, poredjenje proverava dal su obe koord tacaka iste i vraca true ako su iste i false ako nisu...
Problem je u tome što bruteforce i ovaj algoritam izbace drugačije vrednosti. Odnosno neki put se poklope neki put ne, što znači da mi je promakako neki slučaj al ja ne znam koji. Ceo dan gledam i ne shvatam.