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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 116
1  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Июнь 01, 2017, 12:43
Цитировать
И если поступило указание "на 100 собак вперед" - то мы 100 раз зовем ++it, расписываясь в том что "просто посчитать" не умеем. Ну как-то неудобно
И в чём проблема?
Код
C++ (Qt)
it += 100;
 
Это random access итератор.
2  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 25, 2017, 19:12
Цитировать
У меня другие результаты - противоположные..
Сделал вашу функцию инлайн и результаты примерно выровнялись:
Код
Bash
m_ax, total time: 296
deMax, total time: 305
 
m_ax, total time: 296
deMax, total time: 304
 
m_ax, total time: 297
deMax, total time: 303
 
(результаты после 3-х запусков), что говорит о том, что компилятор не видит особой разницы между
Код
C++ (Qt)
posCurrentFrame -= (posCurrentFrame / sizeWithBack) * sizeWithBack;
if(posCurrentFrame<0) posCurrentFrame += sizeWithBack;
 
и этим
Код
C++ (Qt)
return toFrame((x + step % T) % T);
 


 
3  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 25, 2017, 16:00
Цитировать
Моя функция 20млн.раз выполняется за 301мс(с поддержкой отрицательного шага 324), а ваша 640.
У меня другие результаты - противоположные..
Может вы её в холостую запускали?

Мой тест приаттачен.
компилятор: gcc 4.9.2
4  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 25, 2017, 15:35
Цитировать
нет ерунда, да еще за диапазон вышла.
Я вот на таком тесте
Код
C++ (Qt)
#include <iostream>
#include <random>
#include <cmath>
#include <stdexcept>
 
 
inline int NextFrame_m_ax(int currentFrame, int step, int x0, int x1) throw (std::logic_error)
{
   if ((currentFrame < std::min(x0, x1)) || (currentFrame > std::max(x0, x1)))
       throw std::logic_error("out of range");
 
   if (x0 == x1) return x0;
 
   const int sign = (x1 > x0) ? 1 : -1;
 
   const int T = 2*sign*(x1 - x0);
 
   auto toFrame = [&](int x)->int
   {
       return (x <= T/2) ? (x0 + sign*x) : (sign*(T - x) + x0);
   };
 
   int x = sign*(currentFrame - x0);
 
   return toFrame((x + step % T) % T);
}
 
 
int NextFrame_deMax(int currentFrame, int step, int x0, int x1) {
   int dPosFirst = x1>x0? 1: -1; // направление в первой последовательности
   int size = abs(x1-x0)+1;
 
   int posCurrentFrame = (currentFrame - x0) * dPosFirst;
   if(posCurrentFrame >= size || posCurrentFrame<0) return 0; //TODO error: число не принадлежит последовательности
 
   posCurrentFrame += step; // new Frame;
 
   if(x0 == x1)return x0; // если один кадр
   int sizeWithBack = size*2 - 2; // размер последовательности включая обратную(не правильно считает для одного кадра x0==x1, но этот случай отсекли)
   posCurrentFrame -= (posCurrentFrame / sizeWithBack) * sizeWithBack; // теперь новый кадр будет лежать в диапазоне [0, sizeWithBack), так как данная последовательность повторяется
 
   return posCurrentFrame < size? x0 + posCurrentFrame * dPosFirst:
                                  x0 + (sizeWithBack - posCurrentFrame) * dPosFirst;
}
 
 
int main()
{
   int f0 = 5;
   int f1 = 10;
   int frame = 9;
 
   std::cout << "m_ax \t deMax" << std::endl;
 
   for(int i=-20; i<20; ++i)
   {
       std::cout <<  NextFrame_m_ax(frame, i, f0, f1) << "\t" << NextFrame_deMax(frame, i, f0, f1) << std::endl;
   }
 
   return 0;
}
 
получил следующее:
Код
Bash
m_ax    deMax
9 -1
0 0
1 1
2 2
3 3
4 4
5 5
6 -4
7 -3
8 -2
9 -1
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
9 9
8 8
7 7
6 6
5 5
6 6
7 7
8 8
9 9
10 10
9 9
8 8
7 7
6 6
5 5
6 6
7 7
8 8
 
т.е. у вас она уходит в отрицательные значения..

Если изменить порядок диапазона:
Код
C++ (Qt)
   int f0 = 10;
   int f1 = 5;
 
