2015-03-12 5 views
0

У меня есть определенный момент, например fixedPoint = (142, 12). И я хочу создать n (x, y) точек случайным образом. Затем я хочу рассчитать самое ближайшее расстояние от fixedPoint до другого (x,y) точки в C#.Рассчитайте ближайшее расстояние от определенной точки до многих других точек

Есть ли учебное пособие, в котором объясняется, как это сделать? Или любой пример кода?

+1

Вы еще что-нибудь попробовали? Вы даже запустили для этого алгоритм? –

+0

Довольно уверен, что ваша проблема больше связана с математикой, чем с кодом, в этом случае это лучше подходит для 'maths.stackexchange', однако для вычисления расстояния между двумя точками pythagoras должно быть достаточно, вот сообщение: http: // math.stackexchange.com/q/367503/127609 – DrCopyPaste

+0

Если это математика: http://en.wikipedia.org/wiki/Euclidean_distance#Two_dimensions – displayname

ответ

3

Это просто перебирает точки и использует теорему Пифагора для поиска расстояния и отслеживания наилучшего соответствия.

В основном (псевдокод - это было некоторое время, так как я работал в C#):

struct Point 
{ 
    public int x; 
    public int y; 
}; 



var fixed = new Point(142,42); 

const int numberOfPoints = 20; // arbitrary number 

List<Point> points = new List<Point>(numberOfPoints); 

var random = new Random(); 
for(int i = 0; i < numberOfPoints; ++i) 
{ 
    int x = random.Next(-200,200); 
    int y = random.Next(-200,200); 
    points.Add(new Point(x,y)); 
} 

Point closestPoint = null; 
float closestDistanceSquared = float.Max; 
/// find closest point to fixed 
foreach(var point in points) 
{ 
    var distanceSquared = Math.Pow(point.x - fixed.x,2) + Math.Pow(point.y - fixed.y,2); 

    if (distanceSquared < closestDistanceSquared) 
    { 
     closestDistanceSquared = distanceSquared; 
     closestPoint = point; 
    } 
} 

/// closestPoint is now a reference to the closest to fixedPoint 
/// distance between the two is Math.Sqrt(distanceSquared) 

Я использую квадрат расстояния, а не извлекая квадратный корень внутри цикла, так как это немного более эффективным и достаточным для дистанционные сравнения.

Стоит отметить, что вы можете сделать это, создавая точки, а не отдельные петли.

+0

@fdas Вы можете добавить переменную 'public int distanceToFixed', чтобы отслеживать расстояние для каждой точки, если вы хотите больше, чем помнить ближайшую. –

+0

@ArthurRey true, но целесообразность этого зависит от того, фиксировано ли расстояние или действительно применимо к точке, а не к полигону или другому типу более высокого порядка. (Если это делает семантический смысл в контексте потребностей приложения.) –

Смежные вопросы