Система частиц Android сходится в одной точке

Хорошо, у меня есть система частиц в Android.

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

У кого-нибудь есть алгоритм, чтобы определить, как равномерно подойти к точке? Моя попытка получить угол у рандианцев... затем преобразовать и т. Д. Стала действительно грязной. Этот простой подход показал, что я двигаюсь в правильном темпе... но это простой 45-градусный подход. (имейте в виду, что на Android нет отрицательных координат x,y.. и слева вверху 0,0.. справа внизу (max,max). Функция принимает координаты касания (x,y). bx, by are координаты частиц.

public void moveParticles(float x, float y) {
    for (Particle b : Particles)
        {
         if (x <= b.x)
             b.x = b.x -1;
         else b.x = b.x +1;

          if (y <= b.y)
            b.y = b.y -1;
          else b.y = b.y +1;
         }          
}

2 ответа

Решение

Наивный код, предполагающий прикосновение, находится в центре экрана:

public void moveParticles(float x, float y) {
    for (Particle b : Particles) {
      b.x += ((b.x-x)/(x/2))*speedmodifier;
      b.y += ((b.y-y)/(y/2))*speedmodifier;
    }
}

Код с нормализованными скоростями каждой стороны оси касания:

public void moveParticles(float x, float y) {
    for (Particle b : Particles) {
      height_difference = screenheight-x;
      width_difference = screenwidth-y;
      height_ratio = (b.x < x) ? screen_height-height_difference : height_diffrence;
      width_ratio = (b.y < y) ? screenwidth-width_difference : width_difference;

      b.x += ((b.x-x)/height_ratio)*speedmodifier;
      b.y += ((b.y-y)/width_ratio)*speedmodifier;
    }
}

Шаги для создания этого кода: вам нужно получить соотношение экрана выше и ниже оси x и y, чтобы нормализовать скорость частиц от 0 до 1, независимо от того, где находится касание:

height_difference = screenheight-x;
width_difference = screenwidth-y;
height_ratio = (b.x < x) ? screen_height-height_difference : height_diffrence;
width_ratio = (b.y < y) ? screenwidth-width_difference : width_difference;

Как только мы получим эту информацию о нормализации, мы сможем использовать ее для нормализации скорости частиц:

b.x += ((b.x-x)/height_ratio)*speedmodifier;
b.y += ((b.y-y)/width_ratio)*speedmodifier;

Возьмем смещение частицы как вектор с точкой схождения как начало координат:

x = particle.x - finger.x
y = particle.y - finger.y

Получить вектор единицы:

norm = sqrt(pow(x, 2.0) + pow(y, 2.0))
x = x / norm
y = y / norm

Смещение частицы по единичному вектору * -1 * коэффициент скорости:

particle.x -= x * speed
particle.y -= y * speed

Это работает? Я просто написал это, не пробовал или ничего.

Другие вопросы по тегам