Система частиц 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
Это работает? Я просто написал это, не пробовал или ничего.