Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непересекающиеся окружности


sinful ©   (2005-06-29 17:07:00) 

Подскажите, как случайным образом заполнить прямоугольник
непересекающимися окружностями одного радиуса, если число окружностей известно?


Vlad Oshin   (2005-06-30 16:08:00) [1]

приношу извинения, за ошибочность 4, 9, 11, 13
думал что я на другом сайте
исп. самописный клиент


Vlad Oshin   (2005-06-30 16:06:00) [2]

прямоугольник - это матрица.
обрезаем матрицу на R со сторон, делая эти эл-ты ее недопустимыми
label:
1. случайно ставим окружность на допустимое значение эл-мента матрицы
2. по ф-ле окружности вычеркиваем все элементы матрицы на удалении 2R.
3. любой из всех  не вычеркнутых элементов - центр следующей окружности
goto label

не для себя же :)


  (2005-06-30 15:40:00) [3]

Удалено модератором
Примечание: Не стоит под разными никами писать.


gydvin   (2005-06-30 14:24:00) [4]

А если как в [3], только предвигаться не случайным образом а допустим попиксельно или более, а вот окружность уже рисовать или нет выбирать случайно и если отрисовал следущий шаг за два радиуса и такдалее. Но помоему велика вероятность что весь канвас зарисуется окружностями, непроверял


  (2005-06-30 12:10:00) [5]

Удалено модератором


Kerk   (2005-06-30 12:03:00) [6]

Точка - это окружность с диаметром 1 пиксель. У нас окружности с диаметром 2R.
Как-то можно на таком масштабировании алгоритм построить. Надо обдумать. Но видимо придется вещественные координаты вводить. Не пойдет так.


  (2005-06-30 11:50:00) [7]

Удалено модератором


gydvin   (2005-06-30 11:43:00) [8]

Да это автор должен более потробно обьяснить чего он хочет добиться


Kerk   (2005-06-30 11:42:00) [9]


>    if Centers[i,j] then Canvas.Ellipse(i*R, j*R, i*(R+1), j*(R+1));

!!!
if Centers[i,j] then Canvas.Ellipse(i*R, j*R, (i+1)*R, (j+1)*R);конечно


Kerk   (2005-06-30 11:40:00) [10]

Но здесь, конечно, окружности будут расположены строго по "сетке". Автор не сказал как ему надо.


Kerk   (2005-06-30 11:39:00) [11]

Ок. Как старый олимпиадник вставлю еще 10 копеек :)

Пусть DX, DY- размеры прямоуголника, R- радиус окружностей.
Тогда SX := DX/2R; SY := DY/2R;
Берем массив Centers: array [0..SX-1,0..SY-1] of Boolean;

CirclesCount = ...;
repeat
 TmpX := Random(SX); TmpY := Random(SY);
 if not Centers[TmpX,TmpY] then
 begin
   Centers[TmpX,TmpY] := True;
   Dec(CirclesCount);
 end;
until CirclesCount = 0;


Теперь рисуем окружности.
for i := 0 to SX-1 do
 for j := 0 to SY-1 do
   if Centers[i,j] then Canvas.Ellipse(i*R, j*R, i*(R+1), j*(R+1));

В общем как-то так. Писалось на скорую руку, но, надеюсь, идея ясна.


  (2005-06-30 11:24:00) [12]

Удалено модератором


Kerk   (2005-06-30 10:08:00) [13]

Втыкать окружность по случайным (x,y), сохранять координаты центра в массив. Если расстояние между новой точкой и одной из точек в массиве меньше двух радиусов, то берем другую точку.


Чай толпой   (2005-06-30 09:35:00) [14]


> прямоуголиник разбить на одинаковые секции согласующиеся
> с размером окружности,

нет
таких областей очень много, в идеале - счетное мн-во
т.е. случайностьбудет сильно ограничена

имхо, втыкая очередную окружность, ее нужно двинуть по выбранной стратегии непересечения(верх-низ-право-лево, комбинация). Не ясно, правда сколько таких окружносткй, или какую площадь они могут занять.
Если S окружностей сравнима S прямоугольника то одно, если много меньше - совсем другое


gydvin   (2005-06-30 06:40:00) [15]

На мой взгляд прямоуголиник разбить на одинаковые секции согласующиеся с размером окружности, координаты секций хранить в массиве, также в массиве оставить место под одну запись типа 1-0 типа есть окружность-нету, случайным образом заполнять эту запись а потом из массива все отрисовывать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо