Помощь - Поиск - Пользователи - Календарь
Полная версия: Графика
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
FENIX
Одно из заданий лабы:
На экране построить N произвольных окружностей (можно использовать функцию Random), допускается их пересечение.

Окружности, не пересекающиеся ни с какой другой окружностью, выделить другим цветом или штриховкой. Определить их количество.

Не могу найти подходящий алгоритм для выполнения выделенной части.

Вот процедура рисования :low:
Код

Procedure graphic;
var
   grDriver, grMode, ErrCode,
   x, y, n : integer;

Begin
  ClrScr;
  write('BBEDUTE N= ');
  readln(n);
  grDriver:=Detect;
  InitGraph(grDriver, grMode, 'A:\');
  ErrCode:=GraphResult;
  If ErrCode = grOk then
  begin
     x := GetMaxX div 2;
     y := GetMaxY div 2;

     Repeat

        {SetColor(succ(Random(white)));}
        SetColor(White);
        SetLineStyle(0,0,2*Random(2)+1);
        x := Random(GetMaxX);
        y := Random(GetMaxY);
        Circle(x, y, Random(GetMaxY div 5));
        Dec(N);

     Until N=0;

  If ReadKey=#0 then x := ord(ReadKey);
  ReadLn;
  CloseGraph;

  end

else WriteLn('System failure: Matrix Reloaded :D', GraphErrorMsg(ErrCode));
Altair
Напрмиер так:
заносим все данные (для каждого круга: x,y и радиус, + цвет переменная)
в массив.

Затем поочереди берем окружности ипроверяем,если расстояние между
центрами меньше суммы радиусов то они пересекаются, тог аодним цветом рисуем иначе другим.

p.s. важно е замечание:
необходимо предусмореть, что окружность можетюыть вложенна.
FENIX
А как окружности в массив заносить?
Код
A[i] := Circle(x, y, R)
???
APAL
Пример:
Код
Const N = 5;
Type crcl = Record
         x,y,r : Integer;
       End;
Var m : Array [1..N] of crcl;

Begin
.....
 For i:=1 to N do
 Begin
   m[i].x:= Round(Random(640));
   m[i].y:= Round(Random(480));
   m[i].r:= Round(Random(400));
 End;
.....
End.
Altair
smile.gif (**умер)


------------------------
ладно.... есть много способов...
например так:
Код
Uses Graph,CRT;
Const
NN=100;
Var
A:Array[1..nn] of record x,y,r:longint; col:byte end;
Gd,gm:integer; n,i,j:longint; color:byte;
Begin
readln(n);

randomize;
for i:=1 to n do {генерируем случайные окружности}
begin
 a[i].x:=random(640);
 a[i].y:=random(480);
 a[i].r:=random(300);
end;

{*** ЗДЕСЬ  ИЩЕМ ВСЕ ПАРЫ  ОКРУЖНОСТЕЙ И ПРОВЕРЯЕМ ПЕРЕСЕКАЮТСЯ ИЛИ НЕТ, И В ЗАВИСИМОВТИ ОТ ЭТОГО ЦВЕТ ВЫДЕЛЯЕМ!!!}

readkey;
GD:=detect; initgraph(gd,gm,'');

{А ТЕПЕРЬ ВЫВОДИМ ВСЕ ОКРУЖНОСТИ НА ЭКРАН}
For i:=1 to n do begin setcolor(a[i].col); circle(a[i].x,a[i].y,a[i].r)end;
readkey;
end.
FENIX
Огромное спасибо за помощь smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.