Forums Casio - Vos tutoriels et astuces

Index du Forum > Vos tutoriels et astuces > Zoom + Rotation avec MonochromeLib !
Ninestars
Hors ligne
Membre
Points: 2129
Défis: 22
Message
Posté le 11/02/2015 22:26

Zoom + Rotation avec MonochromeLib ! :

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



Pages: 1, 2, 3 | Suivante

Dark storm
Hors ligne
Membre d'honneur
Points: 10694
Défis: 174
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
Páranÿe quetë Quendya
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: 2129
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
Membre d'honneur
Points: 10694
Défis: 174
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
Páranÿe quetë Quendya
Ninestars
Hors ligne
Membre
Points: 2129
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
Membre d'honneur
Points: 10694
Défis: 174
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
Páranÿe quetë Quendya
Dodormeur
Hors ligne
Ancien rédacteur
Points: 3928
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: 5513
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: 3928
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: 2129
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: 13181
Défis: 136
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.
----------------------------------
Rise.
Ninestars
Hors ligne
Membre
Points: 2129
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: 13181
Défis: 136
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 ?
----------------------------------
Rise.
Dark storm
Hors ligne
Membre d'honneur
Points: 10694
Défis: 174
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
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 13181
Défis: 136
Message
Citer : Posté le 01/07/2015 10:15 | #
Ok, merci
----------------------------------
Rise.
Ninestars
Hors ligne
Membre
Points: 2129
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: 1232
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...
----------------------------------
N'attendez pas qu'il n'y ait plus de miel : スススススススススススススススススススススススススス養蜂家スススススススススススススススススススススススススススススススススススス蜂家
-florian66-
Hors ligne
Ancien rédacteur
Points: 2296
Défis: 19
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: 2129
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: 536
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é
----------------------------------
"An Ye Harm None, Do What Ye Will"


Pages: 1, 2, 3 | Suivante

Index du Forum > Vos tutoriels et astuces > Zoom + Rotation avec MonochromeLib !

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

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd