Войти
ПрограммированиеФорумФизика

Медиан (направление) векторного поля.

#0
(Правка: 13:35) 13:33, 5 июня 2019

Есть набор нормализированных векторов. Нужно определить среднее направление с учётом длин векторов.
Пытался сделать на основании этого: https://pdfs.semanticscholar.org/e3c9/aba864bc08e33cb1de470782711055574478.pdf

И этого:
https://pdfs.semanticscholar.org/fc51/3ac3cb68814005495d81a9563e7b0cbbe5d5.pdf

Никак не могу разобраться с конечным углом, он то соноправлен полю, то противонаправлен.

const randomSign = () => (Math.random() < 0.5 ? -1 : 1);  // хелпер для случайного знака
const randomVal = (a, b) => (Math.random() < 0.5 ? a : b); // хелпер для случайного значения

// vectors - массив векторов
// distances массив расстояний

let gy = 0;
let gx = 0;

vectors.forEach((vector, idx) => {
  vector.scale(1 / distances[i]);

  if (vector.x === vector.y) {
    const val = randomVal('x', 'y');
    const sign = randomSign();
    vector[val] += sign;
  } else if (vector.x === 0) vector.x += randomSign();
  else if  (vector.y ===0) vector.y += randomSign();

`  gy += 2.0 * vector.x * vector.y;
        gx += vector.x * vector.x - vector.y * vector.y;
})
let angle = 0.5 * Math.atan(gy/gx);
let k = 0.5;
if (angle < 0 && gy >= 0) n = 1;
else if (angle >= 0 && gy <= 0) n = 0;

angle +=  + k * Math.PI;

const median = new Vec2(cos(angle), sin(angle));

С atan2 та-же фигня. Хелп ми плиз.


#1
(Правка: 22:20) 22:13, 5 июня 2019

iKest
> Есть набор нормализированных векторов. Нужно определить среднее направление с
> учётом длин векторов.
Непонятно, как ты собрался учитывать длинны векторов если они нормализованны?

iKest
> Никак не могу разобраться с конечным углом, он то соноправлен полю, то
> противонаправлен.
У тебя там случайные числа. Как ты вообще среднее собрался считать?

#2
(Правка: 23:04) 23:02, 5 июня 2019
Непонятно, как ты собрался учитывать длинны векторов если они нормализованны?

Не правильно выразился, не длины, а веса. Я просто скалю вектор пропорционально соответствующему весу.
У тебя там случайные числа.

Не числа, а направления. Большая разница.
Как ты вообще среднее собрался считать?

Почему нет? Мне же не коррелировать их надо, а просто найти средний вектор.

ЗЫ. Решение в лоб (тупо сумма векторов поделённая на их количество) не работает...

#3
(Правка: 23:46) 23:45, 5 июня 2019

iKest
> ЗЫ. Решение в лоб (тупо сумма векторов поделённая на их количество) не
> работает...
Медиана считается по другому, но точно не при помощи случайных чисел. Обычно медиана на массиве - это среднее число в отсортированном ряде чисел. В данном случае тут можно использовать вес вектора.

#4
1:28, 6 июня 2019

Ну хорошо. пусть не медиан, пусть это будет average vector.

#5
6:23, 6 июня 2019

iKest
> Ну хорошо. пусть не медиан, пусть это будет average vector.
может, ты всё-таки скажешь, что ты хочешь получить на выходе, если среднее арифметическое тебя не устраивает?

#6
20:12, 12 июня 2019

докину:

помогите пож. с определением вектора направления: есть объект, имеющий нормализированный вектор направления. в окрестностях объекта есть набор точек (соответственно можно получить набор векторов от объекта до точек, с направлением от точки до объекта). надо найти  средний вектор направления, учитывая, что веса векторов обратно пропорциональны их длине, максимально эквивалентный вектору направления объекта.

ps. ну и в качестве особого условия: из векторов с одинаковым направлением, надо учитывать только тот, который имеет наименьшую длинну и что распределение точек ниразу не нормальное.

#7
(Правка: 21:04) 21:03, 12 июня 2019

iKest
Чтобы узнать какая точка находиться по направлению это DOT(направление объекта, направление на точку) - больший скаляр, большее соответствие направлению. Подели это значение на расстояние и будет тебе счастье.

#8
(Правка: 21:34) 21:34, 12 июня 2019

foxes
может проще описать: есть бот. есть другие боты. от других ботов этот бот должен шугаться, причём, чем ближе 'сосед' , тем шугаться должен сильнее (в сферическом вакууме и одном 'соседе' просто драпать в направлении, противоположном направлению до 'соседа'). Но соседей может быть куча, и сам бот движется в каком-то направлении, так вот мне надо, что-бы бот и ото всех 'шуганулся', но при этом минимально возможно изменил своё направление движения. Как то так.

#9
21:45, 12 июня 2019

Что это меняет? Если бот уже бежит в определенном направлении, то единственное что ему может помешать и изменить его направление это встречные соседи.
Ну попробуй поиск пути между соседями добавить в сторону "дом". чем ближе к соседу тем больше стоимость прохождения.

#10
(Правка: 22:05) 21:57, 12 июня 2019

не, в том-то и дело что 'дома' нет, только направление. так что что-то типа астара не прокатит. в определённых случаях направление вполне может поменяться и на противоположное.

то единственное что ему может помешать и изменить его направление это встречные соседи.

мне не нужен просто проход между точками. мне нужен именно проход с учётом 'шугания'...

#11
(Правка: 22:34) 22:26, 12 июня 2019

iKest
> не, в том-то и дело что 'дома' нет, только направление.
Не бывает бесконечного числа алгоритмов решения задачи, бывает одно обобщение и разные входные параметры.
iKest
> мне не нужен просто проход между точками. мне нужен именно проход с учётом
> 'шугания'...
У меня есть одно решение, но оно будет работать только ночью и только когда тебе будет очень страшно.

#12
22:52, 12 июня 2019
  Не бывает бесконечного числа алгоритмов решения задачи, бывает одно обобщение и разные входные параметры. 

а ещё вода мокрая...
#13
23:33, 12 июня 2019

iKest
> а ещё вода мокрая...
сухая.

#14
9:09, 14 июня 2019

попробовал просто добавить в поле вектор направления ( и единичный, и с фиксированной длинной). Хрень получается.

ПрограммированиеФорумФизика