Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Zoom + Rotation avec MonochromeLib !
Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Zoom + Rotation avec MonochromeLib !

Posté le 11/02/2015 22:26

Et voilà je viens d'achever un défi personnel : écrire une fonction pour agrandir ou réduire une image !

Les fonctions sont incorporées dans la libraire de PierrotLL comme toutes les autres que nous connaissons bien.
Il suffit de modifier MonochromeLib.c et MonochromeLib.h par les nouveaux en pièce jointe.

Les prototypes :
void ML_bmp_or_zoom(const unsigned char *bmp, int x, int y, int width, int height, float zoom_w, float zoom_h);
void ML_bmp_and_zoom(const unsigned char *bmp, int x, int y, int width, int height, float zoom_w, float zoom_h);
void ML_bmp_xor_zoom(const unsigned char *bmp, int x, int y, int width, int height, float zoom_w, float zoom_h);

void ML_bmp_or_rotate(const unsigned char *bmp, int x, int y, int width, int height, int angle);
void ML_bmp_and_rotate(const unsigned char *bmp, int x, int y, int width, int height, int angle);
void ML_bmp_xor_rotate(const unsigned char *bmp, int x, int y, int width, int height, int angle);


Explications :
Il suffit de mettre en argument :
- le pointeur du bmp
- la position en x
- la position en y
- la largeur d'origine
- la hauteur d'origine

- le coefficient de zoom en largeur ou l'angle de rotation
- le coefficient de zoom en hauteur

Infos complémentaires :
Les coefficients de zoom sont des flottants compris entre 0 et l'infini
- entre 0 et 1 -> réduction
- plus de 1 -> agrandissement
L'angle est un entier en degrés et dans le sens trigo (anti-horaire)
L'image tourne autour de son centre.

Nouvelle version du zoom 3x plus rapide !

Ajout des rotations

La librairie est toujours libre.

Aussi simple que ça !

Fichier joint


1, 2, 3 Suivante
Dark storm Hors ligne Labélisateur Points: 11541 Défis: 176 Message

Citer : Posté le 11/02/2015 22:30 | #


Sympa

Ça marche aussi pour l'agrandissement avec un zoom compris entre 0 et 1 ?
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Legolas Hors ligne Ancien rédacteur Points: 3266 Défis: 104 Message

Citer : Posté le 11/02/2015 22:30 | #


Oh !
Super ! Je pense que ça va être très utile, il faudrait demander à PierrotLL s' il veut bien mettre cette lib en téléchargement !
Mes programmes
Cacher les programmes
Mes défis
Cacher les défis



Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Citer : Posté le 11/02/2015 22:32 | #


Oui, ça fonctionne. Et je n'ai pas précisé mais pour n'importe quelle taille d'image d'origine, pas seulement de 8x8 ou 16x16
Dark storm Hors ligne Labélisateur Points: 11541 Défis: 176 Message

Citer : Posté le 11/02/2015 22:40 | #


Ça peut faire des anim' sympas tout ça

L'interpolation se fait comment ?
Et le partage se fait sous les mêmes conditions (license libre) ?
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Citer : Posté le 11/02/2015 22:46 | #


