Considérez cette mise en page: P>
1 2 3 4 +-------------+ +---- -------+ |#############| |### ######| |#############| |### ######| | +--+ | |###+ +######| |###| |######| |###| |######| |###+ +------| | +--+ |### |######| |### |######| +---- +------+
8 Réponses :
Pardonnez-moi pour écrire dans les codes:
for(int y = 0; y < rows; y++){ for(int x = 0; x < columns; x++){ // (x, y) would be the current space if(checkEmptySpace(x,y)){ // empty space found } } }
(Notez que 3.1 est le même algorithme, uniquement avec inversé libre / bloqué inversé et avec des coordonnées différentes) p>
Dans votre exemple, il apparaît que vous ne demandez pas d'exclure le chevauchement (par exemple 1 et 2 avoir le segment supérieur à gauche), donc peut-être que cela conviendra à vos besoins: P>
Divisez l'espace en rectangles en fonction des coins identifiés par les espaces occupés. P> Li>
formez les "rectangles de base" en extensionnant les segments de ligne de ces coins aux bords de l'espace entier. P> li>
Utilisation de tout ordre systématique (par exemple de haut en bas, de gauche à droite): P>
3.1. Sélectionnez un rectangle de base et étendez-le autant que possible avec d'autres rectangles de base qui ont un côté en commun. P>
3.2. Former l'ensemble de tous (uniques) de tels rectangles étendus. P> li> ol>
Notez que cette recherche / repose sur les «rectangles de base» à partir de l'étape 2 et non sur le point point sur tout l'espace. La performance devrait donc être bien meilleure. P>
Je sais que c'est une vieille réponse, mais y a-t-il une chance que vous puissiez clarifier votre réponse? Je l'ai lu quelques dizaines de temps et je ne peux toujours pas comprendre le processus :). J'ai surtout des problèmes avec la signification de: "Rectangles basés sur les coins" et "l'étendent avec d'autres rectangles de base".
public class Program { public static char occuppied; public static char vacant; public static char mark; public static void main(String[] args) { int rows = 7; int cols = 11; mark = 'A'; occuppied = '#'; vacant = '-'; char[][] matrix = new char[rows][cols]; setRect(matrix, vacant, 0, 0, rows, cols); setRect(matrix, occuppied, 3, 3, 2, 2); setRect(matrix, occuppied, 5, 5, 2, 6); print(matrix); for(int i = 0; i < rows; i++) { int colstart = 0; while((colstart = nextEmptyCol(matrix[i], colstart)) != -1) { int width = 0; for(int j = colstart; j < cols; j++) { if(matrix[i][j] == vacant) width++; else break; } if(width == 0) continue; int height = 1; outer: for(; height + i < rows; height++) for(int n = 0; n < width; n++) { if(matrix[i + height][colstart + n] == occuppied) break outer; } System.out.println("width = " + width + ", height = " + height); setRect(matrix, mark, i, colstart, height, width); print(matrix); mark++; } } } public static void setRect(char[][] matrix, char c, int startrow, int startcol, int numrows, int numcols) { for(int i = 0; i < numrows; i++) for(int j = 0; j < numcols; j++) matrix[startrow + i][startcol + j] = c; } public static void print(char[][] matrix) { int rows = matrix.length; int cols = matrix[0].length; for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) System.out.print(matrix[i][j] + " "); System.out.println(); } for(int i = 0; i < cols; i++) System.out.print("=="); System.out.println(); } public static int nextEmptyCol(char[] row, int start) { for(int i = start; i < row.length; i++) if(row[i] == vacant) return i; return -1; } }
Je travaille avec des flotteurs. À cause de cela, je ne peux pas itérer sur tous les pixels.
Oups ... Je n'ai vu ce commentaire qu'après avoir écrit le code Java ... l'a ajouté quand même.
Je pense que considérer que juste des conrères n'obtiendront pas les meilleurs mathématiques.
Par exemple, dans l'image ci-dessous, la section "R" est la meilleure correspondance, mais ne commence dans aucun coin. P> < Pré> xxx pré> p>
Dans ce cas Oui, j'avais besoin du rectangle en haut à gauche.
Vous n'avez pas compris, le rectangle fabriqué avec "R" n'est pas un rectangle occupé. C'est le plus grand rectangle
Voici l'algorithme que j'ai utilisé pour exactement le même cas: p>
Cela retournera une liste des rectangles d'espace vide forts>. p>
ESR.LEFT , créez un nouveau rectangle d'espace vide (NESR) avec nesr.right = o.left code> et ajoutez-le à la liste des ESR Les autres obstacles doivent vérifier les chevauchements. LI>
- Si
ESR.Right> O.Right code>, créez de nouveaux ESR, NESR.LEFT = O.Right code> li>
- Si
ESR.Bottom , crée de nouveaux ESR, nesr.top = o.bottom code> li>
- Si
ESR.TOP> O.Top code>, crée de nouveaux ESR, nesr.bottom = o.top code> li>
ol>
li>
ol>
li>
ol>
n.b: strong> ceci est une séquence de si, pas d'autre si. Ce qui signifie que vous créez jusqu'à 4 nouveaux ESR pour chaque chevauchement. P>
Explication forte>: h1>
- Nous créons un seul "rectangle vide vide", puis nous vérifions chaque obstacle connu de savoir si elle se chevauche (elle le fait évidemment, car ce rectangle couvre tout em>). Li >
- Le premier obstacle divisera le premier rectangle d'espace vide en jusqu'à 4 rectangles plus petits. Serré pour ne pas le chevaucher. Li>
- Le 2e obstacle vérifiera alors s'il chevauche l'un des rectangles d'espace vide nouvellement créés. Chaque rectangle qu'il chevauche est divisé plus loin, en jusqu'à 4 nouveaux rectangles. Aucun de ceux-ci ne chevauchera l'obstacle 1 ou l'obstacle 2. Li>
- Nous continuons d'aller comme ça jusqu'à ce que chaque obstacle ait été vérifié. Li>
- Nous nous retrouvons avec une liste d'espaces vides qui ne chevauchent pas d'obstacles. Nous aurons certainement des chevauchements cependant. Li>
ul>
Algorithme de retour d'espace libre en blocs de plus grands rectangles possibles - non?
Quelle serait exactement l'entrée de votre algorithme?
@Romain Muller: une liste des rectangles occupés et de la taille de la page.
Les rectangles d'entrée "occupés" peuvent-ils se chevaucher?
@Mar: Oui, ils peuvent, mais c'est quelque chose qui peut être enlevé facilement. Par conséquent, vous n'avez pas à en tenir compte.
@ Georgschölly Pouvez-vous partager un algorithme plus détaillé pour le problème ci-dessus et comment éliminer les chevauchements des plus grands rectangles?
@Emptydata: Je suis désolé, je ne me souviens pas des détails exacts du problème que j'essayais de résoudre, c'était il y a plus de 5 ans. J'ai accepté une réponse, alors je suppose que cela a résolu mon problème.