то обе реализации выдают ерунду (
Код
Bash
m_ax deMax
9 19
18 18
17 17
16 16
15 15
14 14
13 13
12 12
11 11
10 10
9 19
18 18
17 17
16 16
15 15
14 14
13 13
12 12
11 11
10 10
9 9
8 8
7 7
6 6
5 5
6 6
7 7
8 8
9 9
10 10
9 9
8 8
7 7
6 6
5 5
6 6
7 7
8 8
9 9
10 10
 
5  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 25, 2017, 14:43
Цитировать
1. uint step - для отрицательных чисел у вас алгоритм вычисляет неправильно(автору не нужно)
Да вроде и с отрицательными работает нормально)

Цитировать
2. при x0 == x1 у вас T == 0 -> %T сгенерирует ошибку и программа упадет без обработчика
Да, согласен)

Цитировать
4. имхо, через деление выражение ((x + step % T) % T) быстрее будет
Не знаю.. думаю сейчас, это больше от компилятора зависит..

Цитировать
5. std::min и max тоже можно убрать повысив производительность, if((sign>0 && currentFrame<x0 ?&& currentFrame>x1) || (sign<0 && currentFrame<x1 ?&& currentFrame>x0)) throw std::logic_error("out of range");
Здесь, думаю, тож спорно в плане производительности.. Я за читабельность в данном случае)
6  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 25, 2017, 13:15
Цитировать
остальные программы работают неправильно
Всё работает как надо) Слегка подправил для для обратного порядка и на проверку на диапазон.
Код
C++ (Qt)
inline int NextFrame(int currentFrame, int step, int x0, int x1) throw (std::logic_error)
{
   if ((currentFrame < std::min(x0, x1)) || (currentFrame > std::max(x0, x1)))
       throw std::logic_error("out of range");
 
   int sign = (x1 > x0) ? 1 : -1;
 
   const int T = 2*sign*(x1 - x0);
 
   auto toFrame = [&](int x)->int
   {
       return (x <= T/2) ? (x0 + sign*x) : (sign*(T - x) + x0);
   };
 
   int x = sign*(currentFrame - x0);
 
   return toFrame((x + step % T) % T);
}
 
По моему это гораздо проще и нагляднее)
7  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 23, 2017, 20:34
Цитировать
Да, и в "геометрии" там задачка давно плачет по Вашему академическому образованию
Ну так Вы бы её академически сформулировали бы, что ли)
А так у меня сейчас голова забита совершенно другими задачками) Да и сессия на носу) 
8  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 22, 2017, 13:54
Цитировать
но "int x = currentFrame - min;" некорректно, так как в условии " или [10..5] (играть в обратном порядке с 10-го по 5-й)"
Проверки на принадлежность к диапазону и на обратный порядок  - пускай igors делает) Я чисто концепт обозначил)

Цитировать
она неверный результат на тесте выводит.
На каком именно тесте?
9  Программирование / Алгоритмы / Re: Вычислить кадр мувика : Май 22, 2017, 13:28
Цитировать
Набил на скорую руку, вроде работает

Можно попроще
Код
C++ (Qt)
inline int NextFrame(int currentFrame, int step, int min, int max)
{
   const int T = 2*(max - min);
 
   auto toFrame = [&](int x)->int
   {
       return (x <= T/2) ? (min + x) : (T - x + min);
   };
 
   int x = currentFrame - min;
 
   int n = trunc(double(step)/T);
 
   return toFrame(x + step - T*n);
}
 

Цитировать
а если видео нужно гонять в цикле, то итератор подошел бы
Итераторы здесь, это больная тема  Улыбающийся
10  Разное / Говорилка / Re: Старая шутка : Февраль 23, 2017, 19:17
Цитировать
Тогда все сразу становится очень натуральным. Ну это всего лишь "я так думаю"
Да, да,  с таким подходом можно оправдать любой говнокод)
11  Разное / Говорилка / Re: Геометрия (задачки) : Январь 29, 2017, 15:15
Цитировать
Ну как всегда, сами напутаете - а я виноват
Конечно. Нужно корректно ставить задачу.
Сейчас выясняется что есть ещё и шаг dt и т.д. и т.п..

