На экране нарисованы два квадрата, как я могу обнаружить столкновение по краям обоих объектов?

Прямо сейчас я могу сравнить X и Y, чтобы проверить наличие столкновений, но этоs, только если два объекта проходят прямо друг через друга, на одном и том же X & Y поз. Мне нужно немного более точно проверять наличие коллизий, проверять наличие обезжиривания, из-за отсутствия лучшего термина. У меня есть переменные для шкал X, Y, X и Y и скорость для X и Y. Любая помощь очень ценится: D

РЕДАКТИРОВАТЬ: квадраты !!!

 T. Kiley18 июн. 2013 г., 00:18
Являются ли объекты всегда кругами (или сферами)? Если это так, вы можете просто проверить расстояние между центрами по сумме их радиусов
 exussum18 июн. 2013 г., 00:18
сначала сделайте несложные сравнения (квадраты вокруг них), они сталкиваются, затем выполните тесты по кругу
 Brian Roach18 июн. 2013 г., 00:22
возможный дубликатОбнаружение столкновения: округленный объект среди множества других
 Elist18 июн. 2013 г., 00:30
Просто потратили минуту, объясняя, как вычислить это для кругов ...

Ответы на вопрос(3)

что это создало большой квадрат вокруг моего первого квадрата и испортило столкновения. Вот моя реализация, основанная на Elistс пост.

public boolean colliding(Square os)
{
    // the lesser value is the distance of the square's width and that of the lenght of the
    // other square
    return Math.abs(center.x - os.center.x) < width / 2 + os.width / 2 
            && Math.abs(center.y - os.center.y) < height / 2 + os.width / 2;
}

При всем уважении к Элисту, я бы не пришел к такому выводу без их поста.

Дополнительной помощью для интересующихся будет обработчик, который может остановить входящий квадрат, и тот, который отражает его на основе скорости других квадратов.

// stops the square from intersecting
public void push_collided_basic(Square os, float refelct_amnt)
{
    if(os.center.x < center.x)
        os.center.x -= refelct_amnt;
    else if(os.center.x > center.x)
        os.center.x += refelct_amnt;
    if(os.center.y < center.y)
        os.center.y -= refelct_amnt;
    else if(os.center.y > center.y)
        os.center.y += refelct_amnt;
}

// and now one that reflects the ball -> untested!!!
public void push_collided_velocity(Square os)
{
    // flip the velocitys directions for x
    if(os.center.x < center.x 
              || os.center.x > center.x)
             os.vel_x *= -1;

     // flip the velocity direction for y
    if(os.center.y < center.y
              || os.center.y > center.y)
             os.vel_y *= -1;

      // update the coordiantes
      os.center.x += vel_x;
      os.center.y += vel_y;
}
Решение Вопроса

этолегкоdouble r длина каждого ребра,Point p1 является центром одного квадрата, иp2 другого. затем:

if (Math.abs(p1.x - p2.x) < r && Math.abs(p1.y - p2.y) < r) {
    // Collision
}

Более сложный случай, если квадрат может быть повернут. В таком случае: обрабатывайте каждое ребро объектов как геометрическую линию (вы можете легко вычислить каждую линию 'уравнение, если вы знаете координаты углов).

Затем найдите точку встречи каждой пары линий (каждая из одного квадрата напротив каждого другого) и проверьте, находится ли эта точка внутри одного из квадратов. Если одно из этих сравнений возвращает true - произошла коллизия.

 Aazim Abdul19 июн. 2013 г., 23:45
Квадрат не вращается, так что за, большое спасибо! PS: извините за мою ошибку с не определением квадрата / круга.
 Elist20 июн. 2013 г., 08:49
Нет проблем. Кстати, если ответ был полезным, вы можете пойти дальше, кроме него :)

все, что вам нужно сделать, это изменить свою систему координат, чтобы одна из них была выровнена по оси, а затем проверить каждую из вершин другой, чтобы убедиться, что она (вершина) находится внутри выровненной оси. прямоугольник. Вы можете изменить свою систему координат, вращая все вершины обоих прямоугольников вокруг одной и той же точки. Угол поворота должен быть отрицанием угла поворота повернутого прямоугольника. Например. если один прямоугольник наклонен на 13 °, вы бы повернули вершины обоих прямоугольников на -13 ° примерно в одной точке.

Ваш ответ на вопрос