Estou trabalhando em alguma lógica vetorial, então estou perguntando: posso economizar tempo do processador simplificando essa desigualdade:
distance(vector1, vector2) < distance(vector1, vector3)
Vejo que isso vector1
se repete nos dois casos.
Estou trabalhando em alguma lógica vetorial, então estou perguntando: posso economizar tempo do processador simplificando essa desigualdade:
distance(vector1, vector2) < distance(vector1, vector3)
Vejo que isso vector1
se repete nos dois casos.
Respostas:
Sim , você pode simplificar isso. Primeiro, pare de chamá-los de vetores. São pontos. Vamos chamá-los A
, B
e C
.
Então, você quer isso:
dist(A, B) < dist(A, C)
Substitua distâncias por distâncias ao quadrado e depois por produtos pontilhados (a partir da definição do comprimento euclidiano . Substitua AC
por AB + BC
(agora esses são vetores reais). Expanda, simplifique, fator:
dist(A, B)² < dist(A, C)²
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)
Aí está você:
dot(AB + AC, BC) > 0
Com sua notação vetorial:
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
São algumas adições e um produto de ponto em vez dos dois produtos de ponto anteriores.
dist(A, B)²
é a mesma dot(AB, AB)
, vem da própria definição do comprimento euclidiano .
Sim. Supondo que sua distance
função use uma raiz quadrada, você pode simplificar isso removendo a raiz quadrada.
Ao tentar encontrar a maior (ou menor) distância, x^2 > y^2
ainda é válido para x > y
.
No entanto, outras tentativas de simplificar matematicamente a equação provavelmente não fazem sentido. A distância entre vector1
e vector2
não é a mesma que distância entre vector1
e vector3
. Embora a equação possa ser simplificada matematicamente, como mostra a resposta de Sam , a forma em que está atualmente é provavelmente tão simples quanto você obterá da perspectiva de uso do processador.
Algumas matemáticas podem ajudar.
O que você está tentando fazer é:
<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2
Pelo que você pode remover variáveis repetidas e agrupar outras. A operação que você precisa verificar é:
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
Espero que ajude.
A verdadeira questão parece ser como reduzir a computação para determinar o objeto mais próximo?
A otimização disso geralmente é feita em jogos, embora com todas as otimizações deva ser guiada por perfil e, muitas vezes, não simplifica as coisas.
A maneira de evitar cálculos de distância desnecessários para determinar a coisa mais próxima - ou todas as coisas dentro de um determinado intervalo - é usar um índice espacial, por exemplo, uma octree .
Isso só compensa se houver um grande número de objetos. Por apenas três objetos, é improvável que valha a pena e certamente não simplifica o código.
depende de qual é a saída da distância (v1, v2)
se for um decimal (flutuante ou duplo) sobre um vetor, é provável que a distância percorrida seja muito mais rápida
float
tem a ver com nada.