Riempimento dello spazio tra linee 2D casuali


23

Considera una regione (2D) piena di linee in modo casuale (figura seguente). Siamo interessati a riempire gli spazi vuoti tra le linee, inclusi quattro bordi di confine in un modo:

0- massimizzare la dimensione dei pacchi;
1- la forma dei pacchi di riempimento è allineata quadrata orizzontalmente o verticalmente;
2- la forma dei pacchi di riempimento è quadrata, ovvero allineamento rilassato ;
3- la forma dei pacchi di riempimento è qualsiasi quadrangolo. la nostra domanda originale

Quindi per ora ci sono tre diversi scenari.
Si noti che le linee sono del [x1,y1,x2,y2]set di punti del modulo , numeri reali.

[* * *] Le idee su possibili soluzioni / algoritmi / frammenti di codice / ecc. Sono più che benvenute.

inserisci qui la descrizione dell'immagine


Aggiornamento 1: potremmo gestire una soluzione per il primo caso: i
inserisci qui la descrizione dell'immagine
passaggi sono:
1- linee
2- rasterizzazione delle linee in una bitmap
3- ricerca nelle celle vicine per ogni cella del colore desiderato (cioè lo stesso colore) con una funzione obiettiva per massimizzare l'area, cioè il numero di celle.

Funziona bene ma copre solo il primo scenario ed è anche lento.


Aggiornamento 2:
abbiamo ipotizzato che il lettore abbia familiarità con il concetto di spazio-riempimento-piastrellatura. Puoi seguire il link per l'ispirazione. Tuttavia, nota che il nostro problema è diverso. Poiché non riempiamo lo spazio vuoto in modo casuale e non scegliamo le dimensioni in modo casuale. La soluzione dovrebbe essere iterativa. Per tutti i casi, non vi è alcun limite al numero di pacchi da montare. In effetti, spetta all'utente limitare il numero di iterazione, scegliendo ad esempio un'area minima per i pacchi. Ciò è evidente nell'esempio sopra riportato in cui abbiamo discretizzato le linee in pixel con dimensioni specificate. In altre parole, la procedura deve essere eseguita fino a quando l'intera area vuota viene riempita rispettando il criterio, ad esempio l'area massima dei pacchi.


Aggiornamento 3:
riepilogo:
una domanda è scoprire la distribuzione di blocchi "rock" intatti estraibili in una "miniera" fortemente fratturata. Questo potrebbe essere molto utile per molti aspetti, tra cui la progettazione di perforazione, la valutazione finanziaria, ecc
Descrizione:
Per una miniera di roccia decorativa (pietra) i prodotti che sono i blocchi di rocce intatte taglio come cubetti rettangolari il prezzo è strettamente dipendente alle dimensioni del bloccare. L'estrazione di un blocco da un'area adatta, cioè senza fratture maggiori, sarà desiderata se la quantità di parti rimanenti è la più piccola possibile. Di solito, i piccoli pezzi di roccia non hanno un valore economico relativamente e sono considerati rifiuti.
La domanda in questo post indaga soluzioni per questo tipo di problema.

Una vista matematica per il problema può essere dichiarata come segue:
2D: trova tutti i rettangoli che potrebbero essere estratti da una determinata regione 2D con alcune linee ottimizzate per dimensioni rettangolari maggiori possibili.
3D: trova tutti i cubi rettangolari che potrebbero essere estratti da una determinata regione 3D con alcuni sottopiani (meglio: poligoni) ottimizzati per la dimensione del blocco più grande possibile.


Poiché questo fa parte di una ricerca in corso, alcune delle domande poste nei commenti seguenti non hanno alcune risposte che possiamo fornire. Riteniamo che le informazioni fornite qui finora siano effettivamente sufficienti per ottenere un quadro generale del problema. Tuttavia, forniamo alcuni dettagli possibili per i benefici della comunità.
Puoi porre alcune restrizioni alla soluzione per la domanda finale, anche se riteniamo che sia sempre possibile aggiungerne altre in seguito. Ad esempio, segui questi: {caso 2D}
La migliore dimensione di un blocco (rettangolo economicamente ottimale) da estrarre nelle condizioni sopra menzionate, è 1x1 mdata 10x10 mper la regione nell'esempio. Questo è un vincolo definito in base al valore economico. La dimensione minima lavorabile per il taglio ecc., Sia0.15x0.15 m; quindi questo è il limite della seconda dimensione.
inserisci qui la descrizione dell'immagine
La figura sopra mostra la funzione del valore economico in base alla dimensione del blocco. Quindi, per questo caso particolare, ogni pezzo di roccia più piccolo di quello 0.15x0.15 mè solo uno spreco. Non ci saranno blocchi di dimensioni maggiori di quelle 1.7x1.7 mdovute a limiti operativi.


