nimao sam problem sa tim kako da znam da li je tacka u krugu ili kvadratu.
kod kruga imam poluprecnik i koordinate centra i te tacke pa sam ukapirao da je u pitanju if sqrt(sqr(x1-x2)+sqr(y1-y2))<=r then ukrugu:=true else ukrugu:=false;
a kod kvadrata imam koordinate temena i te tacke ali ne znam kako da proverim da li je unutra.
bio bih vam zahvalan ako biste mi pomogli
bZa kvadrat, koliko sam shvatio imas koordinate svih temena?
Ako je tako, onda sledece treba da radi
/*
(x, y) is check point
(p1, q1) and (p2, q2) are points on line
*/
double lambda(double x, double y, double p1, double q1, double p2, double q2){
return (q2 - q1) * x - (p2 - p1) * y + q1 * p2 - p1 * q2;
}
pozoves lambda za svaku pravu, s tim da obilazis kvadrat u suprotnom smetu kazaljke na satu, pa tako uzimas prave. Pozoves za svaku pravu funkciju lambda i ako ti svaka vrati vrednost < od nule, znaci da je tacka levo od svake prave, a to znaci da je u kvadratu. Ako je lambda nula, onda je tacka na pravoj. Ovo bi trebalo ok da radi. A da, kod orijentisanja kvadrata, mozes da sortiras tacke po tangensu ugla koji zaklapaju sa x-osom, na taj nacin ces moci da obidjes kvadrat u suprotnom smeru kazaljke na satu.
nOvo sto si rekao za tacku na ili sa iste strane svih pravih mi je jasno, medjutim, nisam razumeo kako to da uradim. Ja sam imao ideju da nadjem pravu koja prolai kroz datu tacku i paralelna je sa 2 suprotne stranice kvadrata, pa da proverim da li je n(iz formule y=kx+n) izmedju n-ova te dve stranice ili isto kao jedno od ta 2 n-a, pa to isto uradim i za preostale 2 stranice, ali mislim da postoji laksi nacin, samo mi ne pada na pamet koji, pa bih te zamolio da mi malo razradis ono sto si gore napisao jer sam od svega skapirao samo da treba proveriti sa koje strane prave je tacka, a meni pada na pamet samo ovo resenje koje sam gore napisao a mislim da je ono prekomplikovano, jer mi treba previse racunanja da bih dobio n i k a sve to mora da mi ide kroz petlju velik broj puta.
bAha, pa evo ovako
Ako imas temena A(xa, ya) i B(xb, yb) i tacku R(p, q). Ako hoces da vidis da li je R levo od prave AB onda pozoves ovako
if lamba(p, q, xa, ya, xb, yb) < 0 then
tacka je levo
Probaj, to treba da radi.
nne znam sta je lambda, tj. kako to da koristim kad nije ugradjena funkcija ili procedura u paskalu.
Inace, probao sam da uradim zadatak(stapovi) sa onom mojom idejom, medjutim, posto je previse komplikovana, nadao sam se da cu uspeti da resim zadatak bez ispravki jer je kod toliko komplikovan zbog nacina izracunavanja da ne znam odakle da pocnem da trazim greske. Nazalost, proslo mi je samo 7 testova ali ipak je i to super jer bi na takmicenju dobio neke poene za to, a dobra stvar je i to sto mi nigde nije prekoraceno vremensko ogranicenje iako sam mislio da je prekomplikovan nacin.
bPa poslao sam ti kod lambde, samo je u c++-u, evo kako bi bio u Pascalu (nisam kompajlirao)
procedure lambda(x, y, p1, q1, p2, q2 : real):real
begin
return (q2 - q1) * x - (p2 - p1) * y + q1 * p2 - p1 * q2;
end;
Ako je bilo pitanja za stapove, da ja tebe pitam nesto - recimo sada si u svojoj sobi i drzis neki stap. Imas dva prilicno tanka (sto bi se matematicki reklo beskonacno tanka :)) postolja. Kako stap moras da postavis na ta postolja da ne bi pao? Kako ako koristis oba, kako ako koristis samo jedno (ocigledno ima dva nacina, jer cim mozes samo sa jednim sigurno mozes i sa oba, ali koji su to nacini)?
P.S. Ako ti ne ide bez primera, probaj sa olovkom i gumicom - ozbiljan sam :)
nMa ukapirao sam ja to i radio sam ovako:
jedan stap podelim na 2 jednaka dela, tako da oba dela sadrze zajednicku tacku(teziste tj. centar stapa.). Proverim za svaki stap, za oba dela, za sve stolove da li se centar nekog stola nalazi blize tom delu stapa nnego sto je njegov poluprecnik(npr. ako je sto br.1 r=6, proverim da li je centar stola br.1 blize ili na tacno 6 od tog dela stapa.). ako za oba dela nekog stapa postoji sto koji ima takvu osobinu, znaci da obe strane stapa(posmatrano u odnosu na teziste) imaju oslonac. Specijalan slucaj: stap je tangenta na sto i ima oslonac u tezistu, gore opisan postupak prihvata i ovakav slucaj kao resenje.
nprobao sam ovo sa lambdom i nesto ne valja, nema veze, hvala u svakom slucaju, bitno mi je da mi radi u osnovi progrogram, tj. da imam tih 7 tacnih a greske cu probati da ispravim kad budem imao vise vremena.
bHajde mi daj tacke, pa da proverim za lambdu jer sam nekako siguran da radi.
Nego, nije mi jasno shta ce ti kvadrat za ovaj zad. Cini mi se da nisi spomenuo, ili sam ja nekim cudom preskocio u tvom pisanju, ali ako se srediste stapa bilo kako nalazi na stolu, onda stap ima oslonac, a ono za jednu i drugu stranu si spomenuo.
nJako mi je koplikovan kod, nije ni bitno. inace, ne pojavljuje se kvadrat nego pravougaonik jer sam radio na sledeci nacin:
Kad odredjujem da li je centar nekog kruga u blizini blizi od njegovog poluprecnika, ja u stvari posmatram stap i pravougaonuik i dva polukruga cije povrsine su u stvari sve tacke koje su na r ili manje od r udaljene od stapa.
nE, probao sam ovo sa lambdom ponovo i funkcionise, znaci da sam ja negde napravio gresku u ostatku koda. Kako si izveo ovu formulu?
Sad imam novi problem: zadatak trougao:
program trougao;
var
n,a,b,c,d,max,i,j,k,l:longint;
x,y:array[1..60] of longint;
function str(x,y,p1,q1,p2,q2:longint):longint;
begin
str:=(q2-q1)*x-(p2-p1)*y+q1*p2-p1*q2;
end;
begin
readln(n);
for i:=1 to n do
readln(x[i],y[i]);
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
if (i<>j) and (i<>k) and (j<>k) and (str(x[i],y[i],x[j],y[j],x[k],y[k])<>0) then
begin
d:=0;
for l:=1 to n do
begin
a:=str(x[l],y[l],x[i],y[i],x[j],y[j]);
b:=str(x[l],y[l],x[j],y[j],x[k],y[k]);
c:=str(x[l],y[l],x[k],y[k],x[i],y[i]);
if ((a>=0) and (b>=0) and (c>=0)) or ((a<=0) and (b<=0) and (c<=0)) then
d:=d+1;
end;
if d>max then max:=d;
end;
writeln(max);
end.
Kompajliranje
Compile Ok
Vreme kompajliranja: 0.11 sekunde
Testiranje
Test 1 Tacno resenje vreme izvrsavanja programa 0 sekunde
Test 2 [color=Red]Pogresno resenje [/color] vreme izvrsavanja programa 0 sekunde
Test 3 Tacno resenje vreme izvrsavanja programa 0.63 sekunde
Test 4 Tacno resenje vreme izvrsavanja programa 0.81 sekunde
Test 5 Tacno resenje vreme izvrsavanja programa 0.01 sekunde
Test 6 Tacno resenje vreme izvrsavanja programa 0.05 sekunde
Test 7 Tacno resenje vreme izvrsavanja programa 0.04 sekunde
Test 8 Tacno resenje vreme izvrsavanja programa 0 sekunde
Test 9 [color=Red]Pogresno resenje [/color] [color=Black][/color][color=Black][/color]vreme izvrsavanja programa 0.94 sekunde
Test 10 Tacno resenje vreme izvrsavanja programa 0 sekunde
kMoras staviti int64 tip podataka.
Kada racunas povrsinu trokuta mnozis 3 broja sto moze izaci iz limita.
bAko imas dve tacke A (xa, ya) i B(xb, yb) prava kroz te dve tacke moze da se opise u parametraskom obliku
x = xa + t (xb - xa)
y = ya + t (yb - ya)
Tada izjednacis ove dve jednakosti tako da izgubis t (izrazis t iz obe). Kad sve izmnozis dobijas nesto nalik na
(yb - ya) * x - (xb - xa) * y + ya * xb - xa * yb = 0- proveri ovo, mozda nisam dobro izmnozio
ako tacka (x, y) pripada pravoj kada je ubacis umesto x i y :) iz prethodne jednacine dobices stvarno nulu, inace < ili > 0 u zavisnoti od toga sa koje je strane. nije komplikovano.
n[quote author=Frane Kurtovi? link=topic=10381.msg12584#msg12584 date=1201896760]
Moras staviti int64 tip podataka.
Kada racunas povrsinu trokuta mnozis 3 broja sto moze izaci iz limita.
[/q]
Ne mnozim ih vec samo proveravam da li su tacke u trouglu. Pregledao sam ceo kod i ne vidim gde sam mogao da pogresim. Za svaki slucaj sam umesto longinta stavio real i dobio zanimljivu situaciju, program mi je radio u proseku 50 % duze, ali mi nije jasno zasto?
bPa racunanje sa decimalnim vrednostima je sporije zbog decimalnog dela. To kad se prevede u masinski code ne ispadne isto.
kU ovoj funkciji mnozis tri puta.
Mislim da ti to moze izaci iz longinta.
function str(x,y,p1,q1,p2,q2:longint):longint;
begin
str:=(q2-q1)*x-(p2-p1)*y+q1*p2-p1*q2;
end;
nU pravu si, probao sam sa real i ispalo mi je isto resenje, negde je greska u postojanju nekog specijalnog slucaja ili sta vec.