Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.042 c
2-1130853359
3JIO
2005-11-01 16:55
2005.11.20
Базы


14-1130476416
CHES
2005-10-28 09:13
2005.11.20
Мне сегодня исполнилось 10 000 дней.


3-1121670907
АМБ
2005-07-18 11:15
2005.11.20
Просмотр и восстановление "удаленных" записей в DBF таблицах


2-1130794011
ArchValentin
2005-11-01 00:26
2005.11.20
Хранение информации разных типов в одном файле


14-1130749100
Opilki_Inside
2005-10-31 11:58
2005.11.20
Интеграция Help-файлов с приложением





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский