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
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é
Citer : Posté le 01/08/2015 07:31 | #
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..
Des collisions au pixel test sur des rotations... c'est beau l'innocence...
Citer : Posté le 01/08/2015 07:33 | #
j'ai pas parlé de pixel test! J'avoue y avoir pensé mais c'etais pas le choix final
Citer : Posté le 01/08/2015 07:38 | #
j'ai pas parlé de pixel test! J'avoue y avoir pensé mais c'etais pas le choix final
Alors qu'est-ce que c'est ? Un rectangle qui contient la version pivotée ? Un simple rectangle pivoté ? Un autre masque alpha ?
Citer : Posté le 01/08/2015 07:46 | #
Bah j'ai une piste et il me faut la position exacte des roues pour rester au dessus, mais étant donné que la piste est assez géométrique je n'ai pas besoin de pxl test pour tester si je suis dessus/dessous etc.. Il y a peut être plus simple mais je vois pas...
Citer : Posté le 01/08/2015 07:51 | #
Oh mais t'as pas besoin d'une telle complexité... ^^' Dans le pire des cas tu laisse une hitbox rectangulaire en réduisant un peu sa taille, même à 45 degrés ça ne gênera pas beaucoup !
Citer : Posté le 01/08/2015 07:56 | #
Mais que se passe-t il sur une cote? La voiture ne touche pas le sol? Cependant c'est peut être possible mais deux points sont plus facile a gérer non? et pour se rétablir avec la gravité il faut savoir dans quel sens elle penche.
Citer : Posté le 01/08/2015 08:03 | #
Mais que se passe-t il sur une cote?
Ah, tu es en vue de côté...
La voiture ne touche pas le sol? Cependant c'est peut être possible mais deux points sont plus facile a gérer non? et pour se rétablir avec la gravité il faut savoir dans quel sens elle penche.
Le problème c'est que pour gérer tous les cas c'est plus compliqué que ça : imagine un pic assez court pour que chacune des roues puisse être d'un côté, par exemple.
Je pense que la meilleure manière de gérer ça c'est dévoir en mémoire des portions de pente constantes sur des petites bandes de largeur et de s'en servir pour émuler la gravité et calculer la position des roues.
Citer : Posté le 01/08/2015 08:08 | #
Je vais... prendre le temps de comprendre la dernière phrase mais le sol est assez simple et fait de droites assez longues, pas de pics ni de trous si c'est ça qui cloche.
Citer : Posté le 01/08/2015 08:10 | #
Il faut quand même gérer les cas où les deux roues ne sont pas sur des pentes identiques : n'oublie pas que la voiture ne doit pas se déformer si tu gères les deux roues indépendamment
Citer : Posté le 01/08/2015 18:23 | #
Bon, mes points tournent dans le sens contraire... comment inverser le sens de rotation?
j'utilise ca:
BlackBackWheelX = (CarBlackPosX+10)-8*cos((3.14159265358979323846 / 180) *angle);
BlackBackWheelY = (CarBlackPosY+3)-8*sin((3.14159265358979323846 / 180) *angle);
BlackFrontWheelX = (CarBlackPosX+10)+8*cos((3.14159265358979323846 / 180) *angle);
BlackFrontWheelY = (CarBlackPosY+3)+8*sin((3.14159265358979323846 / 180) *angle);
}
et j'ai essayé M_PI mais ca ne fonctionnais pas
Citer : Posté le 01/08/2015 18:28 | #
Alors pas besoin de mettre autant de chiffres Az, une précision au milliardième de radian de sert pas trop 3.14 suffit
Ensuite pour inverser le sens il suffit me mettre -angle
Citer : Posté le 01/08/2015 18:30 | #
MERCI! . Youpi ça marche, je vais peut être avoir quelque chose de potable pour les CPC
Citer : Posté le 01/08/2015 18:34 | #
De rien, et t'as dû voir, quand t'es proche des 45 degrés d'inclinaison, les images pivotées sont un peu crados. Faudrait que je revois mon algo, en faisant l'inverse : au lieu de pendre un pixel du bitmap et l'afficher à l'écran, il vaut mieux choisir un pixel à l'écran et lui donner la bonne couleur, ça évite les trous :/
Citer : Posté le 01/08/2015 18:36 | #
J'ai vu mais franchement c'est deja mieux que tout plein de sprites! Dès que tu aura terminé je vais essayer de l'utiliser dans swing copters.
Citer : Posté le 02/08/2015 23:01 | #
Alors pas besoin de mettre autant de chiffres Az, une précision au milliardième de radian de sert pas trop 3.14 suffit
Même en astronomie on n'utilise pas plus de 20 décimales... là il en a mis 20 !
Et puis, ça ne se stocke pas ça, après 9/10 l'information est perdue... x)
Faudrait que je revois mon algo, en faisant l'inverse : au lieu de pendre un pixel du bitmap et l'afficher à l'écran, il vaut mieux choisir un pixel à l'écran et lui donner la bonne couleur, ça évite les trous :/
Ça, ça dépend : pour les agrandissements, oui, pour les réductions, c'est pas forcément le bon plan. Après, je ne sais pas pour les homothéties en général mais si tu pouvais avoir une fonction intelligente pour choisir à chaque fois ce serait pas mal !
Citer : Posté le 03/08/2015 01:15 | #
Et pourquoi ça ne serait pas le bon plan ? Je ne vois pas de raison à ce que ça se passe mal, ou du moins, moins bien.
Citer : Posté le 03/08/2015 09:49 | #
Et pourquoi ça ne serait pas le bon plan ? Je ne vois pas de raison à ce que ça se passe mal, ou du moins, moins bien.
Pour les réductions ? C'est pas assez ressemblant en général. Il manque trop de pixels (enfin, c'est ce que j'ai constaté).
Citer : Posté le 05/08/2015 23:04 | #
Sympa, je suis de loin, ça peut toujours être utile (MS4 ? )
Sinon, à quand la version avec anti-aliasing en niveaux de gris ? Pour peu que le moteur de Lephe devienne très fonctionnel (à priori j'ai confiance là-dedans), ça peut être cool
Citer : Posté le 06/08/2015 08:39 | #
Vous ne pouvez pas mettre un lien de cette nouvelle lib dans le snippet "MonochromeLib" ?
Ca éviterais de la chercher tous le temps
Citer : Posté le 06/08/2015 14:26 | #
C'est vrai que l'antialiasing en niveau de gris ça serait pas mal