GRY-Online.pl --> Archiwum Forum

Matematyka - pkt-y kratowe

09.12.2008
16:52
[1]

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?


Matematyka - pkt-y kratowe - Revanisko
09.12.2008
16:59
[2]

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.

09.12.2008
17:04
[3]

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

09.12.2008
17:11
smile
[4]

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. :]

09.12.2008
18:23
[5]

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)

09.12.2008
18:27
[6]

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.

09.12.2008
19:19
[7]

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?

09.12.2008
19:48
[8]

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? :)

09.12.2008
19:52
[9]

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


09.12.2008
19:52
smile
[10]

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 ;)

09.12.2008
19:59
[11]

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

09.12.2008
20:23
[12]

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

09.12.2008
20:31
[13]

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.

09.12.2008
20:33
[14]

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.

09.12.2008
22:24
[15]

Revanisko [ Senator ]

Moby7777 + prawdopodobnie wlasnie to powoduje problem + tylko nie za bardzo idzie cos z tym zrobic ;p

© 2000-2024 GRY-OnLine S.A.