Un algorithme pour résoudre un problème de tableau simple (?)

voix
7

Pour cette vitesse de problème est assez crucial. J'ai dessiné une belle image pour mieux expliquer le problème. L'algorithme a besoin de calculer si les bords d'un rectangle continuent dans les limites de la toile, sera le bord recouper un autre rectangle?

Nous savons:

  1. La taille de la toile
  2. La taille de chaque rectangle
  3. La position de chaque rectangle

Plus la solution est mieux! Je suis coincé sur celui-ci et je ne sais pas vraiment où commencer.

alt texte http://www.freeimagehosting.net/uploads/8a457f2925.gif

À votre santé

Créé 08/07/2010 à 13:23
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
2

Les lignes qui ne sont pas parallèles entre elles vont se croiser à un moment donné. Calculer les pentes de chaque ligne et déterminer quelles lignes ils ne seront pas croiser.

Commençons par cela, et puis nous allons voir comment l'optimiser. Je ne sais pas comment les données sont représentées et je ne peux pas voir votre image.

L'utilisation des pentes est une simple vérification de l'égalité qui signifie probablement que vous pouvez profiter de trier les données. En fait, vous pouvez probablement créer un ensemble de pistes distinctes. Vous devez savoir comment représenter les données telles que les deux pentes du même rectangle ne sont pas comptés comme intersection.

EDIT: Attendez .. comment deux rectangles dont les bords aller à l' infini pas recoupé? Les rectangles sont essentiellement de deux lignes qui sont perpendiculaires l'une à l'autre. Il ne faut pas que cela signifie qu'il croise toujours avec un autre si ces lignes sont étendues à l' infini?

Créé 08/07/2010 à 13:35
source utilisateur

voix
6

Il suffit de créer l'ensemble des intervalles pour chacun des X et l'axe Y. Ensuite , pour chaque nouveau rectangle, voir s'il y a des intervalles dans l'intersection X ou l'axe Y. Voir ici pour une façon de mettre en œuvre les ensembles d'intervalle.

Dans votre premier exemple, l'intervalle défini sur l'axe horizontal serait { [0-8], [0-8], [9-10] }, et à la verticale:{ [0-3], [4-6], [0-4] }

Ceci est seulement un croquis, j'Abstraite beaucoup de détails ici (par exemple, généralement on demande un ensemble / arbre intervalle «qui se chevauchent des intervalles celui-ci », au lieu de « se croisent celui-ci », mais rien ne faisable).

modifier

S'il vous plaît regarder ce lié conférence du MIT (il est un peu long, mais absolument worths il). Même si vous trouvez des solutions plus simples (que la mise en œuvre d' un arbre rouge-noir augmentée), il est bon de connaître les idées derrière ces choses.

Créé 08/07/2010 à 13:36
source utilisateur

voix
1

aussi longtemps que vous ne l'avez pas mentionné la langue que vous avez choisi de résoudre le problème, je vais utiliser une sorte de code de pseudo

l'idée est que si tout est ok, puis une collection triée des bords du rectangle le long d'un axe doit être une séquence d'intervalles ne se chevauchent pas.

  1. nombre tous vos rectangles, les assignant individuels ids
  2. créer une collection d'arbre binaire vide (btc). cette collecte doit disposer d'un procédé pour insérer un noeud de nombre entier avec des informations btc :: insert (clé, valeur)
  3. pour tous les rectangles, faire:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. maintenant itérer le btc (cela vous donnera un ordre de tri)

btc_item = btc.first()
do
    id = btc_item.id
    btc_item = btc.next()
    if(id != btc_item.id)
    then report_invalid_placement(id, btc_item.id)
    btc_item = btc.next()
while btc_item is valid

5,7,8 - 2,3,4 répéter les étapes de coordonnées rect.left et rect.right

Créé 08/07/2010 à 13:49
source utilisateur

voix
1

J'aime cette question. Voici mon essayer d'obtenir là-dessus:

Si possible: Créer un polygone de chaque rectangle. Traiter chaque bord en tant que ligne de longueur maximale qui doit être coupé. Utilisez un algorithme de découpage pour vérifier la météo ou non une ligne croise une autre. Par exemple celui - ci: la ligne Clipping

Mais gardez à l'esprit: Si vous trouvez une intersection qui est à la position du sommet, son valide.

Créé 08/07/2010 à 14:01
source utilisateur

voix
1

Voici une idée. Au lieu de créer chaque rectangle (x, y, width, height), les instancier avec (x1, y1, x2, y2), ou au moins l' ont interpréter ces valeurs étant donné la largeur et la hauteur.

De cette façon, vous pouvez vérifier quels rectangles ont une même xou la yvaleur et assurez - vous que le rectangle correspondant a la même valeur secondaire.


Exemple:

Les rectangles que vous avez donnés ont les valeurs suivantes:

  • Square 1: [0, 0, 8, 3]
  • Square 3: [0, 4, 8, 6]
  • Square 4: [9, 0, 10, 4]

Tout d' abord, nous comparons Square 1à Square 3(pas de collision):

  • Comparer les valeurs x
    • [0, 8] à [0, 8] Ce sont exactement les mêmes, donc il n'y a pas de croisement.
  • Comparer les valeurs y
    • [0, 4] à [3, 6] Aucun de ces chiffres sont semblables, donc ils ne sont pas un facteur

, On compare à côté Square 3de Square 4(collision):

  • Comparer les valeurs x
    • [0, 8] [9, 10] Aucun de ces chiffres sont semblables, donc ils ne sont pas un facteur
  • Comparer les valeurs y
    • [4, 6] à [0, 4] Les rectangles ont le numéro 4 en commun, mais 0! = 6, donc il y a une collision

En savoir nous savons qu'une collision se produira, la méthode se terminera, mais permet d' évaluer Square 1et Square 4d' une certaine clarté supplémentaire.

  • Comparer les valeurs x
    • [0, 8] [9, 10] Aucun de ces chiffres sont semblables, donc ils ne sont pas un facteur
  • Comparer les valeurs y
    • [0, 3] à [0, 4] Les rectangles ont le nombre 0 en commun, mais 3! = 4, donc il y a une collision

Faites-moi savoir si vous avez besoin de détails supplémentaires :)

Créé 08/07/2010 à 14:08
source utilisateur

voix
0

Heh, en prenant les intervalles qui se chevauchent répondent à l'extrême, vous déterminez simplement tous les intervalles distincts le long de l'axe x et y. Pour chaque ligne de coupe, faire une recherche majorant le long de l'axe qu'il coupera en fonction de la valeur de départ de l'intervalle. Si vous ne trouvez pas un intervalle ou l'intervalle ne coupe pas la ligne, il est une ligne valide.

La partie délicate est un peu se rendre compte que les lignes de coupe valides ne seront pas recouper les limites d'un rectangle le long d'un axe, de sorte que vous pouvez combiner des intervalles qui se chevauchent dans un seul intervalle. Vous vous retrouvez avec un simple tableau trié (que vous remplissez O (n)) et un O (log n) recherche pour chaque ligne de coupe.

Créé 09/07/2010 à 07:53
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more