Цитировать
Практически нужно знать что они уже столкнулись или столкнутся в течение заданного интервала времени dt
Ну и в чём проблема тогда? Скорость сближения/разбегания известна, относительное расстояние известно..
Странные у Вас какие то задачки..) 
12  Разное / Говорилка / Re: Геометрия (задачки) : Январь 27, 2017, 13:26
Цитировать
Шо за система  Непонимающий
Ландау, Лифшиц 1 том..

 
Цитировать
Посчитаем тестовый пример (на бумажке)
Да, сорри, забыл условие проверить.. Теперь всё ок
Код
C++ (Qt)
bool BallsCollided( Ball & ball1, Ball & ball2 )
{
   QVector3D r0 = ball1.pos - ball2.pos;
   QVector3D u = ball1.speed - ball2.speed;
 
   float u2 = u.lengthSquared();
   float r0u = QVector3D::dotProduct(r0, u);
 
   float rho2 = r0.lengthSquared() - r0u*r0u/u2;
 
   return (rho2 < 4.0*Ball::radius * Ball::radius) & (r0u < 0.0f);
}
 

Цитировать
По поводу пересечения шариков: ну а почему не просто так
Это вообще что??  
Как я понял из условия задачи: В некоторый момент времени нам были даны координаты и скорости шаров.  Вопрос: Столкнутся ли они в будущем? Всё.
Та формула/функция, что я привёл однозначно на этот вопрос отвечает.)
Могу, конечно, её расшифровать/вывести..  

Ну и скорости после столкновения тоже легко вычисляются..
13  Разное / Говорилка / Re: Геометрия (задачки) : Январь 25, 2017, 17:45
Цитировать
20) Есть 2 шарика одинакового размера
Ну это просто решается в системе центра масс..
Код
C++ (Qt)
bool BallsCollided( Ball & ball1, Ball & ball2 )
{
   QVector3D r0 = ball1.pos - ball2.pos;
   QVector3D u = ball1.speed - ball2.speed;
 
   float u2 = u.lengthSquared();
   float r0u = QVector3D::dotProduct(r0, u);
 
   float rho2 = r0.lengthSquared() - r0u*r0u/u2;
 
   return (rho2 < 4*Ball::radius * Ball::radius);
}
 
14  Программирование / Алгоритмы / Re: За стенкой или нет? : Январь 14, 2017, 12:23
Цитировать
Совсем не понял Ваш острожный намек
Я имел в виду (но похоже это не тот случай), что там, где точно численно задача не представляется возможной, можно попробовать использовать стохастические (случайные) процессы. Точнее свести задачу к некоторому усреднению по  ансамблю таких систем.. Т.е. накидываем случайным образом N точек "фотонов", смотрим какая часть из них куда попала и на основе этого вытаскиваем нужные наблюдаемые..

Цитировать
Непонятно почему никто не предложил поанализировать "расклад" фотонов? Вот неск "паттернов" (аттач). Есть напр такой метод (встречал неск перепечаток)
Вообще, не совсем понятно, для чего? Что это вообще даёт?
Цитировать
- находим все фотоны в радиусе R и сортируем их по расстоянию от центра (целевой точки)
Хорошо, находим.. Зачем их сортировать?
Цитировать
- добавляя фотон за фотоном получаем ф-цию F(R). Напр для радиуса 1 имеем такую плотность, для R = 2 другую и.т.д.
Ну предположим.. И что? Вы уже сразу предполагаете, что распределение будет зависеть только от расстояния до центра, но вообще говоря, оно может быть и анизотропным..
Цитировать
- отлавливаем значение R когда ф-ция начинает "монотонно убывать/возрастать".  По-простому это как бы мы "зацепили" чужой свет/тень. Все, возвращаем значение плотности для пойманного R

С увеличением R, рано или поздно функция конечно будет сглаживаться всё больше и больше, если мы говорим о плотности F(R) = N/S, (S = pi R^2 - площадь). Чем больше R - тем более сильное усреднение мы получаем - более размазанное и сглаженное описание.  
Цитировать
По-простому это как бы мы "зацепили" чужой свет/тень. Все, возвращаем значение плотности для пойманного R
Как по интегральной, усреднённой величине мы делаем вывод о том, что мы там чего то зацепили?

    
15  Программирование / Алгоритмы / Re: За стенкой или нет? : Январь 12, 2017, 18:21
Интересно, а кто остальные половиначеловека?  Смеющийся

Нет, на самом деле, если грамотно поставить задачу, в категориях максимально отдалённых от предметной области (включая жаргон и т.п.) т.е. максимально абстрагироваться от этого всего, то почему бы и нет? Другое дело, что здесь как раз это, как правило, не работает) В процессе возникают новые условия, требования и т.д. и т.п.. В этом основная проблема, на мой взгляд) 
Страниц: [1] 2 3 ... 116
Страница сгенерирована за 0.272 секунд. Запросов: 23.