몇 가지 벡터 논리를 연구 중이므로 다음과 같이 묻습니다.이 불평등을 단순화하여 프로세서 시간을 절약 할 수 있습니까?
distance(vector1, vector2) < distance(vector1, vector3)
그 볼 vector1
두 경우 모두에서 반복된다.
몇 가지 벡터 논리를 연구 중이므로 다음과 같이 묻습니다.이 불평등을 단순화하여 프로세서 시간을 절약 할 수 있습니까?
distance(vector1, vector2) < distance(vector1, vector3)
그 볼 vector1
두 경우 모두에서 반복된다.
답변:
예 , 이것을 단순화 할 수 있습니다. 먼저 벡터 호출을 중지하십시오. 그들은 포인트입니다. 의 그들을 부르 자 A
, B
하고 C
.
그래서 당신은 이것을 원합니다 :
dist(A, B) < dist(A, C)
거리를 제곱 한 거리로 대체 한 다음 내적을 사용하여 유클리드 길이 정의에서 대체 AC
합니다 AB + BC
(이제 실제 벡터 임).
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)
여기 있습니다:
dot(AB + AC, BC) > 0
벡터 표기법으로 :
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
그것은 이전의 두 가지 도트 제품 대신 몇 가지 추가 사항과 하나의 도트 제품입니다.
dist(A, B)²
같은지의 경우 dot(AB, AB)
, 그것은 유클리드 길이의 정의에서 비롯된 것 입니다.
예. distance
함수가 제곱근을 사용 한다고 가정하면 제곱근을 제거하여이를 단순화 할 수 있습니다.
더 큰 (또는 더 작은) 거리를 찾으려고 할 때에도 x^2 > y^2
여전히 유효합니다 x > y
.
그러나 수학적으로 수학을 단순화하려는 추가 시도는 의미가 없습니다. 사이의 거리 vector1
와 vector2
의 거리와 동일하지 vector1
와 vector3
. Sam의 답변에서 알 수 있듯이 방정식을 수학적으로 단순화 할 수 있지만 현재 사용중인 형식은 프로세서 사용 관점에서 얻을 수있는 것처럼 간단합니다.
일부 수학이 도움이 될 수 있습니다.
당신이하려고하는 것은 :
<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
반복 변수를 제거하고 다른 변수를 그룹화 할 수있는 것에서. 확인해야 할 작업은 다음과 같습니다.
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
도움이 되길 바랍니다.
실제 질문 은 가장 가까운 물체를 결정하기 위해 계산을 줄이는 방법에 관한 것 같습니다.
이 최적화 는 종종 게임에서 이루어 지지만 모든 최적화와 함께 프로파일 가이드되어야하고 종종 단순화 하지는 않습니다 .
가장 가까운 것 또는 특정 범위 내의 모든 것을 결정하기 위해 불필요한 거리 계산을 피하는 방법은 공간 인덱스 ( 예 : octree )를 사용하는 것 입니다.
많은 수의 객체가있는 경우에만 보상합니다. 단 3 개의 객체에 대해서는 돈을 지불 할 가능성이 없으며 코드를 단순화 하지 않습니다 .
그것은 거리 (v1, v2)의 출력이 무엇인지에 달려 있습니다.
벡터에서 10 진수 (float 또는 double) 인 경우 distancesquared가 훨씬 빠를 수 있습니다.
float
.