← Back to topics
Topic

[trougao]

renovator
Ljudi izvinite ako sam vam dosadan ali nemam drugog nacina da ispravim greske u zadatku.
Padam na par primera a nemam pojma sto .
Evo koda :
http://rapidshare.de/files/8891468/trougao.pas.html
boba5551
Ovo nisam testirao, ali mislim da je greska.
U proceduri intro, ako su svi r-ovi=0, onda ti je abc prava, pa bez obzira da li M lezi levo, desno ili na nekoj od pravih, tebi ne treba to resenje!

U for petljama.
Da li kod tebe trougao mogu da obrazuju tacke (N-1,N-2,N-3)??? U prvoj for petlji nemas ni jednu od te tri tacke.
Mislim da ti je bespotrebno
for j:=i+1 to N-1 do, bolje je mozda
for j:=i+1 to N-2 do

Nije greska, ali samo zbog preglednosti.
Jos jedna stvar, mozda bi bilo dobro da proveravas u proceduri Main
if (l<>i) and (l<>j) and (l<>k) then
p:=...

Nisam testirao ovo, ali samo predlozi zbog cega mozda ne radi. Posto u funkciji w mnozis dva integera ciji proizvod moze da predje integer, bolje ti je da koristis longint svuda, a da izbacis int64, jer inace meni se int64 puno puta zapucavao na USACO-u i Z-Treningu. Desavalo se da umesto int64 stavim double i ispis na 0 decimala i sve prodje, dok mi je sa int64 pucalo dosta test primera, samo mali savet, a ti odluci!

Nadam se da sam pomogao :)
renovator
Bilo tacno ili netacno ovo sto si napisao zaista sam ti zahvalan na pomoci.Provericu sve ovo pa sta bude...
renovator
I samo da to kazem , napisao si da ako su r-ovi =0 onda mi ne treba resenje ali kad tad ce se desiti da ta 4. tacka bude teme tog trougla-prave i onda ce broj tacaka biti isti kao u onom bivsem trouglu kada nije pripadala.To je prakticno maksimalan broj tacaka na toj pravoj i sve te tacke pripadaju trouglu za 2 krajnje tacake i jednom u sredini.
Toliko . Poz.
renovator
Molio bih admina da mi posalje neki od primera : 2,3 ili 9 za ovaj zadatak.
dimitar
Ja mislim da je dobro da napises koju ideju si koristio za resavanje na ovom zadatku.

Evo kako sam ja pravio proverivanje dali jedna tacka je unutar trougao:
Za sekoja strana na triagolnikot ako ta tacka se nalazi od ista strana (levo ili desno), ili ako ona lezi na jedna strana a na drugi dve se nalazi od
ista strana, onda je ta tacka unutar trougao, inace nije.
renovator
Isto sam i ja radio.
dimitar
Ovako, ako imas trougao ABC, i proverujes za tacka
P, treba redosled da bude ovako:
Proverujes za strana AB, pa BC, pa CA, t.e
ako P se nalazi samo desno ili samo
levo od AB, BC, CA, onda je unutar trougao,
ili ako tocka leze na prava koja mine niz dve tacke, recimo
niz A i B, onda ako je od ista strana i na BC i CA onda je
unutar trougao.

Evo f-ja za proveruvanje na koja strana je tocka P od prava
koja mine niz dve tacke A i B:


function strana (a, b, p: point): integer;
var t: int64;
begin

t:= ((p.x-a.x)*(b.y-a.y)) - ((p.y-a.y)*(b.x-a.x));

if t > 0 then
strana:= 1
else if t < 0 then
strana:= -1
else
strana:= 0;

end;

Nadam se da sam dobro objasnio.
renovator
Sve sam ja to uradio . Pa sam posle toga ispisao funkciju koja proverava da li se tacka nalazi u trouglu (mozda ona nije u redu,mada sam je dosta testirao) :

funkcija 'w' proverava sa koje strane se prave se nalazi tacka(ovo sto si ti napisao)

function intro(A,B,C,M:RPoint):Boolean;
var p1,p2,p3:Boolean;
r1,r2,r3: integer;
res : Boolean;
begin
r1 := w(A,B,C)*w(A,B,M) ;
r2 := w(A,C,B)*w(A,C,M) ;
r3 := w(B,C,A)*w(B,C,M) ;
p1 := r1>=0;
p2 := r2>=0;
p3 := r3>=0;
res := p1 and p2 and p3;
if(r1=0)and(r2=0)and(r3=0)then
if(w(A,B,M)<>0)then
res := False;
intro := res;
end;
mfolnovic
hmm, ja mislim da je najbolje da provjeravate ovako ako je tocka u trokutu, tako da ako su vrhovi trokuta A, B i C, nadete neku tocku koja je 100% u trokutu ( najbolje težište, T ) i onda provjeravate da li je (povrsina ABT)+(povrsina BCT)+(povrsina BAT)=(povrsina ABC) onda je 100% tocka u trokutu...
nadam se da sam pomogao
losMilos
jesi li siguran da ide taj uslov
ta treca povrsina bi trebala ja mislim od trougla ACT, a ne od BAT