불평등“거리 (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.

그러나 수학적으로 수학을 단순화하려는 추가 시도는 의미가 없습니다. 사이의 거리 vector1와 vector2의 거리와 동일하지 vector1와 vector3. 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.