Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хаотичное позиционирование элементов 
:(
    Опции темы
japanes
Дата 6.3.2008, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 20.1.2007

Репутация: нет
Всего: 7



Люди, может кто-то видел пример в сети или может помочь: необходимо выводить N-е количество абсолютно позиционированных блоков в хаотичном порядке, но с условием, что ни один из элементов не будет налазить друг на друга. Примерно как должно выглядеть это в итоге в аттаче.

Присоединённый файл ( Кол-во скачиваний: 32 )
Присоединённый файл  example.jpg 18,54 Kb
PM MAIL   Вверх
ksnk
Дата 6.3.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Я бы не назвал конструкцию на картинке хаотичной smile
Можно предложить такой алгоритм. Есть массив div'ов с определенными размерами.
- первый элемент выставляем в центр композиции.
Каждый следующий выставляем в ЦЕНТР композиции и выбираем для него вектор (случайно). Если пересечение с предыдущими элементами есть - смещаем элемент по вектору на случайное, но не очень большое число.
 Эффективно определить пересекаются ли прямоугольники не просто. Можно тупо пребирать все уже размещенные, и сравнивать габариты, а можно представить всю композицию как большой 2-х мерный массив (каждый элемент которого изображает квадрат 10х10). при установке элемента нужно отметить соответствующие элементы массива как занятые (Этакий "морской бой").

Если сдвигать элементы не по вектору, а по раскручивающейся спирали, можно получить примерно то, что нарисовано на картинке.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxdiver
Дата 7.3.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Есть идея простая:
Код
for (int i=0; i<n; ++i) {
    while (true) {
        double x = (rand() % 10000) * 0.001,  y = (rand() % 10000) * 0.001; // короче, рандомные :)
        bool good = true;
        for (int j=0; j<i && good; ++j)
           good &= !intersect (figure[i], figure[j]); // предполагая, что j в позиции ans_x[j], ans_y[j], а i в позиции x, y
        if (good) {
           ans_x[i] = x;
           ans_y[i] = y;
           break;
        }
    }
}

Есть предположение, что такая весчь найдёт ответ, если конечно тест не слишком плотный. Можно её оформить как перебор с возвратом, чтобы выбор позиции первой фигуры не мог оказаться фатальным.

Это сообщение отредактировал(а) maxdiver - 7.3.2008, 20:01
PM MAIL WWW ICQ   Вверх
japanes
Дата 9.3.2008, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 20.1.2007

Репутация: нет
Всего: 7



с С++ не совсем знаком, а именно строка:
Код

good &= !intersect (figure[i], figure[j]);

вызвала вопрос о том, что она делает :-/
PM MAIL   Вверх
maxdiver
Дата 9.3.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



japanes
это значит:
Код
if (!intersect (figure[i], figure[j]))
   good = false;

P.S. а я подумал, что на псевдокоде C++ понятнее будет smile
PM MAIL WWW ICQ   Вверх
japanes
Дата 9.3.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 20.1.2007

Репутация: нет
Всего: 7



а intersect() что за функция, чего делает?

P.S. на javascript-е было бы в самый раз ;)

Это сообщение отредактировал(а) japanes - 9.3.2008, 18:34
PM MAIL   Вверх
maxdiver
Дата 10.3.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



intersect - проверяет, пересекаются два блока или нет (если один принадлежит другому, то это считается как пересечение).
Эту функцию нужно, конечно, реализовать самому, но её реализация - это особая тема smile
PM MAIL WWW ICQ   Вверх
japanes
Дата 10.3.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 20.1.2007

Репутация: нет
Всего: 7



maxdiver, на самом деле весь вопрос с реализацией построения блоков уперся именно в эту функцию... может через аську решим ? 339-541-633
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.