🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#92854
Author: bala_dżi
Date: Sat, 04 Apr 2009 10:09
9 lines
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
#92855
Author: webmajsterek
Date: Sat, 04 Apr 2009 22:20
39 lines
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
#92856
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 05 Apr 2009 11:25
17 lines
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
#92857
Author: bala_dżi
Date: Mon, 13 Apr 2009 07:01
36 lines
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
#92858
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 13 Apr 2009 11:31
34 lines
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
#92859
Author: bala_dżi
Date: Mon, 13 Apr 2009 13:24
10 lines
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
#92860
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 13 Apr 2009 16:22
93 lines
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
#92861
Author: bala_dżi
Date: Thu, 16 Apr 2009 08:33
75 lines
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
#92862
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 16 Apr 2009 22:27
72 lines
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