Russian Qt Forum
Май 01, 2024, 21:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 758 759 [760] 761
11386  Программирование / Алгоритмы / Re: Выбор кандидата для деления : Август 13, 2009, 16:33
Если все правильно, то;
1) Сортируем исходное множество.
2) Исходное множество разбиваем на 2 подмножества
  -  Max{}, некоторое заданное кол-во максимальных элементов или все элементы больше константы
  -  Min{}, все остальные
3) Выбираем максимальный из Max
4) Разбиваем его и получаем из него множество Cur{}
5) Сортируем Cur, вставляем (с учетом порядка) из Cur в Max все которые больше минимального в Max
6) Все остальные из Cur добавляем во множество Trash{}
7) Повторяем 3-6 до тех пор пока Max не опустеет
8.) Сортируем Trash и вставляем (с учетом порядка) все элементы из Trash в Min
9) Исходным множеством является множество Min. Возвращаемся к шагу 2.
Условие выхода сам обработаешь где надо.
Важно правильно подобрать условие разбивки на Max и Min.

Это близко к тому что я нагородил  Улыбающийся Постараюсь объяснить (наверное то же самое) попроще

1) Мы можем брать кандидатов подряд из сортированного массива и добавлять новые полигоны в хвост. Но только до тех пор пока площадь кандидата > S_new_max (максимальная площадь нового полигона). Если это условие не выполняется - снова сортируем.

2) Если площадь нового полигона > площади следующего кандидата, то имеет смысл добавить его в кэш прямой вставкой. Небольшой кэш (100 элементов) помогает сократить число сортировок. Теперь сначала берем из кэша и только если он пуст - из сортированного массива.

Все это работает, и гораздо быстрее чем прямой перебор. Однако я не удовлетворен. Во-первых, профайлер показывает что все равно "выбор кандидата" тянет больше чем само разбиение (сортировка на миллионах - удовольствие дорогое). Во-вторых, написано довольно много но как-то бестолково. Должен быть лучший способ.

Примечание: для этой конкретной задачи необязательно выбирать "самый-самый" лучший кандидат. Например, имеем такие
площади:

100, 99, 70, 20, 10

Наилучший 100, но не будет большого греха если сначала возьмем 99 (но, конечно, не 70)
 

11387  Программирование / Алгоритмы / Re: Выбор кандидата для деления : Август 13, 2009, 13:59
Дерево, отсортированное по площади.
Алгоритма такой:
1. Проверяем нужно ли ещё делить.
2. Берём наибольший и удаляем из дерева.
3. Разбиваем.
4. Добавляем осколки в дерево
5 Идём в начало.
Tonal, извините, не очень понял. Если "просто дерево" - то я с этого ничего не имею. Если "какое-то особое" - то добавление в такое будет совсем недешево.
11388  Программирование / Алгоритмы / Выбор кандидата для деления : Август 13, 2009, 12:42
Добрый день

Конкретно моя задача "адаптивная триангуляция", но нужный мне алгоритм наверняка более общий

Есть N полигонов, нужно выбирать из них самые крупные и разбивать на суб-полигоны. Разбитые полигоны могут быть опять разбиты. И так до тех пор пока все полигоны не станут достаточно малы или их число достигнет заданного.

Проблема в том как выбрать очередной полигон для деления. Сортировка ничего не дает, поскольку на каждом шаге образуются новые полигоны. А простой перебор = нестерпимые тормоза начиная примерно с миллиона полигонов.

Ваши соображения?
11389  Qt / Общие вопросы / Re: QFile::open() - как правильно открыть : Август 13, 2009, 12:13
Как ни старанно Улыбающийся ты был прав! Моды(режимы) QIODevice и fopen не обязаны соответствовать друг другу.
ReadWrite - дополнительные издержки(например под виндами)
Пришлось проверить  Улыбающийся  Про винду не скажу но под Mac OSX 10.5.2 файл обрезается до 0 при открытии write only. Если везде так - зачем делать по-другому?
11390  Программирование / С/C++ / Re: Как узнать размер двумерного массива? : Август 13, 2009, 11:31
Код
C++ (Qt)
sizeof(settingNames) / sizeof(settingNames[0])
 
