Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

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

 
sinful   (2005-06-29 17:07) [0]

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


 
gydvin   (2005-06-30 06:40) [1]

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


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


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

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

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


 
Kerk ©   (2005-06-30 10:08) [3]

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


 
имя   (2005-06-30 11:24) [4]

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


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

Ок. Как старый олимпиадник вставлю еще 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));

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


 
Kerk ©   (2005-06-30 11:40) [6]

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


 
Kerk ©   (2005-06-30 11:42) [7]


>    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); конечно


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

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


 
имя   (2005-06-30 11:50) [9]

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


 
Kerk ©   (2005-06-30 12:03) [10]

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


 
имя   (2005-06-30 12:10) [11]

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


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

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


 
имя   (2005-06-30 15:40) [13]

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


 
Vlad Oshin ©   (2005-06-30 16:06) [14]

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

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


 
Vlad Oshin ©   (2005-06-30 16:08) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
14-1130399289
boriskb
2005-10-27 11:48
2005.11.20
Ходорковский


14-1130485309
Juice
2005-10-28 11:41
2005.11.20
Посоветуйте книгу по Delphi 2005


2-1131204041
Zed
2005-11-05 18:20
2005.11.20
Процессы


3-1128661433
syte_ser78
2005-10-07 09:03
2005.11.20
Перевод БД на другой язык


1-1130394716
DEMs
2005-10-27 10:31
2005.11.20
Выгрузка в Excel memo полей