|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : avril 2007 Messages : 21 ![]() |
Bonjour voici ma fonction qui a pour but de faire la rotation de ma matrice! C'est à dire que je dois faire la rotation d'une image de format .ppm! Mais avec mon code ci dessous j'arrive à faire la rotation mais ce n'est que la moitié de l'image qui est tourné de 90°! Et je ne comprends pas pourquoi!
//colonne signifie le nombre de colonnes //ligne signifie le nombre de lignes Je n'ai pas tout mon code mtn ici sur cette rubrique car cela prendrai trop de place mais j'espère que vous avez assez d'informations pour comprende mon problème et pouvoir m'aider! Le code pour ecrire fonctionne car j'ai deja réaliser d'autres fonctions et cela va tres bien! Merci d'avance le code de ma fonction: Code :
|
||
|
|
00
|
|
|
#2 | ||||
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 434 ![]() |
- Même si le résultat y ressemble, ce n'est pas une rotation de 90° que tu as programmé puisque tous les pixels pour lequel i=j n'ont pas bougé. Une rotation laisse un seul point invariant : le centre de rotation
- Pour ton problème qui doit se produire si l'image n'est pas carrée, Code :
Code :
Par exemple, si l'image a 5 lignes et 10 colonnes, temp a 10 lignes et 5 colonnes " utiles" (les colonnes suivantes de temp sont à zéro puisque temp est semble t-il en global) et je recopie 5 lignes et 10 colonnes de temp dans l'image. L'image finale n'est modifiée que pour le carré de 5 lignes et 5 colonnes , le reste est noir. si l'image a 10 lignes et 5 colonnes, temp a 5 lignes et 10 colonnes " utiles" (les lignes suivantes de temp sont à 0) et je recopie 10 lignes et 5 colonnes de temp dans l'image. L'image finale n'est modifiée que pour le carré de 5 lignes et 5 colonnes , les 5 colonnes suivantes sont celles de l'image originale et le reste est noir. |
||||
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 581 ![]() |
pour une rotation d'iage, TOUJOURS partir du pixel résultat et calculer le pixel d'origine, à cause des erreurs d'arrondi qui donneront dans l'image résultante des pixels noirs, et donc des effets de moirés.
De plus, ton image résultante n'aura pas les mêmes dimensions, et aura des angles noirs (sauf si tu coupes après coup). Donc, primo, calculer les coordonnées limites (par calcul de la rotation des sommets, puis min/max des (x,y) pour ces 4 points. Secondo, il est plus pratique de faire une fonction qui effectue la rotation. Tertio, par conséquent, il faut écrire, pour effectuer une rotation Angle de l'image originale IM1, pour un résultat dans IM2 : Code :
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 21 ![]() |
Tout d'abord merci à vous deux de votre aide!
|
|
|
00
|
|
|
#5 | ||||
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 434 ![]() |
- Pour une rotation de 90°(sens direct, inverse des aiguilles d'une montre) , le pixel de coordonnées (colonne = col, ligne = lg) doit se déplacer en (colonne = lg, ligne = N-1-col). (N = nombre de colonnes de l'image)
- Pour une rotation de 90°(sens inverse, sens des aiguilles d'une montre) , le pixel de coordonnées (colonne = col, ligne = lg) doit se déplacer en (colonne = M-1-lg, ligne = col). (M = nombre de lignes de l'image) - L'image après rotation est de dimension M colonnes x N lignes - Tu utilises un tableau intermédiaire dans ton programme. Ce n'est pas obligatoire : La rotation peut se faire sur place, sans tableau intermédiaire MxN , mais nécessite de traiter simultanément 4 points : En rotation de sens direct Code :
Code :
|
||||
|
|
00
|
|
|
#6 |
|
Membre émérite
![]() Inscription : juin 2006 Messages : 1 117 ![]() |
En algèbre linéaire on parle de 'matrice transposée', c'est ce qui correspond à une rotation de 90 degrés dans le sens horaire, additionnée d'un retournement 'miroir' horizontal (symétrie horizontale).
|
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 581 ![]() |
je signale juste que je donnais la rotation générale d'une image....
Et sans buffer intermédiaire....
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#8 |
|
Membre émérite
![]() Inscription : juin 2006 Messages : 1 117 ![]() |
Est-ce que ça veut dire que chaque point de l'image est indexé par ses coordonnées cartésiennes et non par ses coordonnées dans un tableau C à deux dimensions ?
|
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 581 ![]() |
que veux-tu dire par là ?
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#10 |
|
Membre émérite
![]() Inscription : juin 2006 Messages : 1 117 ![]() |
En fait comme vous parliez d'algorithme général de rotation : la rotation "générale" pour moi serait celle d'angle quelconque, pour laquelle le carré (l'image) prendrait place dans un cercle.
Comme l'image est une matrice au sens strict, c'est difficile de faire des rotations pour un angle quelconque. La rotation de 90° serait celle où les lignes viennent prendre les places des colonnes, mais c'est limité car la rotation ne prend effet que pour des valeurs d'angle de rotation bien déterminée. La rotation d'angle quelconque doit utiliser une autre indexation, une indexation spatiale. C'est comme sous paint : un trait de largeur 1 pixel ne sera plus lissé si on lui fait prendre une orientation de 10° par rapport à l'horizontale. Donc j'ai du mal à imaginer la construction d'une image qui aurait effectuée une rotation d'angle quelconque si elle ne prenait pas place dans un repère plus vaste (rotation de la matrice principale située dans une matrice plus vaste composée de zéros en calculant les déplacements par des formules trigonométriques comme celles que vous utilisez dans votre code, ce qui implique l'utilisation d'un repère cartésien en x, y pour les déplacements) |
|
|
00
|
|
|
#11 | ||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 581 ![]() |
Citation:
La rotation présentée ci-dessus est une rotation de n'importe quel angle, de 0 à 360 degrés, centrée au centre de l'image intiale. Comme le résultat de la rotation d'une matrice sera un paralléllipède, il sera tronqué suivant l'angle si on garde la dimension originale, ou au contraire si on calcule (comme je le fais dans le code ci-desus) les nouvelles dimensions, il y aura du noir à certains endroits (coins noirs plus ou moins grands). Citation:
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
||
|
|
00
|
|
|
#12 |
|
Membre émérite
![]() Inscription : juin 2006 Messages : 1 117 ![]() |
? Juste qu'un carré qui tourne sur son centre de gravité tient dans un cercle. Il faut prévoir des pixels en plus suivant mon idée.
en fait vous déplacez les pixelsvers la gauche par exemple pour les points en dessous du centre du carré, et vers la droite pour les points au dessus du centre du carré, c'est à dire vous étirez les sommets opposés d'après ce que j'ai compris, puis vous tronquez les bords pour que l'ensemble forme à nouveau une image carrée ? Oui, le nombre de pixels est réduit à ce moment. un parallélépipède est un volume de l'espace, un "pavé". un parallélogramme est un polygone dont les côtés opposés sont parallèles deux à deux. Je crois que vous vouliez parler d'un parallélogramme. |
|
|
00
|
|
|
#13 | |||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 581 ![]() |
Citation:
Par contre, pour le reste : Citation:
Mais avoir une image circulaire... Jamais vu un buffer étant circulaire, à moins de n'avoir qu'une liste chaînée de points. Citation:
Il n'y a aucune translation, uniquement une rotation... Mais comme justement la dimension change, il faut tout faire par rapport au centre (nouveau et ancien).
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|||
|
|
00
|
|
|
#14 |
|
Membre émérite
![]() Inscription : juin 2006 Messages : 1 117 ![]() |
D'accord ...
Je disais cercles pour restreindre. Je sais qu'il n'est pas possible d'avoir des buffers circulaires. Les pavés empilés tiennent moins de place que les billes Pour le repère cartésien, je voulais surtout parler d'un repère étendu, donc d'un buffer qui n'aurait pas strictement la taille de l'image, sans quoi on ne peut faire que des rotations de 90°, et encore avec des matrices (image) carrées. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com