Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2012, 00:03   #1
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
Восклицание Построение непересекающихся окружностей

Возник вопрос, как в Image случайным образом построить и расположить несколько непересекающихся окружностей случайного размера (не выходящего за пределы Image)
s77lanselot77s вне форума Ответить с цитированием
Старый 21.05.2012, 00:49   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

1. Заводим массив из записей (координаты центра и радиус).
2. Случайно выбираем координаты центра и радиус так, чтобы окружность не выходила за пределы Image.
3. Проверяем, не пересекается ли новая окружность с уже имеющимися в массиве. Если пересекается, то переходим на шаг 2.
4. Записываем данные новой окружности в массив и отображаем ее визуально.
5. Если нужна еще одна окружность, то переходим на шаг 2.
Arigato вне форума Ответить с цитированием
Старый 21.05.2012, 09:38   #3
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Что то не выходит
Код:
Function Dlina(a,b:Tpoint):Extended;
var x1,y1,x2,y2:real;
begin
x1:=a.x;
y1:=a.y;
x2:=b.x;
y2:=b.y;
   result:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
end;

procedure TForm1.Button1Click(Sender: TObject);
var maxR,x:integer;
begin
maxr:=50;

   CircleCount:=CircleCount+1;
 Setlength(Circle,CircleCount);
 x:=0;
   Circle[CircleCount-1].x:=maxR+random(form1.Image1.Width);
   Circle[CircleCount-1].y:=maxR+random(form1.Image1.Height);
 Circle[CircleCount-1].r:=maxr;

 while x<CircleCount-2 do begin
   if dlina(Point(Circle[CircleCount-1].x,Circle[CircleCount-1].y),Point(Circle[x].x,Circle[x].y))<120
   then begin
   form1.Image1.Canvas.MoveTo(Circle[CircleCount-1].x,Circle[CircleCount-1].y);
   form1.Image1.Canvas.lineto(Circle[x].x,Circle[x].y);

   Circle[CircleCount-1].x:=maxR+random(form1.Image1.Width);
   Circle[CircleCount-1].y:=maxR+random(form1.Image1.Height);
   x:=0;
   end else
   x:=x+1;
 end;

 form1.Image1.Canvas.Rectangle(Circle[CircleCount-1].x+Circle[CircleCount-1].r,
 Circle[CircleCount-1].y+Circle[CircleCount-1].r,
 Circle[CircleCount-1].x-Circle[CircleCount-1].r,
 Circle[CircleCount-1].y-Circle[CircleCount-1].r);
 form1.Image1.Canvas.Ellipse(Circle[CircleCount-1].x-5,Circle[CircleCount-1].y-5,Circle[CircleCount-1].x+5,Circle[CircleCount-1].y+5);
end;
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 21.05.2012, 11:43   #4
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
1. Заводим массив из записей (координаты центра и радиус).
2. Случайно выбираем координаты центра и радиус так, чтобы окружность не выходила за пределы Image.
3. Проверяем, не пересекается ли новая окружность с уже имеющимися в массиве. Если пересекается, то переходим на шаг 2.
4. Записываем данные новой окружности в массив и отображаем ее визуально.
5. Если нужна еще одна окружность, то переходим на шаг 2.
3. Проверяем, не пересекается ли новая окружность с уже имеющимися в массиве. Если пересекается, то переходим на шаг 2.

а как это сделать?
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 21.05.2012, 13:04   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
а как это сделать?
Координаты центров и радиусы есть, а дальше геометрия 8-го класса
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.05.2012, 13:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на форуме было уже:

Задача на окружности

Нахождение пересечений двух окружностей
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2012, 13:50   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Расстояние между центрами 2-х окружностей меньше суммы радиусов => пересекаются. Таким образом надо проверять пересечение со всеми уже построенными окружностями.
Arigato вне форума Ответить с цитированием
Старый 21.05.2012, 13:53   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Расстояние между радиусами 2-х окружностей меньше суммы радиусов => пересекаются

а если они вложены одна в другую?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 21.05.2012, 14:07   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вот геометрия восьмого класса
Код:
Function Dlina(a,b:Tpoint):Extended;
var x1,y1,x2,y2:real;
begin
x1:=a.x;
y1:=a.y;
x2:=b.x;
y2:=b.y;
   result:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
end;

.....
  if dlina(Point(Circle[CircleCount-1].x,Circle[CircleCount-1].y),Point(Circle[x].x,Circle[x].y))<120
Может, рандомно присваивать только в начале, а потом, если dlina<120 , то смещать на заданную длину, которую можно высчитывать формулой A^2=B^2+C^2. A=120, B=x, C=y, где x=x2-x1, y=y2-y1 . Получаем уравнение, которое одновременно будет условием непересечения, и даст нам величину, на которую нужно передвинуть центр окружности: 120^2=x^2+y^2.
Теперь, если хочешь сместить по x, то увеличивай х и проверяй на условие. Так в конце концов, либо ты найдешь место для круга, либо дойдя до конца массива, центр окружности будет пересекаться с границами формы или вообще уйдет за пределы видимости. Но лучше увеличивай не только х, но и у. Или если х=form.width , то х=х2 , а у=у2+N, и по новой увеличивать х.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 21.05.2012, 14:13   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
а если они вложены одна в другую?
Тогда еще проверить, чтобы расстояние между центрами было больше |R1 - R2|.

Код (только рисуем прямо на форму):
Код:
const N = 20;
      MaxR = 100;
      MinR = 10;
type TCircle = record X0, Y0, R: Integer; end; {rec TCircle}
var Circles: array[1..N] of TCircle;

function Intersection (Circle: TCircle; N: Integer): Boolean;
var I: Integer;
    Len: Single;
begin
  with Circle do
  begin
    for I := 1 to N do
    begin
      Len := Sqrt (Sqr (X0 - Circles[I].X0) + Sqr (Y0 - Circles[I].Y0));
      if (Len <= R + Circles[I].R) and (Len >= Abs (R - Circles[I].R)) then
      begin
        Result := True;
        Exit;
      end; {if}
    end; {for}
  end; {with}
  Result := False;
end; {func Intersection}

procedure TForm1.DrawCircles;
var I: Integer;
    Circle: TCircle;
begin
  Canvas.Brush.Style := bsClear;
  for I := 1 to N do
  begin
    with Circle do
    begin
      repeat
        R := Random (MaxR - MinR) + MinR;
        X0 := Random (ClientWidth - R * 2) + R;
        Y0 := Random (ClientHeight - R * 2) + R;
      until not Intersection (Circle, I - 1);
      Canvas.Ellipse (X0 - R, Y0 - R, X0 + R, Y0 + R);
    end; {with}
    Circles[I] := Circle;
  end; {for}
end; {proc TForm1.DrawCircles}

Последний раз редактировалось Arigato; 21.05.2012 в 14:35.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
упорядоченное построение окружностей(Delphi) FrankyKaup Помощь студентам 3 17.08.2010 13:41
построение окружностей в Delphi Kurai Помощь студентам 8 08.04.2010 22:00
Рисование окружностей SVadiks Помощь студентам 1 01.12.2009 22:55
C++, площадь окружностей kolesoo Помощь студентам 0 05.11.2009 22:30
Добавление окружностей ivp88 Помощь студентам 3 14.02.2007 16:31