Как использовать переменные в операторе if в качестве члена структуры Rect2D? - PullRequest
0 голосов
/ 15 апреля 2019

Я изучаю искусственный интеллект в качестве модуля на курсе по программированию компьютерных игр, и одна из моих задач - это кодирование эффективного поведения, направленного на предотвращение препятствий.Я использовал Matt Bucklands Programming AI для примера, чтобы помочь мне, но основа, которую я использую, существенно отличается.Вместо того, чтобы использовать окно обнаружения, я должен использовать щупы, чтобы он был ближе к функции «Устранение стены», чем «Предотвращение препятствий».У меня есть функция PointInBox вместо функции LineIntersection, которая принимает Vector2D (щупальца) и Rect2D (препятствия).Код перебирает размер препятствия и обнаруживает, есть ли столкновение в этой точке.

После обнаружения столкновения рассчитывается усилие рулевого управления, чтобы оттолкнуть агента от препятствия

У меня проблема в том, что я не знаю, использую ли я правильные переменные впараметры PointInBox, и я не могу рассчитать усилие рулевого управления, потому что я не знаю, как эффективно использовать структуру Rect2D.

Я пробовал прикреплять различные значения к переменной Rect2D «препятствия», но мне нужночтобы получить ClosestObstacle и нормализовать его вокруг Rect2D (я действительно не знаю, как выразить словами, в чем моя проблема, я ограничиваю начинающего / промежуточного, когда дело доходит до кодирования).

Vector2D w019435fSteeringBehaviours::ObstacleAvoidance(Rect2D obstacles)
{
    CreateFeelers();

    double DistToThisIP = 0.0;
    double DistToClosestIP = MaxDouble;

    ObstacleManager* Obstacle;

    int ClosestObstacle = -1;

    Vector2D SteeringForce, Point, ClosestPoint;

    for (unsigned int flr = 0; flr < feelers.size(); ++flr)
    {
        for (unsigned int o = 0; o < Obstacle->GetObstacles().size(); ++o)
        {           
            if(PointInBox(feelers[flr], obstacles))
            {
                if (DistToThisIP < DistToClosestIP)
                {
                    DistToClosestIP = DistToThisIP;

                    ClosestObstacle = o;

                    ClosestPoint = Point;
                }
            }
        }

        if (ClosestObstacle >= 0)
        {
            Vector2D Projection = feelers[flr] - ClosestPoint;

            SteeringForce =  obstacles.normal * Projection.Length();
        }
    }
    return SteeringForce;
}

ClosestObstacleЯ думаю, что это очень важно и должно быть элементом препятствий, которые затем нормализуются и умножаются на длину проекции.Но я не могу прикрепить участников к препятствиям.

Любая помощь будет принята с благодарностью, спасибо.

...