2012-10-23 83 views
4

我有以下幾點:確定兩個點是近

bool AreNear(Point Old, Point Current) 
{ 
    int x1 = Convert.ToInt32(Old.X); 
    int x2 = Convert.ToInt32(Current.X); 
    int y1 = Convert.ToInt32(Old.Y); 
    int y2 = Convert.ToInt32(Current.Y); 
    if (x1 == x2) { 
     if (y1 == y2) { 
      return true; 
     } 
    } 
    return false; 
} 

我想在函數返回true,如果當前點是在老點的25個像素半徑。誰能告訴我該怎麼做?

+1

PS:我會爲該函數使用更具描述性的名稱,例如'AreNear'。否則,如果不查看子程序本身,則不能推導出語句「if(ComparePoints(old,current))」的含義。 – Heinzi

+0

'X'和'Y'是什麼類型?字符串? –

回答

15

您可以使用the Pythagorean formula計算兩個點之間的距離。在C#中:

var d = Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2)) 

這是爲什麼有效?看看下面的圖,並記住,a^2 + b^2 = c^2適用於直角三角形:

Pythagoras

4

纔算使用畢達哥拉斯定理的距離的平方,並比較半徑的平方:

bool ComparePoints(Point Old, Point Current) 
{ 
    int x1 = Convert.ToInt32(Old.X); 
    int x2 = Convert.ToInt32(Current.X); 
    int y1 = Convert.ToInt32(Old.Y); 
    int y2 = Convert.ToInt32(Current.Y); 
    int dx = x1 - x2; 
    int dy = y1 - y2; 
    return (dx*dx + dy*dy) < 25*25; 
} 
+0

+1,用於在不需要的情況下避開那些斯諾克平方根。 – MarkJ

2

您可以使用Math.Abs獲得的距離:

public static bool InDistance(Point Old, Point Current, int distance) 
{ 
    int diffX = Math.Abs(Old.X - Current.X); 
    int diffY = Math.Abs(Old.Y - Current.Y); 
    return diffX <= distance && diffY <= distance; 
} 

使用它:

bool arePointsInDistance = InDistance(new Point(100, 120), new Point(120, 99), 25); 
+1

這檢查新點是否在舊點的「25像素*平方*」內(即,它使用最大度量)。 – Heinzi

+0

公制的另一種選擇:) – Rawling