Форум: "Media";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизНепересекающиеся окружности Найти похожие ветки
← →
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 вся ветка
Форум: "Media";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.046 c