10
votes

Calculer le rectangle de liaison minimum de forme 2D par coordonnées

J'ai une solution qui utilise des données spatiales pour représenter une grappe de points sur une carte. J'ai la nécessité d'utiliser les coordonnées qui représentent les étendues d'un cluster pour trouver le rectangle de liaison minimum pouvant contenir ledit groupe de points.

Est-ce qu'un algorithme simple existe pour pouvoir calculer ceci ou y a-t-il une fonctionnalité intégrée dans C # pour y parvenir. Je suis conscient de la NetTopologysuite mais je ne suis pas sûr de savoir comment / si je pouvais l'utiliser pour atteindre le même objectif. J'ai une liste de coordonnées pour que je voudrais transmettre cette liste de cordes et obtenir le MBR.


4 commentaires

Malheureusement, je ne sais pas où commencer avec ce problème. Je suis au stade où j'ai mes coordonnées dans une liste de caractères de type et je ne suis pas sûr de savoir comment passer d'ici.


@Well vous avez deux types: la boîte à bornes alignée sur l'axe; qui se trouve simplement en trouvant le min x / y et max x / y. Ou vous avez la boîte de sélection orientée arbitraire qui est plus compliquée ( en.wikipedia.org/wiki/minimum_bounding_box_algorithms). Ceci est rendu plus compliqué si vous devez prendre en compte la courbure de la Terre (que j'espère que vous ne le faites pas), bien que techniquement, vous dessinez toujours une boîte, mais c'est en fait une partie de la surface d'une sphère ( probablement trop pour ce dont vous avez besoin)


Je vois. J'ai besoin d'une fonction qui fournira 4 coordonnées pour la boîte. Donc les deux valeurs x et les deux valeurs y. Souhaitez-vous que la meilleure façon de le faire serait de diviser mes coordonnées, puis de les comparer à tous pour trouver la valeur x la plus basse et la valeur minimale Y? Si je devais faire cela, je suppose que je voudrais seulement obtenir une valeur Minx et une valeur maximale? De ces deux chiffres, est-il possible de calculer les autres valeurs X et Y? Désolé si j'apparais un peu perdu. Spatial n'est pas ma région du tout.


Actuellement, je n'ai pas à envisager la courbure que j'utilise la grille nationale britannique Srid, mais cela peut devenir une exigence au fil du temps, mais pour l'instant, je veux juste avoir une fonction de travail et peut ensuite passer à partir de là.


3 Réponses :


9
votes

Un possible, bien que simple, de le faire pourrait être comme ça:

public Rectangle Test(List<Point> points)
{
    // Add checks here, if necessary, to make sure that points is not null,
    // and that it contains at least one (or perhaps two?) elements

    var minX = points.Min(p => p.X);
    var minY = points.Min(p => p.Y);
    var maxX = points.Max(p => p.X);
    var maxY = points.Max(p => p.Y);

    return new Rectangle(new Point(minX, minY), new Size(maxX-minX, maxY-minY));
}


0 commentaires

18
votes

La solution la plus facile et je suppose que vous êtes le plus susceptible de rechercher, est de calculer la boîte à bornes alignée sur l'axe, qui est simplement un cas de recherche des valeurs min / max x & Y, puis construisant Une boîte de ceux-ci.

Je vais vous donner pseudo-code pour cela, étant donné que vous n'avez pas posté les types que votre géométrie est exprimée dans ... xxx < p> donc étant donné à ceux-ci: xxx

Tous les éléments suivants seront tristes: xxx

bien sûr, si la coordonnée Le système a les coordonnées les plus basses en haut (par exemple, comme un affichage typique) - alors vous devez inverser le calcul; ou calculez d'abord le résultat dans l'espace d'objet, puis traduisez ensuite à l'espace logique après.

Notez que je suis allé pour un type pour la case qui exprime les quatre coins, au cas où vous décideriez à l'avenir de mettre à jour. à une boîte alignée arbitraire dans le futur (bien que par la même jeton, vous puissiez simplement utiliser un point de vue de point + 2 pour cela).


1 commentaires

Cela ressemble exactement à ce que je suis après. Merci.