Revanisko [ Senator ]
Matematyka - pkt-y kratowe
ile punktów kratowych zawiera koło o środu w punkcie (0,0) i promieniu R
Potrzebuje to jakos wyprowadzic do ogolnego wzoru zieki ktoremu mogl bym napisac program ;p
Probowalem zrobic to w ukladzie >>> ale (prawdopodobnie przez niedokladność) wychodza mi dziwne rzeczy
promien 1 = 5pkt
promien 2 = 5+ 4 pkt
promien 3 = 9+ 16 pkt
promien 4 = 25+ 20 pkt
promien 5 = 45+ 32 pkt
promien 6 = 77+ 32 pkt
promien 7 = 109+ 38 pkt
Pomoże ktoś może ;P?
Moby7777 [ Generaďż˝ ]
1. Ogranicz się do jednej ćwiartki układu. Wynik pomnożysz później przez 4 i będzie działać (pamiętaj tylko o zaliczeniu tylko jednej osi zamiast dwóch).
2. Jak liczysz dla koła o środku w (0,0) i promieniu R to badasz wartości argumentów z przedziału <0, 1>
3. Zamiast kombinować z wzorem przejdź przez przedział i sprawdzaj ile wartości dodatnich jest mniejszych od wzoru koła w układzie współrzędnych.
Tyle, jak sobie nie poradzisz to mów.
Revanisko [ Senator ]
1. Ogranicz się do jednej ćwiartki układu. Wynik pomnożysz później przez 4 i będzie działać (pamiętaj tylko o zaliczeniu tylko jednej osi zamiast dwóch). - To rozumiem
2. Jak liczysz dla koła o środku w (0,0) i promieniu R to badasz wartości argumentów z przedziału <0, 1> - tego nie za bardzo xD
3. Zamiast kombinować z wzorem przejdź przez przedział i sprawdzaj ile wartości dodatnich jest mniejszych od wzoru koła w układzie współrzędnych. - a tego to już w ogóle ;p
Moby7777 [ Generaďż˝ ]
Nie wyprowadzisz prostego wzoru matematycznego na ilość punktów kratowych. Zamiast tego możesz sprawdzać, ile się mieści na kolejnych x. Wzór okręgu o środku (0,0) to:
x^2 + y^2 = r^2
I teraz tak: r jest stałe, x i y są nieujemne. Wykorzystujesz to, że liczenie punktów kratowych operuje na ciągach dyskretnych. Zaczynamy więc od x=1 (jakbyśmy wzięli x=0 to osi będą liczone podwójnie) i kolejno badasz ile akurat jest punktów kratowych na danej linii. Następnie zwiększasz x o jeden i badasz znowu. I tak aż do x=r. Na koniec mnożysz wynik przez 4 i wsio.
Jak tego nie zrozumiesz to pozostanie mi już tylko napisanie tego za Ciebie. :]
Revanisko [ Senator ]
Moby7777 - chyba mimo wszystko poprosze o napisanie xD
bo nie za bardzo wiem jak mam "zbadac" ile jest kratowych ;c (piszac w pascalu ;o)
Regis [ ]
Zagniezdzasz w sobie dwie petle for, z ktorych jedna leci po x, a druga po y. Dla kazdej wygenerowanej pary x,y sprawdzasz czy jej odleglosc od 0,0 jest mniejsza/rowna, czy tez wieksza od R. Zliczasz punkty, ktore sa blizej niz R, lub sa rowno z nim.
Revanisko [ Senator ]
program kolo;
var r,x,y,k:integer;
Begin
r:=4;
k:=0;
inc(k);
For x:=1 to r Do For y:=1 to r Do inc(k);
k:=k*4;
Write(k);
Readln;
End.
Jak na razie mam cos takiego
Tyle ze on liczy odlegle o promien (4) od osi x - czyli taki kwadracik (nie liczy tez tych na osi ale to szczegol)
Teraz tak - z tego co ja kumam - to odleglosc od 0,0 do danych wspolrzednych to
pierwiastek sumy kwadratu przesuniecia sie wzgledem osi x i kwadratu przesuniecia wzgledem y
czyli innymi slowy zeby pkt nalezal do kola to musi spelniac warunek sqrt((x*x)+(y*y))<= r - dobrze mysle xD?
Moby7777 [ Generaďż˝ ]
po mojemu to tak:
x^2 + y^2 = r^2
y^2 = r^2-x^2
y = sqrt(r^2-x^2) <-- nie ma tu wieloznaczności ani problemów bo liczymy tylko dla x,y>0
Program napiszę Ci w C++ bo pascala nie cierpię szczerą nienawiścią - powinieneś sobie poradzić z przepisaniem.
void main() ‹
int r, punkty = 0;
cin>>r;
for(int x=1; x<=r; ++x) ‹
punkty += sqrt(r*r - x*x) +1;
›
punkty *= 4;
count<<punkty<<endl;
system("pause");
›
Wykorzystałem tutaj fakt, iż w danej linii w pionie ilość punktów kratowych jest równa największemu y mieszczącemu się w kole powiększonemu o 1 (jeden punkt kratowy leży na osi x).
Regis --> i po diabła Ci druga pętla tutaj? :)
Revanisko [ Senator ]
program kolo;
var r,x,y,k:integer;
Begin
r:=1;
For x:=1 to r Do
Begin
If r<=sqrt((x*x)+(y*y))
then
Begin
For y:=1 to r Do
Begin
If r<=sqrt((x*x)+(y*y))
then Begin inc(k); Writeln('k po inc = ',k); End;
End;
End;
End;
Writeln('k po petlach = ',k);
k:=k*4;
Writeln('k po mnozeniu = ',k);
k:=k+1;
Writeln('k po 1 = ',k);
Write(k);
Readln;
End.
w tej chwili mam cos takiego
dla r=1 robi dobrze
dla r=2 wychodzi 9 zamiast 13
szukam bledu ale juz sie calkiem w tym zagmatwalem xD
Regis [ ]
Po nic :P Lata temu w LO robilem podobne zadanie, ale dla prostokata i elipsy i polecialem 'z automatu' z osia x i y, zupelnie bez sensu, co oczywiste ;)
Revanisko [ Senator ]
Program rys2;
var pkt:real;
i,r:integer;
Begin
r:=3;
For i:=1 to r Do pkt:= sqrt(r*r - i*i) +1;
pkt:=pkt*4;
pkt:=pkt+1;
Writeln('pkt= ',pkt);
readln;
End.
cos takiego mi wyszlo - ale w c++ jestem totalnie zielony wiec jak widac cos skopalem ;c
edit juz znalazlem conajmniej 2 bledy
Program rys2;
var pkt:real;
i,r:integer;
Begin
r:=3;
For i:=1 to r Do pkt:=pkt+ sqrt(r*r - i*i) +1;
pkt:=pkt*4;
Writeln('pkt= ',pkt :1);
readln;
End.
ale cos dalej nie dziala
dla 1 wychodzi 4 zamiast 5
dla 2 wychodzi 15 zamiast 13 ;c
Revanisko [ Senator ]
Program rys2;
var pkt:real;
i,r:integer;
Begin
r:=4;
For i:=1 to r Do pkt:=pkt+ sqrt((r*r - i*i) +1);
pkt:=pkt*4;
pkt:=pkt+1;
Writeln('pkt= ',pkt :1);
readln;
End.
Dziala dla 1 i 2
dla 3 i 4 myli sie o 2 nie mam pomyslow juz ;c
Moby7777 [ Generaďż˝ ]
Poczekaj. Popatrz na swój własny rysunek z pierwszego posta. Zauważ, że dla największego koła r=7 masz kolejno:
x=1, y=sqrt(r*r-x*x) = sqrt(49-1) = sqrt(48) = około 6,9. Teraz zostawiasz sobie tylko część całkowitą (nie zaokrąglasz a obcinasz ułamek!) i masz 6. Do tego dodajesz 1 (na osi x jest punkt kratowy) i wychodzi, że w pierwszej kolumnie masz 7 punktów. Dokładnie jak na rysunku.
Dla x=2 i 3 wychodzi podobnie więc pominę.
x=4, y=sqrt(49-16)=sqrt(33)= około 5,5 czyli po obcięciu ułamka i dodaniu 1 masz 6 punktów.
Zmienianie x jest Twoją pętlą for. Przechodzisz od x=1 do x=r (w tym przypadku x=7, y=sqrt(49-49)=0, dodajesz 1 i masz punkt kratowy. Będąc w pętli cały czas dodajesz kolejne wyniki. Na końcu pętli masz policzone wszystkie punkty w pierwszej ćwiartce i te leżące na osi x w dodatniej części. Mnożysz to przez 4 i masz już w zasadzie wszystko. Z wyjątkiem jednego punktu, który leży dokładnie w środku układu współrzędnych (dopiero teraz zauażyłem :P). Teraz musisz to tylko zaimplementować. Jak coś to wal na gadu.
Moby7777 [ Generaďż˝ ]
Nie znam się wprawdzie na pascalu ale pkt traktujesz jako liczba rzeczywista. Dodajesz więc ułamkowe części punktów kratowych wychodzących z obliczeń... to z kolei może oznaczać, że w pewnym momencie liczysz pół punktu + pół punktu = jeden punkt. I stąd może wynikać błąd.
Revanisko [ Senator ]
Moby7777 + prawdopodobnie wlasnie to powoduje problem + tylko nie za bardzo idzie cos z tym zrobic ;p