불평등“거리 (p1, p2) <거리 (p1, p3)”를 단순화 할 수 있습니까?


14

몇 가지 벡터 논리를 연구 중이므로 다음과 같이 묻습니다.이 불평등을 단순화하여 프로세서 시간을 절약 할 수 있습니까?

distance(vector1, vector2) < distance(vector1, vector3)

그 볼 vector1두 경우 모두에서 반복된다.


10
간단한 참고 사항 : 현재 방법은 매우 읽기 쉽고 기능을 즉시 이해할 수 있습니다. 이러한 답변 중 일부는 요청한 작업을 수행 할 수 있지만 명확하지는 않습니다. 성능이 중요한 경우에는 문제가 없지만 명확성을 잃어 버리지 않도록 적절하게 설명해야합니다.
MikeS

3
@MikeS의 의견을 계속하려면 이미 분석 또는 프로파일 링을 수행하고이 호출을 병목 현상으로 식별 한 경우와 같은 경우에만 성능이 핵심이어야합니다. 305fps와 303fps의 차이를 이야기 할 때 유지 보수성이 원시 성능을 능가합니다.
Phoshi

답변:


24

, 이것을 단순화 할 수 있습니다. 먼저 벡터 호출을 중지하십시오. 그들은 포인트입니다. 의 그들을 부르 자 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

그것은 이전의 두 가지 도트 제품 대신 몇 가지 추가 사항과 하나의 도트 제품입니다.


a a + b b = a a + c c를 내적 제품 버전으로 대체하는 방법을 설명 할 수 있습니까?
TravisG

2
@TravisG 나는 당신이 무엇을 요구하는지 잘 모르겠습니다. 당신의 질문이 왜 dist(A, B)²같은지의 경우 dot(AB, AB), 그것은 유클리드 길이의 정의에서 비롯된 것 입니다.
sam hocevar

2
분명히 이것은 수학적으로 수학 방정식을 단순화하지만 OP에 대한 프로세서 시간을 절약 할 필요는 없습니다. 원래 거리 방정식에서 제곱근을 제거하는 것보다 더 복잡하고 계산이 더 복잡합니다.
MichaelHouse

1
내가 틀렸지 만 두 개의 내적 제품이 내적 제품 당 5 개의 작업과 총 16 개의 작업 인 두 개의 vec3 뺄셈을 더한 경우 수정하십시오. 17.합니다
루이스 W

2
흥미롭게도 결과는 평행 사변형의 두 대각 대각선의 내적입니다. 그러나 그것은 관련이 없습니다. 내가 말하고 싶은 것은이 완전한 단순화 로부터 얻을 수있는 엄청난 양이 없다는 것입니다 . 다른 사람들이 언급했듯이 실제로 계산하려고하는 것을 난독 화하거나 복잡하게하는 것은 괜찮습니다. 그러나 첫 번째 단계를 사용하고 싶을 것입니다. 불필요한 제곱근을 피하는 것이 항상 가치가 있습니다. 복잡한 평면에서도 거리가 양의 명확한 값이므로 거리의 제곱을 비교하는 것만 같습니다.
TASagent

16

예. distance함수가 제곱근을 사용 한다고 가정하면 제곱근을 제거하여이를 단순화 할 수 있습니다.

더 큰 (또는 더 작은) 거리를 찾으려고 할 때에도 x^2 > y^2여전히 유효합니다 x > y.

그러나 수학적으로 수학을 단순화하려는 추가 시도는 의미가 없습니다. 사이의 거리 vector1vector2의 거리와 동일하지 vector1vector3. Sam의 답변에서 알 수 있듯이 방정식을 수학적으로 단순화 할 수 있지만 현재 사용중인 형식은 프로세서 사용 관점에서 얻을 수있는 것처럼 간단합니다.


충분한 담당자가 없지만 근본적으로 잘못되었으므로 "이 불평등을 단순화하여 프로세서 시간을 절약 할 수 있습니까?"라고 생각합니다. 대답은 '예'입니다.
너무 혼란스러워 메신저

답은 거리 방정식이 제곱근을 사용하는 경우에만 그렇습니다. 내가 언급 한 것.
MichaelHouse

