Executando verificação de segurança...
2
KG1122
2 min de leitura ·

Relato: Matemática no Auxilio da Programação

Olá, é minha primeira vez postando algo, só queria compartilhar um relato.

Há um tempo atrás, eu estava trabalhando em um projeto pessoal na Unity. Em determinado momento, precisei de uma classe que instanciasse objetos nos voxels que compõem a superfície de uma esfera (basicamente eu precisava da "casca" de uma esfera no minecraft kk).
Meu primeiro instinto foi fazer três loops representando os eixos x, y e z que vão do 0 até o raio e verificar se o voxel estava dentro, fora ou na superfície da esfera. Caso estivesse na superfície, bastava replicar o resultado para todos os octantes.

// ...
for (int i = 0; i < Radius; i++)
    for (int j = 0; j < Radius; j++)
        for (int k = 0; k < Radius; k++)
        {
            var relPos = this.PosInSphereshell(i, j, k);
            
            if (relPos == RelativePos.Inside)
                continue;
            if (relPos == RelativePos.Outside)
                break;
                // ...
            

No entanto, após refletir sobre a eficiência desse método, realizei alguns cálculos simples e cheguei a um resultado interessante... Ao inverter o funcionamento do último loop (e alterar o comando executado quando o voxel está dentro ou fora da esfera, para que ele não saia do loop antes de começar), eu consegui reduzir em 10% o tempo gasto pelo código original.

// ...
for (int i = 0; i < Radius; i++)
    for (int j = 0; j < Radius; j++)
        for (int k = Radius - 1; k >= 0; k--)
        {
            var relPos = this.RelPosInSphereShell(i, j, k);
            
            if (relPos == RelativePos.Outside)
                continue;
            if (relPos == RelativePos.Inside)
                break;
            // ...

Bemchmark

Quem está acostumado com o assunto talvez já tenha entendido o porque isso acontece, mas a explicação segue essa linha de raciocinio. São calculos simples, coisa de ensino médio.

Representação visual do porque isso funciona

Posteriormente, implementei um sistema de simetria entre os eixos x e y que reduziu ainda mais o tempo, em cerca de 50%.
Embora a velocidade não seja crucial nesse exemplo em específico (são nanosegundos de diferença kk), é interessante notar como o uso adequado da matemática pode aumentar consideravelmente a eficiência de um código com mudanças relativamente simples.

Carregando publicação patrocinada...