Thread View: pl.comp.lang.pascal
9 messages
9 total messages
Started by bala_dżi
Sat, 04 Apr 2009 10:09
rysowanie kółek w pascalu
Author: bala_dżi
Date: Sat, 04 Apr 2009 10:09
Date: Sat, 04 Apr 2009 10:09
9 lines
1920 bytes
1920 bytes
Witam Mam taki problem- chciałbym narysować w pascalu nieprzecinające się kółka umieszczone w prostokącie dla podanego n kółek o takiej samej wielkości . Następnie chcę zrobić funkcję która losowo będzie wybierać punkty, a jeszcze inna funkcja sprawdzi czy trafiło w jakieś kółko czy nie. Na końcu obliczę numerycznie przybliżoną średnicę kółeczka. Najbardziej zastanawia mnie jak zrobić aby koła nie przecinały się. Bo do obliczeń chcę wykorzystać metodę Monte Carlo, myślę że się sprawdzi, ale najpierw trzeb to wszystko narysowac
Re: rysowanie kółek w pascalu
Author: webmajsterek
Date: Sat, 04 Apr 2009 22:20
Date: Sat, 04 Apr 2009 22:20
39 lines
2654 bytes
2654 bytes
> Witam > Mam taki problem- chciałbym narysować w pascalu nieprzecinające się > kółka umieszczone w prostokącie dla podanego n kółek o takiej samej > wielkości . Następnie chcę zrobić funkcję która losowo będzie wybierać > punkty, a jeszcze inna funkcja sprawdzi czy trafiło w jakieś kółko czy > nie. Na końcu obliczę numerycznie przybliżoną średnicę kółeczka. > Najbardziej zastanawia mnie jak zrobić aby koła nie przecinały się. Bo > do obliczeń chcę wykorzystać metodę Monte Carlo, myślę że się > sprawdzi, ale najpierw trzeb to wszystko narysowac 1. Po prostu zamalowujesz obszar jakim kolorem ( jak te kulka sa widoczne na ekranie ) lub w tablity . gdy juz masz kilka kol to po prostu sprawdzasz czy dany punkt( piksel ) ma kolor tla czy kola . wada rzowiazania to niska rozielczosc badan -- beddziesz musial definiowac tablice po kikadziesiat Mb . 2. drugie rozwiazanie to zapamietywac srodek( x,y) i promien ( r ) kazdego okragu . gdy chesz dodac nowe kolo najpier musisz spraawdzic czy sie zmiesci ( miedzy inne kola ) . r1+r2=odleglosc_miedzy_srodkami porem liczysz odleglosc miedzy (x1,y1) i ( x2,y2) -- jezeli rowna sie sumie obu promieni to masz wymagana zgodnoc ze stykaja sie tylko krawedziami . ten warunek musisz sprawdzic dla wszystkich kol ktore juz zostaly umieszczone ( zawsze odleglosc musi byc wieksza lub rowna - jezeli miejsza to sie przetna ) . Po umieszczeniu wszystkich kol losujesz punkt i sprawdzasz czy nalezy do jakiegos kola . http://pl.wikipedia.org/wiki/Ko%C5%82o_(geometria) -- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: rysowanie kółek w pascalu
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 05 Apr 2009 11:25
Date: Sun, 05 Apr 2009 11:25
17 lines
1552 bytes
1552 bytes
On Sat, 4 Apr 2009 03:09:37 -0700 (PDT), bala_dżi wrote: > <snip> > Najbardziej zastanawia mnie jak zrobić aby koła nie przecinały się. Bo > do obliczeń chcę wykorzystać metodę Monte Carlo, myślę że się > sprawdzi, ale najpierw trzeb to wszystko narysowac 1. Nie musisz niczego rysować realnie na ekranie. 2. Zapamiętujesz lokacje i promień każdego koła, przy dodawaniu nowego koła upewniasz się że jest dalej od każdego już istniejącego koła oddalony o promień swój + istniejącego koła. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/ ICQ: 148498663 GG: 2544385 AIM: malyzgora GTalk: l3vi4than@gmail.com ASTRA: L3viathan
Re: rysowanie kółek w pascalu
Author: bala_dżi
Date: Mon, 13 Apr 2009 07:01
Date: Mon, 13 Apr 2009 07:01
36 lines
2021 bytes
2021 bytes
Wczoraj się wziąłem i napisałem taki "kodzik" ;-):
program grr;
uses Crt,Graph;
var
sterownik,tryb,liczba,r,i:integer;
x:array [0..50] of integer;
y:array [0..50] of integer;
begin
sterownik:=0; InitGraph(sterownik,tryb,'');
if GraphResult<>0 then
begin
writeln ('blad grafiki'); halt;
end;
r:=20;
randomize;
for i:=1 to 20 do
begin
x[i]:=random(320);
y[i]:=random(200);
end;
for i:=1 to 20 do
begin
if (abs (x[i+1]-x[i])+ abs (y[i+1]-y[i])) > r*2 then
circle (x[i],y[i],r);
end;
Delay(3000);
CloseGraph;
readln;
end.
Ale to nie to, dla dwóch kółek to działa nie moge wpasc na to jak
sprawdzic zeby się nie przecinało ze wszystkimi.
Re: rysowanie kółek w pascalu
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 13 Apr 2009 11:31
Date: Mon, 13 Apr 2009 11:31
34 lines
1929 bytes
1929 bytes
On Mon, 13 Apr 2009 00:01:16 -0700 (PDT), bala_dżi wrote: > <ciach> > for i:=1 to 20 do > begin > if (abs (x[i+1]-x[i])+ abs (y[i+1]-y[i])) > r*2 then > circle (x[i],y[i],r); > end; > <ciach> > Ale to nie to, dla dwóch kółek to działa nie moge wpasc na to jak > sprawdzic zeby się nie przecinało ze wszystkimi. Bo sprawdzasz tylko odległości każdych dwóch kolejnych okręgów, a musisz sprawdzać dla każdego sąsiedztwo z każdym innymi. Najprosciej przy dodawaniu od razu sprawdzać czy miejscówka nowo dodawanego jest legalna, jeżeli nie, pomijać dodanie do kolekcji i losować nowe koordynaty. btw: > for i:=1 to 20 do > begin > x[i]:=random(320); > y[i]:=random(200); > end; Czy aby napewno okręgi mogą ,,wystawać" poza założony obszar? -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/ ICQ: 148498663 GG: 2544385 AIM: malyzgora GTalk: l3vi4than@gmail.com ASTRA: L3viathan
Re: rysowanie kółek w pascalu
Author: bala_dżi
Date: Mon, 13 Apr 2009 13:24
Date: Mon, 13 Apr 2009 13:24
10 lines
1937 bytes
1937 bytes
Tak, wiem o tym ale nie bardzo wiem jak to zaimplementowac. Byłbym wdzięczny jakbyś mi napisał fragment kodu z tym sprawdzaniem. W podręczniku od informatyki mam przedstawione tylko łatwe przykłady z rysowania okręgów, te trudniejsze są w formie "zrób-se-sam" ;-). Ekran z założenia ma być ograniczony. Okręgi, jak zapewne się domyślasz wystają, chciałbym aby nie wystawały, będe musiał dołożyć jeszcze jedna procedurę sprawdzającą przecięcia: z osią x dla x np:320 i analogicznie dla y Pozdrawiam
Re: rysowanie kółek w pascalu
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 13 Apr 2009 16:22
Date: Mon, 13 Apr 2009 16:22
93 lines
4062 bytes
4062 bytes
On Mon, 13 Apr 2009 06:24:49 -0700 (PDT), bala_dżi wrote:
> Tak, wiem o tym ale nie bardzo wiem jak to zaimplementowac. Byłbym
> wdzięczny jakbyś mi napisał fragment kodu z tym sprawdzaniem.
> W podręczniku od informatyki mam przedstawione tylko łatwe przykłady z
> rysowania okręgów, te trudniejsze są w formie "zrób-se-sam" ;-).
Zacznijmy od pseudokodu, a Ty powiedz który fragment jest w
nim zbyt skomplikowany/niejasny:
1. Rozpoczynamy z pusta kolekcja okręgów
2. Dopoki nie spełniamy warunku zakończenia*
3. Losujemy sobie okrag (x,y,r)
4. Jezeli okrag nie znajduje się w kolekcji
5. Dodajemy go do kolekcji.
*) Warunek krańcowy może być zależny od ilości prob wrzucenia
kolejnego okregu, ogolnej ilości okręgów w kolekcji etc.
Z racji na zapewne Twoją nieznajomość złożonych typów danych,
kolekcja okregów u Ciebie automagicznie zmienia się w
const
MAX_ITEMS = 1337;
type
TTab = array[1..MAX_ITEMS] of integer;
var
tx : TTab;
ty : TTab;
ile : integer; // ilosc elementow w kolekcji
Zakładając że wszystkie promienie są równe dochodzi do
tego:
var
r : integer;
I potrzebujesz do szczęścia jeszcze sprawdzenia czy dany
okrag jest "legalnie postawiony" pośrod wszystkich istniejących.
Przy czym to sobie ulatwiasz za pomocą dekompozycji
do dwóch 'pod-problemów' ;) :
function czyKolidujaDwa(x1,y1,r1,x2,y2,r2):boolean;
begin
// umiesz zaimplementowac?
end;
procedure dodajOkrag(ox,oy);
begin
// też powinieneś w stanie być odpowiednio zmanipulowac
// zmienne tx, ty i ile zeby dodac element do kolekcji
end;
function czyKolidujeZeWszystkimi(x,y,r):boolean;
begin
czyKoliduje := false;
for n:=1 to ile do
if (czyKoliduja2(tx[n], ty[n], r, x, y, r))
czyKoliduje := true; // tu mozna nawet machnac Exit(true); ;)
Result := czyKoliduje;
end;
W pseudokodzie celowo brakuje niektórych delaracji.
Musisz klocki uzupełnić i poskładać do kupy.
W razie czego mów co jest niejasne, wszystko pisane na
kolanie, mogłem coś spie... zepsuć. ;).
> Ekran z założenia ma być ograniczony. Okręgi, jak zapewne się
> domyślasz wystają, chciałbym aby nie wystawały, będe musiał dołożyć
> jeszcze jedna procedurę sprawdzającą przecięcia:
> z osią x dla x np:320
> i analogicznie dla y
Utrudniasz sobie, losuj przesunięte okręgi.
x := Random(320-2*r)+r;
analogicznie y. Będziesz miał pewniaka że wszysto będzie
w View Porcie, bez zbędnego kombinowania.
p.s. Jakiego kompilatora używasz? Mam nadzieję że fpc
bo ja preferuje ten dialekt, i preferuje ludzi
nie używających archaicznego Turbo Pascal'a z
powodów:
- bo nauczyciel każe kraść
- bo tak
;-).
--
Pozdrawiam,
Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
ICQ: 148498663 GG: 2544385 AIM: malyzgora
GTalk: l3vi4than@gmail.com ASTRA: L3viathan
Re: rysowanie kółek w pascalu
Author: bala_dżi
Date: Thu, 16 Apr 2009 08:33
Date: Thu, 16 Apr 2009 08:33
75 lines
3728 bytes
3728 bytes
Dzięki, wyjaśnij mi to: > 1.Rozpoczynamy z pusta kolekcja okręgów > 4. Jezeli okrag nie znajduje się w kolekcji > 5. Dodajemy go do kolekcji. Rozumiem istotę losowania okręgów. Ale nie bardzo czaję jak to tam idzie dalej, Dlaczego deklarujesz typ? Chodzi Ci o to aby nie wyłaziły? > Z racji na zapewne Twoją nieznajomość złożonych typów danych, > kolekcja okregów u Ciebie automagicznie zmienia się w > const > MAX_ITEMS = 1337; > > type > TTab = array[1..MAX_ITEMS] of integer; > > var > tx : TTab; > ty : TTab; > ile : integer; // ilosc elementow w kolekcji > > Zakładając że wszystkie promienie są równe dochodzi do > tego: > var > r : integer; > > I potrzebujesz do szczęścia jeszcze sprawdzenia czy dany > okrag jest "legalnie postawiony" pośrod wszystkich istniejących. > > Przy czym to sobie ulatwiasz za pomocą dekompozycji > do dwóch 'pod-problemów' ;) : Możesz napisać mi to: > function czyKolidujaDwa(x1,y1,r1,x2,y2,r2):boolean; > begin > // umiesz zaimplementowac? > end; I to też: > procedure dodajOkrag(ox,oy); > begin > // też powinieneś w stanie być odpowiednio zmanipulowac > // zmienne tx, ty i ile zeby dodac element do kolekcji > end; To na szczęście rozumiem > function czyKolidujeZeWszystkimi(x,y,r):boolean; > begin > czyKoliduje := false; > for n:=1 to ile do > if (czyKoliduja2(tx[n], ty[n], r, x, y, r)) > czyKoliduje := true; // tu mozna nawet machnac Exit(true); ;) > Result := czyKoliduje; > end; > Utrudniasz sobie, losuj przesunięte okręgi. > x := Random(320-2*r)+r; > analogicznie y. Będziesz miał pewniaka że wszysto będzie > w View Porcie, bez zbędnego kombinowania. Tak zrobię ;-) > p.s. Jakiego kompilatora używasz? Mam nadzieję że fpc > bo ja preferuje ten dialekt, i preferuje ludzi > nie używających archaicznego Turbo Pascal'a z > powodów: > - bo nauczyciel każe kraść > - bo tak > > ;-). Też wolę fpc, ale program ma być na DOS, a fpc jest na Win32, jestem zmuszony korzystać z Turbo :-(. Zresztą Turbo to abadonware, więc za korzystanie z niego nikt mnie raczej nie zamknie ;-). Zresztą Borlanda już nie ma
Re: rysowanie kółek w pascalu
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 16 Apr 2009 22:27
Date: Thu, 16 Apr 2009 22:27
72 lines
3579 bytes
3579 bytes
On Thu, 16 Apr 2009 01:33:27 -0700 (PDT), bala_dżi wrote: > Rozumiem istotę losowania okręgów. Ale nie bardzo czaję jak to tam > idzie dalej, > Dlaczego deklarujesz typ? Chodzi Ci o to aby nie wyłaziły? Deklaruje typ żeby się nie powtarzać. Programiści są leniwi. ;) > Możesz napisać mi to: >> function czyKolidujaDwa(x1,y1,r1,x2,y2,r2):boolean; >> begin >> // umiesz zaimplementowac? >> end; Nie, nie mogę napisać gotowca, w czym problem? Już mam złe przeczucie bo miałeś alternatywę zakodowaną? Plagiacik i nadzieja na gotowca? ;) Nie tutaj. > I to też: >> procedure dodajOkrag(ox,oy); >> begin >> // też powinieneś w stanie być odpowiednio zmanipulowac >> // zmienne tx, ty i ile zeby dodac element do kolekcji >> end; Analogicznie. > To na szczęście rozumiem >> function czyKolidujeZeWszystkimi(x,y,r):boolean; >> begin >> czyKoliduje := false; >> for n:=1 to ile do >> if (czyKoliduja2(tx[n], ty[n], r, x, y, r)) >> czyKoliduje := true; // tu mozna nawet machnac Exit(true); ;) >> Result := czyKoliduje; >> end; Gdzie dopiszesz zmienne(w jakim scope?), jakiego typu? >> Utrudniasz sobie, losuj przesunięte okręgi. >> x := Random(320-2*r)+r; >> analogicznie y. Będziesz miał pewniaka że wszysto będzie >> w View Porcie, bez zbędnego kombinowania. > Tak zrobię ;-) W aucie =]. >> p.s. Jakiego kompilatora używasz? Mam nadzieję że fpc >> bo ja preferuje ten dialekt, i preferuje ludzi >> nie używających archaicznego Turbo Pascal'a z >> powodów: >> - bo nauczyciel każe kraść >> - bo tak >> >> ;-). > > Też wolę fpc, ale program ma być na DOS, a fpc jest na Win32, jestem > zmuszony korzystać z Turbo :-(. Zresztą Turbo to abadonware, więc za > korzystanie z niego nikt mnie raczej nie zamknie ;-). Zresztą Borlanda > już nie ma 1. TP to nie jest abandonware, wnosisz po wieku? 2. Borlanda przejęła inna firma, markuje kompilator o wiele wieków lepszy, za darmo, dla celów nawet komercyjnych, 3. fpc ma też target go32, który jest extenderem protected-mode DOS, QED. 4. fpc jest znacznie lepiej zaprojektowane ;). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/ ICQ: 148498663 GG: 2544385 AIM: malyzgora GTalk: l3vi4than@gmail.com ASTRA: L3viathan
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads