2012-01-05 180 views
0

我想點1和點2之間的距離與點1和點3我之間的距離比較想找到較小的一個。唯一的問題是所有三個點的xy值相當大,使用距離公式可能會導致溢出。還有另一種方法來找到距離?計算與大XY點之間的距離值

+0

你寫了一個點類與x,y作爲整數字段? – 2012-01-05 03:44:14

+0

Double.MAX_VALUE = 1.7976931348623157E308,你的距離真的很大嗎? – Bill 2012-01-05 03:44:43

+0

@SrinivasReddyThatiparthy不,我使用提供給我(android.graphics.Point)Point類 – Jrom 2012-01-05 03:46:35

回答

2

量表由恆定的值,計算距離,然後「unscale」的值。例如,將您的值除以10^6或10^9,或者其它任何值,然後計算縮放距離,然後使用您的縮放常量進行轉換。

+0

如果我縮小這些值,那麼我無法比較兩個縮放距離而不需要「縮小」了嗎? – Jrom 2012-01-05 03:44:21

+1

是的,如果你只需要知道相對距離,那麼你不必縮小備份。 – Paul 2012-01-05 13:30:39

1

Math.hypot()可以是在該上下文中是有用的,作爲「最後的結果是沒有介質溢或上溢。」

+0

我懷疑這個詞_medium_可能意味着_intermediate_。 – trashgod 2012-01-07 19:25:56

+0

'hypot'a)與雙打一起工作b)很慢,因爲它計算sqrt,對距離比較沒用。 – Gangnus 2016-08-23 21:34:11

+0

@Gangnus:好點;我通常在模型中使用'double'並在視圖中轉換爲'int';一個例子被引用[這裏](http://stackoverflow.com/a/2127971/230513)。 – trashgod 2016-08-24 01:16:30

1

它是最快的解決方案:

double dx12=x1-x2; 
double dy12=y1-y2; 
double dx13=x1-x3; 
double dy13=y1-y3; 
double r12sq=dx12*dx12+dy12*dy12; 
double r13sq=dx13*dx13+dy13*dy13; 
int minR= r12sq>r13sq ? Math.sqrt(r13sq) : Math.sqrt(r12sq); 

你需要採取只開方 - 一個最短距離。

正常化由一些固定常數是毫無意義的雙。

如果使用整數,而不是雙打,由一些固定不變的歸一化和座標的中心可能是其他一些有用的距離和壞。例如,如果你除以1000,對於幾十億有差異的座標是有利的,但是對於幾百個差異的差異,其效果將會被消滅。因此,只有在獲得中等dx和dy後,才能評估標準化的有用係數。讓我們需要4位數字作業

int dx12=x1-x2; 
int dy12=y1-y2; 
int dx13=x1-x3; 
int dy13=y1-y3; 
int d=(abs(dx12) +abs(dx13) + abs(dy12) + abs(dy13)); 

int coeff = d/10000; 
if(coeff<1) coeff=1; 

int dx12=dx12/coeff; 
int dy12=dy12/coeff; 
int dx13=dx13/coeff; 
int dy13=dy13/coeff; 

int r12sq=dx12*dx12+dy12*dy12; 
int r13sq=dx13*dx13+dy13*dy13; 
int minR= r12sq>r13sq ? Math.sqrt(r13sq) : Math.sqrt(r12sq); 

在這裏,您可以乘以這些int變量而不會溢出。

+0

請解釋爲什麼縮放值是「危險的」。 – Paul 2012-01-05 13:32:06

相關問題