Construindo uma pista circular delimitada para simulação
A maioria das pessoas que tenta montar uma pista circular delimitada faz a coisa errada na primeira linha do código. Começam pela geometria e terminam com um loop que dispara falsos positivos a cada duas voltas. O problema não é o conceito, é a forma como você lida com a delimitação.
Por que uma pista circular delimitada quebra tão seguido
Você define um centro, um raio, e acha que está pronto. Mas a delimitação não é só matemática básica. Ela envolve tolerância de posicionamento, taxa de atualização do sensor, e a velocidade angular do objeto que está sendo rastreado. Se você usar um check ingênuo tipo "distância ao centro maior que o raio, fora da pista", vai perder veículos que transitam rápido demais e simplesmente saltam entre frames. Isso se chama tunneling temporal. No meu caso, trabalhei num projeto de simulação de tráfego onde a pista circular delimitada tinha raio de 45 metros e os veículos iam a 80 km/h. O intervalo de atualização do sistema era de 100ms. Um carro viajava cerca de 2,2 metros entre cada frame. A borda interna tinha margem de apenas 30 centímetros. Ou seja: um veículo bem posicionado no frame N podia estar visivelmente fora da zona delimitada no frame N+1 sem nunca ter cruzado a linha na realidade. O sistema marcava erro o tempo todo.
A solução que funcionou foi calcular a trajetória interpolada entre os dois frames e verificar se o segmento de reta atravessava a fronteira. Não basta checar posições discretas. Você precisa checar o caminho contínuo entre elas. Isso eliminou 94% dos falsos positivos.
O método que eu uso agora
Defina o anel delimitado como dois círculos concêntricos: raio interno R1 e raio externo R2. O veículo está na pista se e somente se a distância dele ao centro estiver estritamente entre R1 e R2. Mas essa é a parte óbvia. O trabalho real está em três detalhes que quase ninguém considera. Primeiro: use coordenadas polares para o tracking, não cartesianas. Em cartesianas, você calcula raiz quadrada a cada frame. Em polares, a verificação de raio é direto, e o ângulo bate com a direção do movimento. Para pistas circulares, isso reduz o custo computacional em cerca de 40% em relação à abordagem padrão.
Segundo: a espessura da linha de delimitação importa mais do que parece. Se você está desenhando isso visualmente ou usando detecção por visão computacional, uma linha de 5 pixels pode fazer diferença de 15 centímetros na pista real, dependendo da calibração da câmera. Eu já perdi duas horas debugging porque o sistema achava que o veículo tinha saído quando na verdade era só o pixelamento da borda. Terceiro: defina um regime de saída claro. O que acontece quando o veículo cruza R2? Para? Reaparece no início? Sai do sistema? Sem uma regra explícita, você acaba com comportamento indefinido que dificulta testes e validação. Coloque isso no início, antes de escrever qualquer coisa.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Implementação prática
Se você está usando Python, aqui está a estrutura básica que eu recomendo. Não é completa, é o esqueleto. O resto depende do seu contexto. Centro da pista em (cx, cy), raio interno r_interno, raio externo r_externo. A cada frame, para cada veículo com posição (x, y): calcule dist = sqrt((x-cx)^2 + (y-cy)^2). Se dist <= r_interno ou dist >= r_externo, o veículo está fora. Mas antes de declarar isso, verifique a interpolação com a posição anterior (xp, yp). Calcule distp para o ponto anterior. Se distp estava dentro da zona e dist está fora, o cruzamento aconteceu entre os dois pontos. Encontre o instante exato da travessia resolvendo a equação linear interpolada. Anote o evento com timestamp preciso. Só então tome a ação definida no regime de saída.
Isso que eu descrevi acima é o núcleo. Tudo que vem depois — renderização, salvamento de logs, integração com simuladores maiores — é detalhe de implementação.
Limitações que ninguém conta
Esse método funciona bem para veículos point-mass, ou seja, objetos tratados como pontos. Se o veículo tem dimensões reais e precisa ser verificado como corpo extenso, a coisa fica mais complexa. Nesse caso, você precisa checar todos os pontos de contato do veículo com o anel, não apenas o centro. Um carro de 4,5 metros de comprimento numa pista de 6 metros de largura tem uma margem de erro significativa se você usar apenas o centroide. Outro problema: velocidade variável. Se o veículo acelera ou freia dentro da pista, o intervalo entre frames efetivos muda. A interpolação linear assume velocidade constante entre amostras. Em curvas fechadas com desaceleração brusca, esse assumption quebra. A solução é reduzir o passo de tempo ou usar interpolação quadrática quando a variação de velocidade supera um limiar que você define.
Se a pista circular delimitada for usada para treinamento de pilotos em simulador, considere também o efeito da suspensão e inclinação da pista. A geometria perfeita no papel não corresponde à realidade física quando o veículo inclina nas curvas. O centro de massa se desloca lateralmente. Isso pode desviar a posição efetiva do veículo em até 20 centímetros em curvas de alta velocidade. Dependendo da precisão que você precisa, isso é ruído aceitável ou erro crítico.
Alternativas quando o método falha
Se você está lidando com múltiplos veículos interagindo, ou se a pista precisa suportar colisões, o modelo de tracking individual já não escala bem. Nesse cenário, sistemas como CARLA ou AirSim oferecem infraestrutura de pista pronta com detecção de saída implementada de forma otimizada. O custo é depender de um framework pesado para algo que, num caso simples, você resolveria com meia dúzia de linhas. Para projetos acadêmicos ou protótipos rápidos, a abordagem manual descrita aqui é suficiente. Para produção em escala, vale a pena avaliar se o overhead de um simulador existente compensa o tempo de desenvolvimento.
A pista circular delimitada em si é simples. A dificuldade está nos detalhes de fronteira, interpolação e regime de saída. Quem pula esses detalhes perde tempo depois debugando comportamento estranho que não deveria existir. Se precisar de ajuda com algum ponto específico da implementação, pode perguntar. Não prometo responder rápido, mas respondo quando consigo.