3
@RK - Non sono d'accordo. Ha già affermato chiaramente cosa stanno cercando. Sicuramente ci sono più soluzioni possibili, ma non c'è nulla che impedisca loro di essere utili e votati.
GIS-Jonathan,

1
Poiché questa è una domanda di algoritmo che può essere piuttosto pesante per la matematica, potresti provare - math.stackexchange.com
GIS-Jonathan,

1
Strettamente correlato: gis.stackexchange.com/questions/27303 . La presente domanda, come osserva @RK, non ha una risposta definitiva perché non è sufficientemente ben posta. Quanti rettangoli sono ammessi? Che cosa significa "massimizzare le dimensioni"? Si noti inoltre che questo non è un problema di "piastrellatura casuale": le linee determinano semplicemente, tramite il loro complemento, le aree che possono essere occupate; le soluzioni sarà sicuramente non essere casuale. Si noti inoltre che è immediatamente disponibile una semplificazione semplice: il problema può essere risolto separatamente all'interno di ciascun componente del complemento.
whuber

1
@whuber: Bene, un'applicazione a cui siamo interessati è scoprire la distribuzione di blocchi 'rock' intatti estraibili in una 'miniera' fortemente fratturata. Bene, GIS sembra promettente per questo problema, pensiamo. Abbiamo aggiunto anche questo alla domanda. Supponiamo che la comunità GIS possa beneficiare dell'idea per i loro altri problemi particolari correlati. Ad ogni modo, dipende da te se lo migra;)
Sviluppatore

4
Come suggerisce @whuber, questa non è davvero una domanda GIS (anche se non sono offeso dal fatto che sia stato chiesto qui). Avrai molta più fortuna a ottenere una risposta in un forum per la geometria computazionale o l'ottimizzazione.
Llaves

Risposte:


2

Ho un'idea di come lavori iterativamente da blocchi grandi fino a blocchi più piccoli usando FME (di Safe Software.) Per la cronaca, non lavoro per loro ma sembra lodare abbastanza il loro strumento ...

  1. Utilizzare "BoundingBoxReplacer" nell'area di interesse.
  2. Riproiettalo su un sistema di coordinate locale (per in seguito quando devi "affiancare" in piedi / metri).
  3. Buffer le linee con trasformatore "Buffer". Hai solo bisogno di una dimensione arbitraria, diciamo .01 ft / metri. Quello che stiamo cercando qui è un poligono della linea per il passaggio successivo.
  4. Aggiungi un trasformatore "piastrellista". Specificare una dimensione grande (stimata o meno) della piastrella in piedi o metri. Quello che stiamo facendo qui è piastrellare l'area di interesse in blocchi quadrati. A seconda del set di dati, iniziare in grande per ottenere davvero i valori anomali di grandi dimensioni.
  5. Aggiungi un trasformatore "Clipper". Quello che stiamo facendo qui è essenzialmente tagliare il set di dati per vedere quali tessere sono buone / cattive. Sull'output, i riquadri "Inside" sono troppo grandi. Tuttavia, le tessere "Esterne" sono abbastanza grandi e pronte per il taglio ...
  6. Ecco dove diventa complesso, ma non difficile ... Faremo il loop del trasformatore in modo da riutilizzare l'originale BoundingBox, ma elimineremo le aree che sono già pronte per il taglio. Quindi, aggiungi un clipper e instrada il Clipper come riquadri "Output" sull'output del clipper precedente. Ora abbiamo un singolo poligono pronto a funzionare di nuovo.
  7. Usa di nuovo il piastrellista, questa volta specificando una tessera più piccola. Ad esempio, se hai usato tessere da 100 metri in precedenza, prova 90 metri.
  8. Aggiungi un altro clipper, con il clipper di input come linee bufferizzate e il clippee di input come tessere più piccole come input.

Risciacqua e ripeti tutte le volte necessarie usando tessere più piccole ogni volta. Ho attaccato l'inizio di un banco di lavoro che userei come unico approccio.

Basato sulla descrizione (ben dettagliata), funzionerà solo con l'opzione 1 per ora. Senza dedicare troppo tempo ancora.

Ad ogni modo, questo è solo un approccio con cui vorrei iniziare almeno per filtrare il grano dalla paglia.

Esempio di tessere FME

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.