Russian Qt Forum
Декабрь 14, 2017, 17:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 117
1  Программирование / С/C++ / Re: Нетипичное наследование : Октябрь 12, 2017, 21:04
Цитировать
Так что в данном случае просто auto будет достаточно.
Нет, не всегда.. Если нет копирующего конструктора, определённого пользователем, то будет вызван конструктор по умолчанию (поправьте, если не так), что может быть затратно..

Цитировать
Скукатень. А где здесь развесистые switch'и?  Улыбающийся
Это да - не канонично  Смеющийся
2  Программирование / С/C++ / Re: Нетипичное наследование : Октябрь 12, 2017, 20:47
Цитировать
auto&& тогда уж и не думать)
А чем это лучше auto & ?
На сколько я понимаю, (возможно я не прав) это вызовет копирующий конструктор..

Цитировать
Мол, если возникнет какая-то специфика для др команды - мы специализируем для нее шаблон, и все дела!
Да, именно так. Это тот самый случай, когда необходимо разруливать (развлетвлять) поведение системы в зависимости только от пренадлежности её к определённому типу, минуя необходимость создавать объект класса.. Это классический паттерн класс харрактеристик (type traits). И да, он работает (и как это видно из контекста) в тех случаях, когда  "checkCommand не обязан иметь внутренние данные команды чтобы он мог что-то решать."  Улыбающийся Короче, всё решается в зависимости только от типа.
3  Программирование / С/C++ / Re: Нетипичное наследование : Октябрь 11, 2017, 15:56
Вообще не хватает мета информации о типе, которую можно было бы проверять. Задал свойства команды в мета информацию. Проверил ее, она не изменяема и статична для каждого типа. При этом эту мета информацию можно было бы для потомков переопределять.
Ну это типичный паттерн type_traits и плюс немного меташаблонной магии от boost::variant и boost::static_visitor

Код
C++ (Qt)
#include <iostream>
#include <string>
#include <boost/variant.hpp>
#include <memory>
#include <vector>
 
struct typeA_teg{};
struct typeB_teg{};
 
 
class BaseCommand
{
public:
   typedef boost::variant<typeA_teg, typeB_teg> command_type;
 
   BaseCommand() = default;
   virtual void execute() = 0;
   virtual  command_type commandType() = 0;
};
 
class CommandA : public BaseCommand {
 
   public:
       CommandA() = default;
 
       void execute() override {
           std::cout << "execure CommandA" << std::endl;
       }
 
       BaseCommand::command_type commandType()
       {
           return typeA_teg();
       }
};
 
class CommandB : public BaseCommand {
 
   public:
       CommandB() = default;
 
       void execute() override {
           std::cout << "execure CommandB" << std::endl;
       }
 
       BaseCommand::command_type commandType()
       {
           return typeB_teg();
       }
};
 
 
template <class>
struct command_traits;
 
template <>
struct command_traits<CommandA>
{
   static constexpr bool is_dublicated = true;
   typedef typeA_teg command_type;
};
 
 
template <>
struct command_traits<CommandB>
{
   static constexpr bool is_dublicated = false;
   typedef typeB_teg command_type;
};
 
 
template <class Command>
struct is_same_command_type : public boost::static_visitor<bool>
{
   typedef typename command_traits<Command>::command_type command_type;
 
   bool operator()(command_type) const
   {
       return true;
   }
 
   template <class T>
   bool operator()(T) const
   {
       return false;
   }
};
 
std::vector<std::shared_ptr<BaseCommand>> m_arr;
 
template <class Command>
bool checkCommand()
{
 
   if (!command_traits<Command>::is_dublicated) {
       for (auto & c : m_arr)
       {
           if (boost::apply_visitor(is_same_command_type<Command>(), c->commandType())
               return false;
       }
   }
 
   m_arr.push_back(std::make_shared<Command>());
 
   return true;
}
 
Писалось на коленке, могут быть опечатки  Улыбающийся
4  Программирование / С/C++ / Re: Нетипичное наследование : Октябрь 11, 2017, 13:58
m_ax, если не ошибаюсь тут тоже есть создание команды, потом проверка. И в случае если проверка не прошла, command будет автоматически удален. Буду мудрить с типами и switch.
Конечно есть создание команды, ведь далее вызывается её метод (а как его вызвать без создания объекта?) Улыбающийся
5  Программирование / С/C++ / Re: Нетипичное наследование : Октябрь 11, 2017, 13:47
Изменить архитектуру, заменив функцию checkCommand на
Код
C++ (Qt)
template <class Command>
std::shared_ptr<BaseCommand> createCommand()
{
   std::shared_ptr<BaseCommand> command = std::make_shared<Command>();
   if (!command->dublicated()) {
       for (std::vector<BaseCommand *>::iterator it = m_arr.begin() ; it != m_arr.end(); ++it)
           if ((*it)->commandType() ==  command->commandType()) {
               return null_ptr;
           }
   }
 
   m_arr.push_back(command);
 
   return command;
}
 
int main(int argc, char *argv[])
{
 
   auto ca = createCommand<CommandA>();
   if (ca)
       ca->execute();
 
   auto cb = createCommand<CommandB>();
   if (cb)
       cb->execute();
 
   return 0;
}
 
6  Программирование / С/C++ / Re: Найти следующий/предыдущий : Сентябрь 11, 2017, 14:51
Ну да, всё оказалось гораздо проще) 
7  Программирование / С/C++ / Re: Найти следующий/предыдущий : Сентябрь 09, 2017, 11:33
Цитировать
Наверное я плохо понимаю std.
Согласен)
Аналог GetNext:
Код
C++ (Qt)
int GetNext( const std::vector<double> & src, const double & value, const double & tolerance)
{
   auto it = std::lower_bound(src.begin(), src.end(), value, [&](const double & x, const double & val)->bool { return ((x - val) < tolerance); });
 
   return (it != src.end()) ? it - src.begin() : -1;
}
 
