Calculer le plus grand rectangle dans une rotation du rectangle
J'essaie de trouver la meilleure façon de calculer le plus grand (dans la région) rectangle qui peut être contenue à l'intérieur d'une rotation du rectangle.
Quelques images devraient aider (je l'espère) dans la visualisation de ce que je veux dire:
La largeur et la hauteur de l'entrée du rectangle est donné, et si est l'angle de rotation. La sortie rectangle n'est pas tourné ou incliné.
Je vais en bas de la longwinded route que je ne suis même pas sûr si elle va gérer le cas du coin (no pun intended). Je suis certain qu'il y est une solution élégante à ce. Des conseils à donner?
MODIFIER: La sortie rectangle points n'ont pas forcément besoin de toucher à l'entrée des rectangles à bords. (Merci à M. E)
- Par "le plus grand rectangle", entendez-vous l'un avec la plus grande superficie?
- oui, c'est ce que l'on entend. Je vais faire un edit...Merci.
- +1 pour les dessins 🙂
- Profenza la seule autre option était d'écrire trois mille mots...
- Est-il toujours existé? Je ne suis pas sûr qu'il fait. Esquisse d'une longue et mince rectangle et le faire pivoter.
- N'est-ce pas plus un problème de maths que une programmation on?
- E I Oui. Une sortie rectangle d'un seul pixel est ok.
- Je veux dire que dans un rectangle où chaque coin touche un côté du rectangle pivoté peut ne pas exister.
- doit la sortie rectangle avoir à ses côtés parallèles aux axes? c'est à dire. pouvez la sortie rectangle également être tourné?
- en parallèle aux axes. C'est pourquoi j'ai indiqué "ne pas faire pivoter ou de travers'.
- E ne pas totalement se vous, mais la pensée d'un mince rectangle "ligne", alors il pourrait y avoir plusieurs solutions. hmmm...
- regardez la photo ici: i.imgur.com/22yAQ.jpg , peut-être un peu plus de la rotation. Comment pouvez-vous adapter ce type d'un rectangle à l'intérieur de celui-ci?
- E, vous avez raison! donc je suppose que les points appartenant à la sortie rectangle n'ont pas à être sur l'entrée des rectangles à bords. Aurez à faire un pas dans la question.
- comment ce problème est-il différent de stackoverflow.com/questions/7245/... ?
- oui, que le Dr Dobb's article pourrait jeter quelque lumière sur ce problème. Si je serre mon problème dans cette structure de données, il serait probablement travailler. peut-être.
Vous devez vous connecter pour publier un commentaire.
Je suis juste venu ici à la recherche pour la même réponse. Après de frémir à la pensée de tant de mathématiques impliqués, j'ai pensé que je pourrais recourir à une demi-instruits deviner. Gribouille un peu je suis arrivé à l' (intuitive et peut-être pas entièrement exact) conclusion que le plus grand rectangle est proportionnelle à l'extérieur rectangle résultant, et de ses deux coins opposés se situent à l'intersection des diagonales du rectangle extérieur avec le côté le plus long de la rotation d'un rectangle. Pour les places, les diagonales et les côtés ferais... je pense que je suis assez heureux avec cela et il va maintenant commencer à brosser les toiles d'araignée de mon rusty trig compétences (pathétique, je sais).
Mise à jour mineure... Réussi à faire quelques calculs trigonométriques. C'est pour le cas lorsque la Hauteur de l'image est plus grande que la Largeur.
Mise à jour. Obtenu la chose entière de travail. Voici quelques code js. Il est connecté à un programme plus large, et la plupart des variables sont hors de la portée des fonctions et sont modifiés directement dans les fonctions. Je sais que ce n'est pas bon, mais je suis en utilisant ce dans une situation d'isolement, où il n'y aura pas de confusion avec d'autres scripts: rédigé
J'ai pris la liberté de nettoyage du code et en l'extrayant d'une fonction:
J'ai rencontré quelques problèmes avec le
gamma
-calcul, et l'a modifié pour tenir compte de la direction dans laquelle la boîte d'origine est la plus longue.-- Magnus Hoff
width > height
. J'ai corrigé et optimisé, il dans ma réponse.En essayant de ne pas rompre avec la tradition en mettant la solution du problème comme une image:)
Edit:
Troisième équations est faux. La bonne est:
3.w * cos(α) * X + w * sin(α) * Y - w * w * sin(α) * cos(α) - w * h = 0
À résoudre le système d'équations linéaires vous pouvez utiliser La règle de Cramer, ou Méthode de Gauss.
x1
ety1
doit être telle que l'égalitéw * cos(a) * x1 + w * sin(a) * y1 -w * w * sin(a) * cos(a) = 0
détient.h = ? w = ? and alpha = ?
.D'abord, nous prenons en charge le cas trivial où l'angle est égal à zéro ou à un multiple de pi/2. Puis le plus grand rectangle est le même que l'original rectangle.
En général, le rectangle intérieur dispose de 3 points sur les limites du rectangle extérieur. Si elle ne le fait pas, alors il peut être déplacé de façon que l'un des vertex sera sur le fond, et un sommet sera sur la gauche. Vous pouvez ensuite agrandir le rectangle intérieur jusqu'à ce que l'un des deux sommets restants atteint une limite.
Nous appelons les côtés du rectangle extérieur R1 et R2. Sans perte de généralité, nous pouvons supposer que R1 <= R2. Si nous appelons les côtés du rectangle intérieur H et W, nous avons alors que
Puisque nous avons au moins 3 points sur les frontières, au moins l'un de ces inégalités doivent être en fait une égalité. Nous allons utiliser la première. Il est facile de voir que:
et de sorte que la zone est
Nous pouvons prendre les dérivés wrt. H et de demander à être égale à 0:
De problèmes pour H et en utilisant l'expression de W, ci-dessus, nous constatons que:
En substituant ceci dans la deuxième inégalité devient, après quelques manipulations,
Le facteur sur le côté gauche est toujours au moins 1. Si l'inégalité est satisfaite, alors nous avons la solution. Si elle n'est pas satisfaite, alors la solution est la seule qui satisfasse à la fois les inégalités que les égalités. En d'autres termes: c'est le rectangle qui touche tous les quatre côtés du rectangle extérieur. C'est un système linéaire avec 2 inconnues, qui est facilement résolu:
En termes de coordonnées d'origine, on obtient:
R1 <= R2
. Si ce n'est pas le cas, vous devez faire des ajustements en conséquence.tan a + 1/tan a = 1/(sin a cos a)
et portant le dénominateur de l'autre côté.Modifier: Mon Mathematica réponse ci-dessous est faux - j'étais à la résolution d'un problème légèrement différent de ce que je pense que vous êtes vraiment se demander.
Pour résoudre le problème, vous êtes vraiment se poser, je voudrais utiliser l'algorithme suivant(s):
Sur le Maximum de Vide Rectangle Problème
À l'aide de cet algorithme, désigner un nombre fini de points qui forment la frontière de la rotation de rectangle (peut-être 100 ou alors, et assurez-vous d'inclure les coins) - ce serait l'ensemble S il est décrit dans le papier.
.
.
.
.
.
Dans un souci de postérité, j'ai quitté mon premier post ci-dessous:
L'intérieur du rectangle avec la plus grande zone sera toujours le rectangle où le moyen inférieur coin du rectangle (le coin près de l'alpha sur votre schéma) est égale à la moitié de la largeur du rectangle extérieur.
J'ai un peu triché et utilisé Mathematica pour résoudre l'algèbre pour moi:
De ce que vous pouvez voir que la superficie maximale de l'intérieur du rectangle est égale à 1/4 de la largeur^2 * cosécante de l'angle de fois la sécante de l'angle.
Maintenant j'ai besoin de comprendre quelle est la valeur x du coin en bas pour cette condition optimale. À l'aide de la Résoudre fonction dans mathematica sur ma zone de formule, je reçois le texte suivant:
Qui montre que la coordonnée x du coin en bas est égal à la moitié de la largeur.
Maintenant, juste pour m'en assurer, je vais allez tester notre réponse empirique. Avec les résultats ci-dessous vous pouvez voir qu'en effet, le quartier le plus haut de tous mes tests (certainement pas exhaustive, mais vous obtenez le point), c'est quand le coin en bas de la valeur de x = la moitié de l'extérieur du rectangle de largeur.
@Andri ne fonctionne pas correctement pour l'image où
width > height
que j'ai testé.Donc, j'ai corrigé et optimisé son code par un tel moyen (avec seulement deux fonctions trigonométriques):
Mise à JOUR
Aussi j'ai décidé de poster la fonction suivante proportionnelle rectange calcul:
Ici est la façon la plus simple de le faire... 🙂
désolé de ne pas donner une dérivation ici, mais j'ai résolu ce problème en Mathematica il y a quelques jours et est venu avec la procédure suivante, qui non-Mathematica gens devraient être en mesure de lire. En cas de doute, veuillez consulter http://reference.wolfram.com/mathematica/guide/Mathematica.html
La procédure ci-dessous renvoie la largeur et la hauteur d'un rectangle avec un maximum de zone qui s'insère dans un autre rectangle de largeur w et de hauteur h qui a été tourné par alpha.
Coproc résolu ce problème sur un autre thread (https://stackoverflow.com/a/16778797) dans une manière simple et efficace. Il a également donné une très bonne explication et le code python là.
Ci-dessous il y a mon Matlab mise en œuvre de sa solution: