Как определить «время» контакта круга со стеной? ⇐ JAVA
-
Anonymous
Как определить «время» контакта круга со стеной?
Я относительно новый программист и пытаюсь написать простую симуляцию на Java для личного обогащения, используя библиотеку Swing. Одна вещь, с которой я борюсь, — это обновление моих объектов (в данном случае мяча) до их точек соприкосновения со стеной. В настоящее время я распознаю столкновения за шаг до того, как они произойдут, чтобы иметь возможность отразить их от стен. Функция обновления моей симуляции следующая, а также функции обновления моего Entity (я знаю, что это ОЧЕНЬ беспорядочно; я планирую очистить их, как только они заработают):
public void update() { // Перебираем каждую сущность в списке для (Сущность: сущности) { // Флаг, определяющий, отскочил ли объект от стены логическое значение отскока = ложь; // Перебираем каждую стену в списке для (Стена стена: стены) { // Получаем будущую позицию объекта float[] nextPos =entity.getFuture(); // Проверяем, является ли объект шаром if (экземпляр объекта Ball) { // Создаем вектор, представляющий стену Вектор wallVector = новый вектор(wall.p2.x, wall.p2.y).vsubtract(новый вектор(wall.p1.x, wall.p1.y)); // Рассчитываем векторы от центра шара до стены Vector ballPosToWall = new Vector(((Ball)entity).centerx, ((Ball)entity).centery).vsubtract(new Vector(wall.p1.x, wall.p1.y)); Вектор nextPosToWall = новый вектор(nextPos[0], nextPos[1]).vsubtract(новый вектор(wall.p1.x, wall.p1.y)); // Вычисляем значения интерполяции для текущей и следующей позиции float ballInterp = ballPosToWall.dot(wallVector) / wallVector.getLengthSquared(); float nextInterp = nextPosToWall.dot(wallVector) / wallVector.getLengthSquared(); // Ограничиваем значения интерполяции диапазоном [0, 1] ballInterp = Math.max(0, Math.min(1, ballInterp)); nextInterp = Math.max(0, Math.min(1, nextInterp)); // Рассчитываем точки на стене, соответствующие текущей и следующей позициям мяча Вектор ballPoint = wallVector.scale(ballInterp).vadd(new Vector(wall.p1.x, wall.p1.y)); Вектор nextPoint = wallVector.scale(nextInterp).vadd(new Vector(wall.p1.x, wall.p1.y)); // Рассчитываем расстояние от мяча до стены в текущей и следующей позициях float currentDistance = (float) Math.sqrt(((ballPoint.dx - ((Ball)entity).centerx) * (ballPoint.dx - ((Ball)entity).centerx)) + ((ballPoint.dy - ((Ball)entity).centery) * (ballPoint.dy - ((Ball)entity).centery))); float nextDistance = (float) Math.sqrt(((nextPoint.dx - nextPos[0]) * (nextPoint.dx - nextPos[0])) + ((nextPoint.dy - nextPos[1]) * (nextPoint.dy - nextPos[1]))); // Проверяем, столкнется ли мяч со стеной в следующей позиции если (nextDistance
Я относительно новый программист и пытаюсь написать простую симуляцию на Java для личного обогащения, используя библиотеку Swing. Одна вещь, с которой я борюсь, — это обновление моих объектов (в данном случае мяча) до их точек соприкосновения со стеной. В настоящее время я распознаю столкновения за шаг до того, как они произойдут, чтобы иметь возможность отразить их от стен. Функция обновления моей симуляции следующая, а также функции обновления моего Entity (я знаю, что это ОЧЕНЬ беспорядочно; я планирую очистить их, как только они заработают):
public void update() { // Перебираем каждую сущность в списке для (Сущность: сущности) { // Флаг, определяющий, отскочил ли объект от стены логическое значение отскока = ложь; // Перебираем каждую стену в списке для (Стена стена: стены) { // Получаем будущую позицию объекта float[] nextPos =entity.getFuture(); // Проверяем, является ли объект шаром if (экземпляр объекта Ball) { // Создаем вектор, представляющий стену Вектор wallVector = новый вектор(wall.p2.x, wall.p2.y).vsubtract(новый вектор(wall.p1.x, wall.p1.y)); // Рассчитываем векторы от центра шара до стены Vector ballPosToWall = new Vector(((Ball)entity).centerx, ((Ball)entity).centery).vsubtract(new Vector(wall.p1.x, wall.p1.y)); Вектор nextPosToWall = новый вектор(nextPos[0], nextPos[1]).vsubtract(новый вектор(wall.p1.x, wall.p1.y)); // Вычисляем значения интерполяции для текущей и следующей позиции float ballInterp = ballPosToWall.dot(wallVector) / wallVector.getLengthSquared(); float nextInterp = nextPosToWall.dot(wallVector) / wallVector.getLengthSquared(); // Ограничиваем значения интерполяции диапазоном [0, 1] ballInterp = Math.max(0, Math.min(1, ballInterp)); nextInterp = Math.max(0, Math.min(1, nextInterp)); // Рассчитываем точки на стене, соответствующие текущей и следующей позициям мяча Вектор ballPoint = wallVector.scale(ballInterp).vadd(new Vector(wall.p1.x, wall.p1.y)); Вектор nextPoint = wallVector.scale(nextInterp).vadd(new Vector(wall.p1.x, wall.p1.y)); // Рассчитываем расстояние от мяча до стены в текущей и следующей позициях float currentDistance = (float) Math.sqrt(((ballPoint.dx - ((Ball)entity).centerx) * (ballPoint.dx - ((Ball)entity).centerx)) + ((ballPoint.dy - ((Ball)entity).centery) * (ballPoint.dy - ((Ball)entity).centery))); float nextDistance = (float) Math.sqrt(((nextPoint.dx - nextPos[0]) * (nextPoint.dx - nextPos[0])) + ((nextPoint.dy - nextPos[1]) * (nextPoint.dy - nextPos[1]))); // Проверяем, столкнется ли мяч со стеной в следующей позиции если (nextDistance
Мобильная версия