С GetPrev уж сами-сами)
8  Программирование / Алгоритмы / Re: Сетка на сфере : Август 21, 2017, 10:24
Цитировать
Какие-то там kd-tree и.т.п.
Можно организовать таблицу, с поиском ближайших узлов за O(ln(N)). Смотри схему ниже..

9  Программирование / Алгоритмы / Re: Сетка на сфере : Август 19, 2017, 14:30
Цитировать
Какие-то там kd-tree и.т.п. - это ж все "велики"
Да пожалуйста.. Но о каком kd-tree и.т.п. сейчас может идти речь, если мы ещё до сих пор не знаем/не представляем (ну лично я) как Вы хотите параметризовывать, строить сетку на сфере? Когда это будет понято, тогда уже можно будет говорить о модели представления этих узлов. Т.е. где то отображение, которое переводит какие-либо 2 обобщённые координаты (например в случае ССК это углы theta и phi) в координаты конкретного узла сетки?

Цитировать
перебор - вот наш метод!
Я себе сейчас представляю следующую ситуацию: предположим у меня есть массив из N векторов узлов на сфере. Т.е. мне его предоставляют по моему требованию. Я могу запросить скажем: хочу сетку из 1000 узлов - мне вернули массив из этих 1000 векторов. Всё.. Я имею random access к нему, могу этот массив сортировать и т.д. Но я не знаю по какому принципу он строится, я имею дело только по факту..
Какова потановка вопроса в таком случае? Для любой точки на сфере найти все ближайшие к ней узлы, нах. внутри заданного телесного угла (из центра сферы).
Я правильно понимаю?


Цитировать
Если мы умеем строить сферу из куба (а мы умеем),
   
Я не совсем понимаю, что Вы имеете в виду под "мы умеем строить сферу из куба"..
   
10  Программирование / Алгоритмы / Re: Сетка на сфере : Август 18, 2017, 16:17
Цитировать
Нет, координаты узлов "априорно" неизвестны, они тоже должны получаться из построения.
Которое ещё тоже не понятно какое?

Цитировать
Общий алгоритм:
У меня такой алгоритм:
1) У меня есть метод/алгоритм который на сфере (для определённости единичного радиуса) строит сетку в зависимости от числа N узлов (вершин) этой сетки. Чем больше узлов, тем меньше растояние между ними и тем меньше ячейки. Т.е. на выходе я имею N единичных векторов, определяющих положение узлов.

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

Всё) 
11  Программирование / Алгоритмы / Re: Сетка на сфере : Август 18, 2017, 10:24
Цитировать
Мне нужно определить в какую ячейку попал заданный вектор (он же точка на поверхности сферы) чтобы использовать значения в углах для интерполяции.
А координаты узлов сетки в принципе известны (их можно получить, перебрать, сортировать и т.д.)?  Т.е. фактически тогда нужно построить такую модель данных (для узлов), чтоб по заданному направлению получить координаты 4-ёх вершин?   
12  Программирование / Алгоритмы / Re: Сетка на сфере : Август 17, 2017, 16:35
Цитировать
Обычная "меридианная" сетка не годится, клеточки в ней разного размера
Какие две координаты (криволинейные) вы предлагаете использовать? Меридианная - это я полагаю сферическая СК с углами theta, phi?
Цитировать
Индекс ячейки нам не очень нужен. но цель та же - найти значения в 4-х углах, а возможно и в соседних ячейках.
 
А с чего вы взяли, что возможно замостить 3D сферу одинаковыми четырёхугольниками? Почему не треугольниками или шестиугольниками? И что такое step в этом контексте - расстояние между двумя ближайшими узлами рещётки?

Вообщем как всегда - постановка никакая(   
13  Qt / Вопросы новичков / Re: Быстрый поиск ближайшего значения : Август 11, 2017, 20:01
Как быстро найти число в массиве больше заданного? Допусти {1,10,100,150} на 15 вывести 100.
Есть QMap::lowerBound(const Key &key) вроде то что нужно, но придется хранить значения для ключей.
Если предполагается, что последовательность отсортирована, то стандартный std::lower_bound, а если нет.. То да, фактически остаётся перебор
Код
C++ (Qt)
template <class InputIt>
InputIt greater_than(InputIt first, InputIt last, int val)
{
   auto it_res = std::find_if(first, last, [&](int x){ return x >= val; });
   if (it_res == last)
       return last;
 
   first = it_res;
 
   while ((first = std::find_if(++first, last, [&](int x){ return x >= val; })) != last)
   {
       if (*first <= *it_res)
           it_res = first;
   }
 
   return it_res;
}
 
14  Разное / Говорилка / Re: Qt стал онли платным? : Август 03, 2017, 14:48
m_ax, а разве в бусте есть GUI?
Да я уж так, пошутил про буст)
15  Разное / Говорилка / Re: Qt стал онли платным? : Август 02, 2017, 21:44
Да форконут Qt, на крайней случай, если уж его свободе будет кто то угрожать..) Не надо трагедий (с)
Ну или буст -  наше всё) (но не для всех)
Страниц: [1] 2 3 ... 117
Страница сгенерирована за 0.145 секунд. Запросов: 23.