Не оно? Улыбающийся

Так вот если явно не указывать размер массива в объявлении, то компилятор выдает
"error: invalid application of `sizeof' to incomplete type `QString[][3]'"

sizeof работать будет но в том же файле и после полного описания/инициализации. А иначе компилятор видит static QString[][3] как предварительное описание и sizeof не получить

Edit: можно добавить функцию с телом "в нужном месте" и вызывающую sizeof
11391  Qt / 2D и 3D графика / Re: QGraphicsView и векторная графика : Август 12, 2009, 20:57
.org.ru/topic_9063_0.html[/url].
3. Глюк с перерисовкой штриховки при масштабировании. На определённых масштабах сцена выглядит будто шахматная доска, вся разделена на квадраты, в одних есть штриховка, в других нет.
Ну, вообще-то это называется "anti-alias"  Улыбающийся И обеспечить его - работа кропотливая, никто за Вас это делать не будет. Так что при всем уважении - Ваши претензии не по адресу, любой пакет дает tools, а не готовые решения.
11392  Qt / Общие вопросы / Re: QFile::open() - как правильно открыть : Август 12, 2009, 18:19
Добрый день

Я не пытаюсь давать советы по Qt, но может быть мой "взгляд новичка" будет полезен
QIODevice::WriteOnly - перепишет первые 10 байт файла, остальные оставит как есть, размер файла будет 100 байт.
Лично в моем подсознании  "write only" стойко ассоциируется с (пере)созданием файла. Если файла нет - создать и открыть. Если есть - обрезать до 0 и открыть. Для перезаписи первых 10 байт из 100 надо открыть "read/write" (возможно с проверкой наличия файла).
11393  Qt / Установка, сборка, отладка, тестирование / Re: XCode 3.1 + moc : Август 12, 2009, 14:16
Здравствуйте, Авварон
по-моему *.xcodeproj это как раз фолдер... Вечером постараюсь глянуть что там и как... Я лично не вынес связки XCode+qt:)
кстати в QTcreator'е без пересборки и рана qmake не всегда проект собирается после добавления Q_OBJECT (пишет ошибку линковки)
Да, .xcodeproj это "package" и qmake пишет в "package content" (за 2 дня разобрался  Улыбающийся). Но работает мерзко.

- не понимает путей с пробелами в имени (нужно подправлять)

- портит проект если .pro файл изменен и нажал build  Смеющийся Смеющийся Смеющийся  Зараза!

- работает так: изменил .pro, вызвал qmake, проект обновлен, затем открыл проект и build. Но зачем менять/сбрасывать текущие установки проекта? Мне лично очень неприятно что кто-то лазит в моем проекте и делает что я не просил.

Пытаюсь гуглить как обойти но без особого успеха. Буду благодарен за любую информацию/совет
11394  Программирование / С/C++ / Re: Полезная строка/inline : Август 11, 2009, 16:40
Не факт, что какой-нибудь оптимизатор кода не схлопнет (!(a >= 0) && !(a < 0)) до false.

Насколько я замечал, даже абсурдные сравнения в оптимизированном коде выполняются. Но вот как сравнивать - вариантов много. Например если "а" float  то для (a != a) вполне могут быть использованы целочисленные 4-байтные регистры (вместо FP). А в общем согласен, конечно - не факт.
11395  Программирование / С/C++ / Re: Полезная строка/inline : Август 11, 2009, 15:34
Я не слишком знаком с экзотическими платформами, но разве isnan из cmath/math.h не тоже самое делает?

Я так и делал пока не увидел эту строку  Улыбающийся Но этого было недостаточно, нужно вызывать fpclassify и проверять варианты. Да еще на др. компиляторе _fpclass (а не fpclassify). В итоге получалось длинно и мутно.

