Un algoritm pentru a rezolva un simplu (?) Problema matrice

voturi
7

Pentru această viteză problemă este destul de important. Am desenat o imagine frumos pentru a explica mai bine problema. Algoritmul trebuie să calculeze dacă marginile unui dreptunghi continuă în limitele panza, va marginea intersecta un alt dreptunghi?

Noi stim:

  1. Dimensiunea pânzei
  2. Dimensiunea fiecărui dreptunghi
  3. Poziția fiecărui dreptunghi

Cu cât soluția este cu atât mai bine! Sunt destul de blocat pe asta și nu într-adevăr știu de unde să înceapă.

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

Noroc

Întrebat 08/07/2010 la 13:23
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
2

Liniile care nu sunt paralele între ele sunt de gând să se intersecteze la un moment dat. Se calculează pantele fiecare linie și apoi determina ce linii nu vor intersecta cu.

Începeți cu asta, și apoi să vedem cum să-l optimizeze. Nu sunt sigur cum este reprezentat datele dvs. și nu pot vedea imaginea.

Utilizarea pante este o verificare egalitate simplu, care, probabil, înseamnă că puteți profita de sortare a datelor. De fapt, puteți crea, probabil, doar un set de pante distincte. Va trebui să dau seama cum să reprezinte datele astfel încât cele două pante ale aceluiași dreptunghi nu sunt luate în considerare ca intersectându.

EDIT: Stai .. cum pot două dreptunghiuri ale căror margini merge la infinit nu se intersecteze? Dreptunghiuri sunt practic două linii care sunt perpendiculare una pe cealaltă. nu ar trebui să însemne că se intersectează întotdeauna cu o alta în cazul în care aceste linii sunt extinse la infinit?

Publicat 08/07/2010 la 13:35
sursa de către utilizator

voturi
6

Doar crea un set de intervale pentru fiecare dintre X și axa Y. Apoi , pentru fiecare nou dreptunghi, vezi dacă există intervale care se intersectează în X sau axa Y. Vezi aici pentru o modalitate de punere în aplicare seturi interval.

În primul exemplu, intervalul setat pe axa orizontală ar fi { [0-8], [0-8], [9-10] }, cât și pe verticală:{ [0-3], [4-6], [0-4] }

Aceasta este doar o schiță, am abstras multe detalii aici (de exemplu, de obicei, s-ar putea cere un set interval / pom „care se suprapun intervalele de aceasta“, în loc de „intersecta asta“, dar nimic nu greu de realizat).

Editați | ×

Vă rugăm să urmăriți acest curs MIT legate (este un pic cam lung, dar absolut worths). Chiar dacă a găsi soluții mai simple (decât implementarea unui arbore rosu-negru augmentată), este bine să cunoască ideile din spatele acestor lucruri.

Publicat 08/07/2010 la 13:36
sursa de către utilizator

voturi
1

atâta timp cât nu a menționat limba pe care a ales pentru a rezolva problema, i se va folosi un fel de cod pseudo

ideea este că, dacă totul este în regulă, atunci o colecție de sortat margini dreptunghi de-a lungul unei axe ar trebui să fie o secvență de intervale care nu se suprapun.

  1. numărul de toate dreptunghiurile tale, atribuindu-le ID-uri individuale
  2. a crea o colecție gol arbore binar (BTC). această colecție ar trebui să aibă o metodă de a insera un nod întreg cu informații :: inserați BTC (cheie, valoare)
  3. pentru toate dreptunghiuri, face:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. acum itera prin BTC (acest lucru va da un ordin sortată)

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 - repetați pașii 2,3,4 pentru coordonate rect.left și rect.right

Publicat 08/07/2010 la 13:49
sursa de către utilizator

voturi
1

Îmi place această întrebare. Aici este să încercați mea pentru a obține pe ea:

Dacă este posibil: Crearea unui poligon din fiecare dreptunghi. Se tratează fiecare margine ca o linie de lungime maximă , care trebuie să fie prinsă. Utilizați un algoritm de tăiere pentru a verifica starea vremii sau nu o linie intersectează cu alta. De exemplu , acesta: Linia Clipping

Dar tineti minte: Dacă găsiți o intersecție, care se află în poziția de vârf, sa una validă.

Publicat 08/07/2010 la 14:01
sursa de către utilizator

voturi
1

Iată o idee. In loc de a crea fiecare dreptunghi cu (x, y, width, height), ei instanțiați cu (x1, y1, x2, y2), sau cel puțin să - l interpreteze aceste valori date lățimea și înălțimea.

În acest fel, puteți verifica ce dreptunghiuri au o structură similară xsau yvaloare și asigurați - vă că dreptunghiului corespunzător are aceeași valoare secundară.


Exemplu:

Dreptunghiurile le-ați dat au următoarele valori:

  • Piața 1: [0, 0, 8, 3]
  • Cadranul 3: [0, 4, 8, 6]
  • Piața 4: [9, 0, 10, 4]

În primul rând, vom compara Square 1la Square 3(fără coliziune):

  • Comparați valorile x
    • [0, 8] la [0, 8] Acestea sunt exact la fel, astfel încât nu există nici o legătură.
  • Comparați valorile y
    • [0, 4] la [3, 6] Nici unul dintre aceste numere sunt similare, astfel încât acestea nu sunt un factor

În continuare, vom compara Square 3la Square 4(coliziune):

  • Comparați valorile x
    • [0, 8] la [9, 10] Nici unul dintre aceste numere sunt similare, astfel încât acestea nu sunt un factor
  • Comparați valorile y
    • [4, 6] la [0, 4] Dreptunghiurile au numărul 4 în comun, dar 0! = 6, prin urmare, există o coliziune

Prin știu că știm că o coliziune va avea loc, astfel încât metoda se va termina, dar vă permite să evalueze Square 1și Square 4pentru unele claritate în plus.

  • Comparați valorile x
    • [0, 8] la [9, 10] Nici unul dintre aceste numere sunt similare, astfel încât acestea nu sunt un factor
  • Comparați valorile y
    • [0, 3] la [0, 4] Dreptunghiurile au numărul 0 în comun, dar 3! = 4, prin urmare, există o coliziune

Lasă-mă să știu dacă aveți nevoie de detalii suplimentare :)

Publicat 08/07/2010 la 14:08
sursa de către utilizator

voturi
0

Heh, luând intervalele de suprapunere a răspunde la extrem, pur și simplu să determinați toate intervalele distincte de-a lungul axei x și y. Pentru fiecare linie de tăiere, face o căutare limită superioară de-a lungul axei se va reduce în funcție de valoarea inițială a intervalului lui. Dacă nu găsiți un interval sau intervalul nu se intersectează linia, atunci este o linie validă.

Partea ușor este dificil de a realiza că liniile de tăiere valide, nu se va intersecta limitele unui dreptunghi de-a lungul unei axe, astfel încât să puteți combina intervale care se suprapun într-un singur interval. Sfârșești cu o matrice simplu sortat (pe care le completați în O (n)) și un O (log n) de căutare pentru fiecare linie de tăiere.

Publicat 09/07/2010 la 07:53
sursa de către utilizator

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