Je sais pas trop, c'est du maison.
La licence est toujours libre (j'ai précisé dans le poste principal)

Ajouté le 11/02/2015 à 22:52 :
J'ai modifié l'ordre des arguments dans les prototypes, c'est plus logique comme ça et ça s'accord au reste.
Dark storm Hors ligne Labélisateur Points: 11541 Défis: 176 Message

Citer : Posté le 11/02/2015 22:53 | #


Je me suis permit de mettre en valeur la license
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Dodormeur Hors ligne Ancien rédacteur Points: 3964 Défis: 82 Message

Citer : Posté le 11/02/2015 23:26 | #


C'est de l'interpolation linéaire ou du nearest neighbor?
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 11/02/2015 23:30 | #


Dodormeur, le linéaire a peu de raison d'exister sur du monochrome!

Ajouté le 11/02/2015 à 23:31 :
Et au lieu de republier une énième version de ML, j'aurais plutôt fait une sorte d'extension!

Ajouté le 11/02/2015 à 23:35 :

   nb_w_z = ceilf(width_z / 8.0); // est un peu lourd pour initialiser un int
// J'aurais fait
nb_w_z /= 8;
// ou
nb_w_z >>=3;



i_zoom/8 //pourait être calculable en dehors de la deuxième boucle, de même pour i/8
Dodormeur Hors ligne Ancien rédacteur Points: 3964 Défis: 82 Message

Citer : Posté le 11/02/2015 23:58 | #


Eiyeron a écrit :
Dodormeur, le linéaire a peu de raison d'exister sur du monochrome!


Pas d'accord, si jamais on a par exemple un zoom de 50%, et qu'un pixel blanc est pris, mais que ses trois voisins sont noir, le nearest neighbor va le faire blanc, alors que l'interpolation sera noire. Donc même si je suis d'accord que l'interpolation n'a pas autant d’intérêt qu'en couleur, elle en a quand même.
Suffit de voir le zoom dans snow wars pour se rendre compte que le nearest neighbor peut parfois faire des résultats assez moyens, alors qu'un algo d'interpo rendrait déjà mieux
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Citer : Posté le 12/02/2015 00:29 | #


C'est du nearest neighbor Dodormeur
L'interpolation me parait assez lourd sinon :/

Eiyeron : Si ça marchait, j'aurais fait comme ça
nb_w_z correspond au nombre d'octets qu'il faut pour écrire width_z bit, seulement si width_z = 9, il faut 2 octets, or width_z / 8 = 1.
Et si on fait with_z / 8 + 1 = 2 ok, mais si width_z = 8 alors ça renvoie 2 et ça marche pas.
Il existe surement une formule plus propre par contre.
...
(réflexion)
...
(width_z + 7) / 8 !!!
Lephenixnoir Hors ligne Administrateur Points: 20990 Défis: 143 Message

Citer : Posté le 12/02/2015 09:18 | #


Ninestars a écrit :
Il existe surement une formule plus propre par contre.

Il existe toujours ce genre de formules propres

Ninestars a écrit :
(width_z + 7) / 8

J'allais le dire (sinon y'a ((z-1)>>3)+1 pour éviter les overflow), en attendant si tu parles de vitesse utilise au moins le décalage de bits ^^' , gcc optimise peut-être mais le compilo du SDK non.
Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Citer : Posté le 30/06/2015 22:12 | #


Changement total du code, maintenant les fonctions écrivent directement dans la vram et ne calculent plus avec les flottants.
Nouvelle version 3x plus rapide !

(Je ne devrais pas avoir trop de repproches concernant l'optimisation cette fois ci )
Lephenixnoir Hors ligne Administrateur Points: 20990 Défis: 143 Message

Citer : Posté le 01/07/2015 07:54 | #


Tu utilises quel algorithme pour zommer ? Du nearest-neighbor ou tu te bases sur quelques pixels adjacents ?
Dark storm Hors ligne Labélisateur Points: 11541 Défis: 176 Message

Citer : Posté le 01/07/2015 09:51 | #


Ninestars a écrit :
C'est du nearest neighbor Dodormeur
L'interpolation me parait assez lourd sinon :/


Ajouté le 01/07/2015 à 09:51 :
Enfin je pense que ça n'a pas changé, juste optimisé.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir Hors ligne Administrateur Points: 20990 Défis: 143 Message

Citer : Posté le 01/07/2015 10:15 | #


Ok, merci
Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Citer : Posté le 01/07/2015 11:54 | #


Effectivement c'est toujours ça

Ajouté le 03/07/2015 à 23:15 :
Nouveau : ajout des fonctions pour tourner une image !
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1238 Défis: 54 Message

Citer : Posté le 31/07/2015 21:19 | #


Hum, c'est peut être moi qui suis un gros boulet, mais je n'arrive pas à trouver le fichier avec les fonctions pour faire les rotations...
-florian66- Hors ligne Ancien rédacteur Points: 2370 Défis: 20 Message

Citer : Posté le 31/07/2015 21:54 | #


Un admin devrai peut être mettre un lien de la librairie dans le snippet associé

Toi aussi je ne le trouve pas non plus
In Arch, I trust ! And you ?
Ninestars Hors ligne Membre Points: 2413 Défis: 22 Message

Citer : Posté le 01/08/2015 00:31 | #


Effectivement, ce n'est pas le bon dossier. Il me semblaut pourtant avoir mis le bon. Bref je corrige ça

Ajouté le 01/08/2015 à 00:33 :
C'est bon, le fichier est à jour.
Az Hors ligne Membre de CreativeCalc Points: 537 Défis: 10 Message

Citer : Posté le 01/08/2015 07:25 | #


Salut, Y a-t il un moyen d’obtenir les coordonnés d'un point précis du sprite avant et après rotation (le même pixel)? Pour des collisions par exemple.. En fait je crois savoir mais j'attend de voir une réponse

Ouais question bête... j'ai trouvé
1, 2, 3 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 36 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd