Круговой коллайдер не обнаруживает точку внутри себя

В 2D-игре моя функция определяет, находится ли спрайт в пределах кругов. Но это не удается.

Приведенный ниже код просто перебирает все точки, составляющие контур круга (каждая точка имеет координаты x и y). Затем он разбивает круг на 4 квадранта одинакового размера (как декартова плоскость) и проверяет, находится ли спрайт в этом квадранте (координаты x/y начинаются с (0,0) в верхнем левом углу окна и увеличиваются по мере увеличения). вы идете вниз для y и вправо для x):

bool IsColliding()
{
for (int i = 0; i < TotalPointsThatMakeUpTheCircleOutline; i++)
{
    // Points lining the top left quadrant of circle
    if (Circle.Point[i].xCoordinate <= Circle.getCenterCoordinate().x &&
        Circle.Point[i].yCoordinate <= Circle.getCenterCoordinate().y)
    {
        // Checks if sprite is in-between circle outline point and center point
        if (sprite.xCoordinate >= Circle.Point[i].xCoordinate &&
            sprite.xCoordinate <= Circle.getCenterCoordinate().x &&
            sprite.yCoordinate >= Circle.Point[i].yCoordinate &&
            sprite.yCoordinate <= Circle.getCenterCoordinate().y)
        {
            return true;
        }
    }
    // Points lining the top right quadrant of circle
    ........
    // Points lining the bottom left quadrant of circle
    ........
    // Points lining the bottom right quadrant of circle
    ........

    return false;
}

}

Остальные 3 оператора if одинаковы, просто меняются местами соответствующие знаки сравнения ("‹" и ">"). Может ли кто-нибудь увидеть, что мне не хватает?


person DonDaDev    schedule 10.09.2015    source источник
comment
Вы сравниваете координату y с координатой x. Но это слишком сложно. Вам следует применить теорему Пифагора.   -  person 1201ProgramAlarm    schedule 10.09.2015
comment
Как сказал @ 1201ProgramAlarm, этот код немного сумасшедший. Чтобы проверить точку внутри или на окружности, вам нужно всего лишь проверить dx*dx + dy*dy <= r_squared. Похоже, ваше столкновение пытается сделать это с каждым углом спрайта. Кроме того, вы можете захотеть проверить, сталкивается ли край, даже если все углы могут быть за пределами круга. Вы можете решить это, проверив расстояние точки (центр круга) от вектора (одного края) и проверив, что перпендикуляр находится между двумя вершинами края (т.е. скалярное произведение, которое уже является частью вычисления, находится между 0 и 1).   -  person paddy    schedule 10.09.2015


Ответы (1)


Эти «коробочные» тесты фактически обнаруживают внутри синей области, изображенной ниже, которая является грубым приближением к кругу и оставляет «дыры».

введите здесь описание изображения

Тест (Px - Cx)² + (Py - Cy)² ≤ R² быстрый и абсолютно точный.

person Yves Daoust    schedule 10.09.2015