요점은 진술을 철회하겠습니다. 그러나, 사용자는 유클리드 거리 SQRT (SUM (치수 차이의 제곱)) 수단 99 % 보장된다
때문에 혼란 IM

@imsoconfused Fair 충분히, 나는 가장 가능성있는 (99 %) 시나리오를 먼저 진술하기 위해 대답 순서를 변경했습니다.
MichaelHouse

2
예, 제 경험은 DistanceSquared 함수가 이런 종류의 물건을 다룰 때 매우 유용합니다. 그것은 분명하고 비싼 sqrt 작업을 피합니다.
Loren Pechtel

0

일부 수학이 도움이 될 수 있습니다.

당신이하려고하는 것은 :

<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

도움이 되길 바랍니다.


-1

실제 질문 은 가장 가까운 물체를 결정하기 위해 계산을 줄이는 방법에 관한 것 같습니다.

이 최적화 는 종종 게임에서 이루어 지지만 모든 최적화와 함께 프로파일 가이드되어야하고 종종 단순화 하지는 않습니다 .

가장 가까운 것 또는 특정 범위 내의 모든 것을 결정하기 위해 불필요한 거리 계산을 피하는 방법은 공간 인덱스 ( 예 : octree )를 사용하는 것 입니다.

많은 수의 객체가있는 경우에만 보상합니다. 단 3 개의 객체에 대해서는 돈을 지불 할 가능성이 없으며 코드를 단순화 하지 않습니다 .


4
나는 실제 질문이 매우 간단하다고 생각하며,이 답변은 그것을 해결하지 못합니다. OP의 더 깊고 언급되지 않은 질문에 대해 추측하고 싶다면 실제로 질문에 대답하지 않을 경우 실제로 주석으로 수행해야합니다.

가능한 조기 최적화를 호출하기 때문에 나는 이것을 downvoting하고 있지 문제에 대한 답변 명시 적 최적화 중 가독성, 코드의 유지 보수를 다치게하지 않으며,이 모호한 관행을 장려한다. 실제로 간단하고 최적화 된 코드를 작성할 수 있다면 어떻습니까? 더 높은 수준의 계획을 가지고 있어도 확실히 해치지 않습니다 (게임 개발자는 콘솔 등에서 프레임 당 몇 마이크로 초를 거부하지 않습니다).
teodron

@teodron : "실제로 간단하고 최적화 된 코드를 작성할 수 있다면 어떻습니까?" - 이제 OP (현재 우리) 는 무시할 수없는 시간을 투자하여 그에게 이익이되지 않는 것을 최적화했습니다.
BlueRaja-대니 Pflughoeft

@ BlueRaja-DannyPflughoeft 나는 이것이 사소한 것에 동의합니다 (따라서 프레임 당 수백 번의 호출에 사용되는 경우 중요하지 않은 최적화이지만 크기가 수천으로 증가하면 상황이 변경됩니다). 그러나 우리는 실행 불가능하다고 생각되는 것에 대한 답변 / 최적화를 시도하는 데 시간을 낭비하지 않아도됩니다. OP는 한 가지를 요구했는데, 사람들은 OP가 더 높은 수준의 전략과 프로파일 링 관행을 알지 못한다고 가정했습니다. 나는 개인적으로 답변이 아닌 의견에 그러한 말을하는 것을 선호합니다. 너무 장황해서 죄송합니다 :(.
teodron

-3

그것은 거리 (v1, v2)의 출력이 무엇인지에 달려 있습니다.

벡터에서 10 진수 (float 또는 double) 인 경우 distancesquared가 훨씬 빠를 수 있습니다.


5
나는 그것이 무엇과 관련이 있는지 보지 못합니다 float.
MichaelHouse

나는 특별히 잘 설명되지 않은 다른 벡터에 대한 부동을 의미했습니다 (그리고 당신이 알고 있다고 생각합니다)
RoughPlace

5
나는 의도적으로 오해하지 않았습니다. 나는 아직도 당신이 무슨 뜻인지 잘 모르겠습니다. 거리 함수가 벡터를 반환하는 이유를 모르겠습니다.
MichaelHouse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.