А к чему такие сложности? Можно же сравнить a != a?

Можно, но так мы провоцируем оптимизатор кода. лучше таких приключений не искать.
11396  Программирование / С/C++ / Re: Полезная строка/inline : Август 11, 2009, 13:15
Можно по подробнее.
Можно. Пример

double a = sqrt(-1.0);
if (!(a >= 0) && !(a < 0))
    printf("a is invalid");

Условие возвращает true и printf выполняется. На практике это удобный способ проверить "живы ли еще расчеты" (или уже молотим Nan'ы).

Ну а насчет "приколов" - стар я уже чтобы глупыми шутками заниматься  Улыбающийся
11397  Программирование / Общий / Re: Trial версия программы. Защита. : Август 11, 2009, 03:08
Добрый день

Да, это всегда большая PITA

1) Есть программы для кодировки/перемешивания exe/dll. Например. я использовал ACProtect (хотя это было довольно давно). Это конечно, не решение, но крови они взломщику попортят, забить пару команд nop'ами уже не получится.

2) По поводу trial идей нет. Сидеть с неправильной датой весьма неудобно, этого можно не очень опасаться. Но вот откатить назад реестр или даже просто раз в месяц переставить систему.... Борьба с этим означает еще одну работу для Вас - и довольно большую. И для каждой платформы. Не лучше ли вместо этого предложить демо, без всякой защиты, но например, с отрезанной записью в файл?

3) Сама защита.  При отсутствии hardware key я использовал:

а) В главном окне показываю имя пользователя и его мейл. Хочет шерить - пусть шерит.

b) Привязка к computer name. Читать не напрямую а через GetProcAddress (взятый ранее) и строку-имя функции не светить.

с)  Выглядит глупо но зато хорошо работает: послать ID копии по udp. Если в сети обнаружено 2 или более запущенных копии - валить всех. Сидеть без сети и/или TCP/IP можно, но никто не хочет.

11398  Qt / 2D и 3D графика / Re: QGraphicsView, QGraphicsScene для отображения огромного файла (2хОЗУ) : Август 10, 2009, 19:10
Добрый день
И вообще всякие фотошопы как с файлом 40000 на 30000 справляются?
Базовая техника одна. Никто не держит изображение в RAM целиком. Файл распаковывается во временный файл (или в общий swap файл) "по страницам" (по tile, по квадратикам - называйте как хотите). В памяти хранится "карта" страниц

struct CImagePage {
  CImagePage * mPrev;  // prev page in list
  CImagePage * mNext;  // next page in list
  long long mFilePos;      // file position
  void * mPixels;           // pixels or NULL for purged page
  bool  mDirty;              // page has been modofied
  ...
};

Загруженные страницы хранятся в списке 1, не загруженные - в списке 2. Если затребованная страница не загружена, она
загружается и переносится в голову списка 1. Если длина списка 1 превышает заданную, страница в хвосте списка 1 выгружается и переносится в список 2 . Счетчик "не больше N страниц в памяти" определяет скорость/расход памяти   
11399  Программирование / С/C++ / Re: Полезная строка/inline : Август 10, 2009, 16:36
Тип a не float || double часом? Улыбающийся
Да
11400  Программирование / С/C++ / Re: Полезная строка/inline : Август 09, 2009, 23:44
Еще есть вариант что архитектуру разрабатывал человек с неустойчивой психикой и a является экземпляром класса, в котором переопредлены операторы >= и < таким образом, что данное условие в некоторых случаях может выполняться  Подмигивающий

- никаких классов/перегрузок нет.

- писал болгарин, очень сильный программер

- работает на любой платформе и размер в 10 раз меньше чем делать то же по-другому (как, кстати было сделано у меня  Подмигивающий)
Страниц: 1 ... 758 759 [760] 761

Страница сгенерирована за 0.127 секунд. Запросов: 23.