2010-11-22 27 views
1

Si j'ai deux System.Drawing.Rectangle objets sur une toile et un Point, quelle est la meilleure façonpour calculer qui Rectangle (une partie de la Rectangle, non seulement son LocationPoint) est le plus proche de celui Point?Comment trouver quel rectangle est le plus proche d'un point

Un exemple d'un test unitaire:

Rectangle one = new Rectangle (0, 0, 10, 10); 

Rectangle two = new Rectangle (20, 20, 10, 10); 

Point point = new Point(14, 14); 

Rectangle actual = ClosestToPoint(point, one, two); 

// should be closer to one since one's bottom right is at (10, 10) 
Assert.That(actual, Is.SameAs(one)); 

// method to write 
public Rectangle ClosestToPoint(Point p, params Rectangle[] rectangles) { } 
+1

Utilisez une feuille de papier et un crayon pour faire le tri. Il y a un nombre limité de scénarios. Il s'agit par ailleurs d'une question ambiguë, vous devrez spécifier ce qui se passe lorsqu'un point est * dans * un ou plusieurs rectangles. –

+0

Certaines réponses peuvent également être trouvées ici: http://stackoverflow.com/questions/5254838/calculating-distance-between-a-point-and-a-rectangular-box-nearest-point/ – Mo0gles

Répondre

4

distance pour rectangle = min (distance à chacun des quatre segments de ligne qui sont les bords du rectangle)

Pour la distance à la ligne segment, voir this question

+0

Sauf si quelque chose me manque, cela donne une mauvaise réponse si le point est * dans le rectangle. – CAFxX

+0

@CAFxX - Dépend de la façon dont vous voulez définir "distance au rectangle". Si vous pensez que les rectangles sont des solides, vous voudrez probablement définir la distance à 0 lorsque le point est à l'intérieur du rectangle. Cependant, je suis sûr qu'il y a des cas où vous voudriez garder la distance définie comme distance au bord le plus proche, que le point soit ou non à l'intérieur du rectangle. – mbeckish

0

Ceci est pour mesurer la distance entre 2 points, alors prenez le point de votre rectangle (qui est à vous coordonner pour décider être parce que je ne sais pas ce que le plus proche signifie pour vous):

public int Distance2D(int x1, int y1, int x2, int y2) 
    { 

    int result = 0; 
    double part1 = Math.Pow((x2 - x1), 2); 

    double part2 = Math.Pow((y2 - y1), 2); 
    double underRadical = part1 + part2; 
    result = (int)Math.Sqrt(underRadical); 

    return result; 
    } 
+0

La vraie question est "quels points je dois choisir", pas "comment calculer la distance" –

+0

Je suppose alors que la question devient comment puis-je trouver quel point dans un rectangle est le plus proche d'un point donné. Ensuite, comme vous le dites, il s'agit simplement de trouver la distance la plus proche entre un seul point et les points les plus proches de tous les rectangles. –

0

Hmm. Je pense à boucler votre tableau de rectangle et à stocker chaque index X et Y dans une liste. Vous pourriez alors faire une boucle dans la liste et faire quelque chose d'abs (min (i.getX() - point)). Si elles sont égales alors vérifiez min (y).

+0

pas besoin de calculer "point à point" distance "ligne à point" est suffisant –