pascal - jak to dokonczyc?

meFisto
Użytkownik
Użytkownik
Posty: 33
Rejestracja: 26 gru 2005, o 20:57
Płeć: Mężczyzna
Lokalizacja: Włocławek
Podziękował: 2 razy

pascal - jak to dokonczyc?

Post autor: meFisto »

Zadanie: Napisz program rysujacy 10 okregow, majacych losowe promienie i srodki w losowym miejscu na ekranie, ale tylko te, ktore mieszcza sie w obrebie ekranu calkowicie...
Udalo mi sie napisac program rysujace te 10 okregow; jak go skonczyc, by rysowal tylko te, ktore calkowicie mieszcza sie na ekranie?

Zalozenie: znana jest rozdzielczosc przez wykonanie wczesniej napisanego programiku:

begin
detectgraph(s,t);
initgraph(s,t,'c:\bp\bgi');
x:=getmaxx;
y:=getmaxy;
writeln(x,' ',y);
readln;
closegraph;
end.

Z gory dzieki za pomoc...


Oto te 'dzielo':


program okregi;

uses graph,crt;
var x,y,s,t,i,r:integer;

begin
randomize;
detectgraph(s,t);
initgraph(s,t,'C:\BP\BGI');
for i:=1 to 10 do
begin
x:=random(641);
y:=random(481);
r:=random(200);
circle(x,y,r);
end;
readln;
closegraph;
end.
nykus
Użytkownik
Użytkownik
Posty: 26
Rejestracja: 11 sty 2006, o 01:17
Płeć: Mężczyzna
Lokalizacja: Zielona Góra
Podziękował: 2 razy
Pomógł: 5 razy

pascal - jak to dokonczyc?

Post autor: nykus »

Udało mi się wymyślić dwa sposoby:

I sposób.
Przed wyrysowaniem okręgu trzeba by sprawdzić (if'em) czy nie "wyjedzie" poza ekran. Czyli czy 0<=x-r, x+r<=getmaxx, o<=y-r, y-r<=getmaxy. Dopiero po sprawdzeniu tych warunków wyrysować okrąg. Całość trzeba wtedy zamknąć w pętli repeat (ewentualnie while), a nie for i dodatkowo zliczać wyrysowane okręgi (tak aby móc wyjść z pętli).

II sposób (moim zdaniem "ładniejszy" :) ).
Pozostajemy przy pętli for. Najpierw losujemy promień (do zmiennej r). Teraz dopiero będziemy losować współrzędne środka, ale w następujący sposób:
x:=r+random(getmaxx+1-2*r);
y:=r+random(getmaxy+1-2*r);
Przy takim określeniu x i y okrąg musi się mieścić na ekranie.
ODPOWIEDZ