거리와 상관없이 선형으로 유지 distance^2
하면서도 체형의 체비 쇼프 및 다이아몬드 같은 맨해튼 거리와 달리 모호하게 나타나는 물체가 필요한 경우 후자의 두 기술을 평균화하여 팔각형 거리 근사치를 얻을 수 있습니다.
dx = abs(x1 - x0)
dy = abs(y1 - y0)
dist = 0.5 * (dx + dy + max(dx, dy))
Wolfram Alpha 덕분에 함수의 시각화 (형상 플롯)는 다음과 같습니다 .
다음은 유클리드 거리와 비교할 때 오류 함수 의 도표입니다 (라디안, 1 사분면에만 해당).
보시다시피 오차는 축의 0 %에서 로브의 약 + 12 %입니다. 계수를 약간 수정하면 +/- 4 %로 낮출 수 있습니다.
dist = 0.4 * (dx + dy) + 0.56 * max(dx, dy)
최신 정보
위의 계수를 사용하면 최대 오차는 +/- 4 % 이내이지만 평균 오차는 여전히 + 1.3 %입니다. 제로 평균 오차에 최적화 된 다음을 사용할 수 있습니다.
dist = 0.394 * (dx + dy) + 0.554 * max(dx, dy)
-5 %에서 + 3 % 사이의 오류와 + 0.043 %의 평균 오류
이 알고리즘의 이름을 웹에서 검색하는 동안 비슷한 팔각형 근사가 발견되었습니다 .
dist = 1007/1024 * max(dx, dy) + 441/1024 * min(dx, dy)
이것은 본질적으로 동일합니다 (지수는 다르지만 -1.5 % ~ 7.5 % 오류가 발생하지만 +/- 4 %로 마사지 할 수 있습니다) max(dx, dy) + min(dx, dy) == dx + dy
. 이 양식을 사용하여 min
및 max
통화는 다음 과 같은 이유로 유리합니다.
if (dy > dx)
swap(dx, dy)
dist = 1007/1024 * dx + 441/1024 * dy
이것이 내 버전보다 빠를까요? 누가 알겠는가 ... 컴파일러와 타겟 플랫폼에 맞게 최적화하는 방법에 달려 있습니다. 내 생각에 어떤 차이를 보는 것은 꽤 어려울 것입니다.