Просмотр сообщений
|
Страниц: 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 страниц в памяти" определяет скорость/расход памяти
|
|
|
11400
|
Программирование / С/C++ / Re: Полезная строка/inline
|
: Август 09, 2009, 23:44
|
Еще есть вариант что архитектуру разрабатывал человек с неустойчивой психикой и a является экземпляром класса, в котором переопредлены операторы >= и < таким образом, что данное условие в некоторых случаях может выполняться - никаких классов/перегрузок нет. - писал болгарин, очень сильный программер - работает на любой платформе и размер в 10 раз меньше чем делать то же по-другому (как, кстати было сделано у меня )
|
|
|
|
|