TEXTE SUR COURBE DE BEZIER

amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009 - 7 déc. 2011 à 12:05
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 - 11 déc. 2011 à 12:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53839-texte-sur-courbe-de-bezier

cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
11 déc. 2011 à 12:01
Bonjour,

1) A Cirec (msg du 10/12/2011 16:38:37)

Dans FireFox: "Menu Outils -> Options -> avancé -> Onglet Réseau et cliquer sur vider le cache".
... OK, merci, ça vient de marcher.

"c'était pas utile de re déposer l'image à partir du moment ou je t'annonce que je vois ta nouvelle capture on pouvait en déduire que le problème ne vient plus du serveur mais de ton PC".
... Mille excuses : je n'en ai vraiment pris conscience que suite à la remarque de Caribensila sur les Fichiers Internet Temporaires.

2) A Caribensila (msg du 10/12/2011 18:19:33)

"Je me rends compte que l'effet du vent sur un drapeau est physiquement plus compliqué que ce que je pensais à priori"
... Bin on pouvait s'y attendre bigre ! Cela se passe dans les trois dimensions avec les turbulences.
... Tu verras bien avec le carré Hermès de Jeanne quad le vent se lèvera.

- "La vitesse du mouvement doit être réglable par l'utilisateur" : OK.

- "Ton mouvement n'effectue que la moitié du cycle".
... Ah bon ? Cela me surprend car j'avais placé temporairement un showMessage('vu '+intToStr(i)); dans la boucle d'affichage pour vérifier que le cycle est complet. (et dans la boucle de pré-calcul j'avais placé un appel à TracePoignees pour voir les poignées et m'assurer que le points de contrôle reprennent bien leur position initiale.
... Par contre j'envisage de modifier la procedure bVentClick() pour une raison supplémentaire : Actuellement si un positionne un texte très incliné le mouvement est très chaotique. Dans ce cas je vais faire en sorte que les points de contrôle des tangentes se déplacent sur une droite perpendiculaire à celle qui relie les points d'ancrage du texte.

3) A Cirec et à Caribensila : Concernant toutes vos autre remarques concernant les "fuites" : Vu leur nombre j'en ai fait un copier-coller pour les prendre en compte.

4) A Cirec (msg du 10/12/2011 18:22:28)

"il ne manque plus qu'une indentation plus standard ...parce que là franchement c'est hard de te lire et il y a quand même plusieurs chose qu'il faudrait changer/améliorer ... à mon avis"
- "indentation plus standard" : Pourtant j'ai pris soin de ne placer qu'une seule instruction par ligne.
- "plusieurs choses qu'il faudrait changer/améliorer" : Bin, lesquelles pendant que je suis sur les modifications.

"la gestion des poignées ainsi que le déplacement du texte devraient être intégrées à TTexteSurBezier" : OK, je vais faire de mon mieux.

5) A Cirec (msg du 10/12/2011 19:49:18)

- "ReportMemoryLeaksOnShutdown := True" : Super, merci pour l'info.
- "il faut bien faire la différence entre assignation et égalité" : OK, je l'avais déjà appris à mes dépends avec un Bmp2:=Bmp1 qui me modifiait obstinément mon Bmp1 alors que je ne voulais modifier que le Bmp2.

Bon, sur ce j'ai du pain sur la planche.

A+.

A+.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 déc. 2011 à 19:49
@Caribensila:
« - T'es le Davy Crockett de Delphifr, et c'est pour ça que je t'appelle "chef" ! ;)»

j'irai pas jusque là ... mais merci ^^
à partir de Delphi2006 (TurboDelphi) tout le monde peut en faire autant.
pour ce faire il suffit d'ajouter une ligne dans le *dpr ...
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

et quand on quitte l'application si de la mémoire alloué par le programme n'est pas libéré une message box s'affiche indiquant quels objets ou autres pointeurs ... ensuite y a plus qu'à chercher les Create/Free GetMem/FreeMem et de vérifier les quels manquent.

Sinon une petite précision pour Pseudo3:

il faut bien faire la différence entre assignation et égalité.
Ex.
BMP1, BMP2 : TBitmap;

Bmp1.Assign(Bmp2);
est différent de
Bmp1 := Bmp2;

dans le premier cas Bmp1 copie toutes les valeurs de Bmp2 (il en fait un clone) mais ce sont deux objets bien distincts (Bmp1 et Bmp2 pointent sur adresses mémoire différentes)
modifier Bmp1 n'affecte pas Bmp2

alors qu'avec
Bmp1 := Bmp2;
Bmp1 devient Bmp2 (ils pointent sur la même adresse mémoire)
modifier Bmp1 revient à modifier Bmp2
en faisant Bmp1.Free; ce sont les deux qui sont touchés
et si on avait pas libéré Bmp1 avant ... on a une fuite de mémoire.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 déc. 2011 à 18:38
@Cirec
« j'ai traqué les dernières fuites !!! »

- T'es le Davy Crockett de Delphifr, et c'est pour ça que je t'appelle "chef" ! ;)
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 déc. 2011 à 18:22
Voilà ...
comme t'as fais du bon travail en appliquant les modifications ...
j'ai traqué les dernières fuites !!!

dans l'unité uManipBMP2.pas:
on peut supprimer le code du destructeur puisqu'on on a plus d'objet à détruire ...

type
TTexteSurBezier = class(TObject)
...
constructor Create(inbPointsC: integer); // Pré-calcul coeffs Bézier
// *** la surcharge du contructeur est devenue inutile depuis
// qu'on a plus d'objet à détruire (Fonte)
{destructor Destroy; override;}
...

// *** supprimé depuis qu'on a plus à détruire l'objet Fonte
{destructor TTexteSurBezier.Destroy;
begin
//if Assigned(Fonte) then Fonte.Free;
inherited Destroy;
end;}

explication:
il restait une fuite sur TFont et celle-ci se trouvait dans la procédure TTexteSurBezier.Add
begin
...
// *** supprimé car inutile et source de fuite de mémoire
//Fonte:=tFont.Create;
//Fonte.Assign(iFonte);
// *** remplacé par:
Fonte := iFonte;
...
end;

Dans l'unité uTexteSurBezier.pas
c'est la procédure FormCloseQuery qui est modifié.
elle causait une double fuite
la première sur BMPUndo qui n'était pas libéré
et une double sut BMPUndo & TexteSurBezier si on essayait de fermer avec VentActif à True:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if VentActif then
begin
showmessage('Stopper le "vent" avant de quitter, sinon V.A.');
CanClose := False; // *** < empeche la fermeture
end
// *** ajouté pour éviter une fuite si on essayait de fermer avec Vent Actif
else
begin
CanClose := True;
TexteSurBezier.Free;
BmpUndo.Free; // *** Manquait
end;
end;

et un petit + pour que l'animation de vent soit une peu plus fluide:
repeat
for i := 0 to 14 do
begin
image1.Picture.Bitmap.assign(BD[i]);
if (not bVent.Down) then
goto Stop;
Application.ProcessMessages;
end;
// *** ajouté pour un effet aller - retour plus naturel
for i := 14 downto 0 do
begin
image1.Picture.Bitmap.assign(BD[i]);
if (not bVent.Down) then
goto Stop;
Application.ProcessMessages;
end;
until (not bVent.Down);

c'est pas grand chose mais ça fait un peu moins cyclique.

il ne manque plus qu'une indentation plus standard ...
parce que là franchement c'est hard de te lire et il y a quand même plusieurs chose qu'il faudrait changer/améliorer ... à mon avis
en dehors de la vitesse et donc de l'affichage ... la gestion des poignées ainsi que le déplacement du texte devraient être intégrées à TTexteSurBezier.

ça n'en reste pas moins du bon travail. Bravo
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 déc. 2011 à 18:19
« Et le nouvel "effet de drapeau dans le vent" : Et-ce-que cela correspond à ton souhait ??? »
Ca vient, mais ce n'est pas encore ça... :)
Je me rends compte que l'effet du vent sur un drapeau est physiquement plus compliqué que ce que je pensais à priori.
En particulier, le dernier point de contrôle de la Bézier n'est pas fixe et le mouvement des deux points centraux est plus compliqué qu'une simple translation linéaire.
Bon! Jeanne m'a prêté un vieux carré Hermès pourri que j'ai planté dans le jardin... et j'attends que le vent se lève.

Sinon, j'ai 2-3 observations, si tu le permets :
1) La vitesse du mouvement doit être réglable par l'utilisateur. Parce que chez moi, avec mon Pentium à 3.0 GHz, c'est plutôt l'effet Parkinson.
Dans "procedure TForm1.bVentClick(Sender: TObject);", un Sleep(TrackBar.Position) fera l'affaire, je pense.

2) Ton mouvement n'effectue que la moitié du cycle. Un point de contrôle doit certes descendre (comme tu as fait), mais il doit aussi
remonter pour reprendre sa position initiale et terminer sa période.

3) Pour les fuites à Cirec ;) , après DeleteObject(), j'appellerais un FreeAndNil() car le pointeur qui ne pointe plus sur rien ne semble pas libéré par DeleteObject (je parle sous le contrôle de Cirec qui me rectifiera si je me trompe).
Et il me semble que tu ne libères pas tes objets au bon endroit et que ça cafouille un peu de ce côté (mais je ne suis pas allé plus loin)...
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 déc. 2011 à 16:38
Dans FireFox:
Menu Outils -> Options -> avancé -> Onglet Réseau et cliquer sur vider le cache.

c'était pas utile de re déposer l'image à partir du moment ou je t'annonce que je vois ta nouvelle capture on pouvait en déduire que le problème ne vient plus du serveur mais de ton PC

pour le reste j'ai pas encore regardé le nouveau code.
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
10 déc. 2011 à 15:36
Re-bonjour,

1) "Dans "option internet" de ton navigateur, il faut supprimer les "Fichiers Internet Temporaires" (même pour tes sites Web favoris, éventuellement)."

... je n'ai pas trouvé d'"option internet" dans FireFox, par contre je viens de supprimer ce qui restait dans le dossier "Temporary Internet Files" et en revenant ici je trouve toujours l'ancienne capture.
Mais si je comprends bien le serveur a dû planquer quelque part chez moi l'ancienne capture qu'il me re-affiche à chaque connexion. Donc c'est moins grave, l'essentiel est que la nouvelle capture soit au moins visible pour ceux qui passent par ici.

2) Et le nouvel "effet de drapeau dans le vent" : Et-ce-que cela correspond à ton souhait ???

A+.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 déc. 2011 à 15:10
« En outre je n'ai toujours pas réussi ni à supprimer l'ancienne capture ni à la remplacer. (!!!???)»

Dans "option internet" de ton navigateur, il faut supprimer les "Fichiers Internet Temporaires" (même pour tes sites Web favoris, éventuellement).
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
10 déc. 2011 à 14:47
Re-bonjour,

Bon, j'ai apporté les modifications souhaitées pour le "vent" et les remarques de Cirec (voir le nouveau Zip).

Par contre je n'ai pas trouvé la cause des fuites :
21 - 28 bytes: TBrush x 1
29 - 36 bytes: TPen x 1, Unknown x 2
37 - 44 bytes: TFont x 1
car dans la procedure AffTexteIncliBordeTexture() je libère bien bien la mémoire avec :
DeleteObject(NouvFonte);
DeleteObject(NouvPen);
DeleteObject(NouvBrush);

En outre je n'ai toujours pas réussi ni à supprimer l'ancienne capture ni à la remplacer. (!!!???)

A+.
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
10 déc. 2011 à 11:39
Bonjour,

1) A Caribensila : "Ouais... Mais ce n'est pas l'effet auquel je pensais... :)"
... Je dirais même plus : mon effet de "drapeau" dans le vent ressemble plutôt à un effet de "planche en bois" dans le vent car un drapeau ondule également transversalement.

"Moi, je mettrais P1 et P4 sur la même ligne horizontale (fixes).
Les 2 points de contrôle P2 et P3 entre P1 et P4, mais l'un au dessus et l'autre en dessous de la ligne P1P4.
Puis faire descendre l'un tandis que l'autre remonterait.
Et recommencer ce mouvement en sens inverse pour terminer le cycle.
Tu vois ce que je veux dire ?"
Il y a une petite embrouille : J'ai deux points d'ancrage PC[0] et PC[3] qui sont les points de contrôle les plus proches du texte et les deux points de contrôle PC[1] et PC[2] et la droite PC[0]-PC[1] est la tangente à la courbe au début du texte et la droite PC[3]-PC[2] la tangente du côté de la fin du texte.
Si je mets les deux points d'ancrage fixes sur la même ligne horizontale le début et la fin du texte resteront fixes et que je mets les deux points de contrôle à mi-chemin sur la même verticale et que je les fais monter/descendre : bin oui ça donne un effet d'ondulation : OK, pigé.

2) A Cirec :

2.1) "voilà la nouvelle capture est présente." :
... Bizarre, moi je vois ici toujours l'ancienne capture avec l'ancienne interface alors que sur la nouvelle il y a 6 GroupBox.(!!!???)
Je m'apprêtais justement à refaire une tentative en deux mises à jour :
- une première pour essayer de supprimer l'ancienne,
- et une seconde pour ajouter la nouvelle,
car j'ai l'impression qu'il y a truc qui empêche de pouvoir faire un remplacement en une seule passe.

2.2) "S.T.P. pourrais-tu changer le PAnsiChar la ligne 131 de l'unité "uManipBMP2.pas" par un PChar !!!" : OK, ça marche.

2.3) Pb de fuites de mémoire : OK, je vais voir où j'ai oublié de libérer des trucs. Pour l'instant je sais seulement que la fuite causée par l'exécution du "Vent" est sans doute due à la procedure TForm1.bVentClick() à la ligne for i:=0 to 13 do BD[i].free; alors que BD est un array [0..14] et qu'avec i:=0 to 14 do BD[i].free; j'avais obtenu une Violation d'Accès inexpliquée.

Bon, je vais voir ce que je peux faire pour corriger cela, et en plus il faut que je potasse pour convertir mon Object en class(TObject).

A+.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 déc. 2011 à 18:06
...
bis
bon alors je ne sais comment le dire mais il va falloir faire quelque chose pour ces fuites ... pour l'instant au lieu de diminuer elles augmentent (voir rapport ci-joint)
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

21 - 28 bytes: TBrush x 1
29 - 36 bytes: TPen x 1, Unknown x 2
37 - 44 bytes: TFont x 1
61 - 68 bytes: TBitmap x 2
101 - 108 bytes: TBitmapCanvas x 1
117 - 124 bytes: TBitmapImage x 2
149 - 156 bytes: Unknown x 1

---------------------------
OK
---------------------------

ps cette fuite est causé uniquement par un seul texte et l'exécution du "Vent"

avec un simple texte sans rien d'autre il reste:
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

61 - 68 bytes: TBitmap x 1
117 - 124 bytes: TBitmapImage x 1

---------------------------
OK
---------------------------
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 déc. 2011 à 17:56
...
La dernière version avec effet vent tourne à 47% de charge CPU chez moi ...
avec les valeurs par défaut de l'interface
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 déc. 2011 à 17:49
re,

voilà la nouvelle capture est présente.

S.T.P. pourrais-tu changer le PAnsiChar la ligne 131 de l'unité "uManipBMP2.pas" par un PChar !!! Merci.

TextOut(dc,X,Y,PansiChar(Texte),length(texte));
en
TextOut(dc,X,Y,PChar(Texte),length(texte));

PChar est un type générique propre au Pascal
De Delphi2 à Delphi2007 ...
Char pointe sur AnsiChar
PChar pointe sur PAnsiChar
à partir de Delphi2009 ...
Char pointe sur WideChar
PChar pointe sur PWideChar.

et du coup le code ne compile plus dès D2009 (provoque une erreur de compatibilité Char - AnsiChar)
et juste en remplaçant le PAnsiChar par un PChar tu rends ton code compatible avec toutes les versions de Delphi (de D2 à XE2) et surtout ça ne modifie en rien l'exécution de ton code.

@Caribensila:
oui tu as certainement raison ... pourquoi s'en priver puisque c'est possible ... mais ce que je voulais surtout faire comprendre par mon message c'est qu'on peut faire beaucoup de calculs dans un minimum de temps (temps réel) sans pré-calculs.
Pour info le cube tournant à fond sur les 3 axes ne me consomme pas plus de 4% et tourne la plupart du temps à 2% d'utilisation CPU !!!
et ce sur un vieux P4 3.2Ghz 2G0 de ram !!!!
c'est loin d'être un cheval de course hein :p

donc si le code est bien optimisé on peut le faire en temps réel et une fois ceci atteint on peut alors encore gagner du temps en utilisant les pré-calculs.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 déc. 2011 à 17:27
@Pseudo3
Ouais... Mais ce n'est pas l'effet auquel je pensais... :)

Moi, je mettrais P1 et P4 sur la même ligne horizonntale (fixes).
Les 2 points de contrôle P2 et P3 entre P1 et P4, mais l'un au dessus et l'autre en dessous de la ligne P1P4.
Puis faire descendre l'un tandis que l'autre remonterait.
Et recommencer ce mouvement en sens inverse pour terminer le cycle.

Tu vois ce que je veux dire ?
L'effet serait bien plus joli !
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
9 déc. 2011 à 16:02
Re-bonjour,

A Caribensila : Tu dis "C'est un peu étonnant, ça..." à propos de la suppression de l'ombre qui ne fait pas gagner un temps perceptible »
... Je n'avais pas chronométré la durée des pré-calculs et comme elle était supportable dans les deux cas j'ai laissé AvecOmbre à True par défaut.
Mais je viens de chronométrer, et pour les valeurs par défaut de l'interface (Texte, tailles, etc) le pré-calcul sans ombre a pris 438 ms et 1234 ms avec l'ombre. (Pentium III à 1,13 GHz)

A+.
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
9 déc. 2011 à 15:30
Re-bonjour,

A Cirec : Je viens de faire ici ma mise à jour provisoire suite à l'ajout de l'effet "drapeau dans le vent" avec un nouveau Zip et une nouvelle capture *.jpg avec un autre nom.
Quize minutes plus tard j'ai téléchargé depuis ici vers chez moi le Zip et j'ai constaté, au vu de son contenu, que Zip téléchargeable d'ici a effectivement été remplacé.
Mais en revenant ici je vois que l'ancienne capture n'a toujours pas été remplacée par la nouvelle ... mais peut-être que le cache du serveur n'est pas mis à jour en même temps que le nouveau Zip ???

A+.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 déc. 2011 à 15:19
Bonjour Cirec,
Tu as sûrement raison. Cependant, dans le cas de ton cube tournoyant, l'utilisateur est censé pouvoir changer les vitesses de rotation de chaque axe en temps réel. Tu étais donc obligé de tout faire par calcul.
Ici, le mouvement du drapeau est cyclique et ce serait gâcher du temps CPU de faire ce genre de calcul qui n'est pas très productif, au final.
Mais bon ! C'est un peu affaire de conviction...

@Pseudo3
« Je pensais que la suppression de l'ombre ferait gagner de la vitesse mais le gain n'est pas perceptible »
C'est un peu étonnant, ça...
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
9 déc. 2011 à 15:02
Bonjour,

A Cirec : "pour la capture soit tu renseignes une nouvelle image soit tu coches la case pour supprimer l'existante.
Mais pas les deux à la fois. Puis il faut patienter jusqu'à ce que le cache du serveur soit mis à jour".
... OK, merci.

... Pour ce qui est du remplacement de mon Object par class(TObject) je vais potasser le sujet et quand j'aurais fini je re-ferai une mise à jour.

A Caribensila et à Cirec : Pour l'effet "drapeau dans le vent" le pré-calcul qui ne comporte pas d'appels à Application.ProcessMessages m'a permis de multiplier la vitesse par environ deux vu que l'image du drapeau flottant utilise 2 fois la même image sur un aller-retour. Je pensais que la suppression de l'ombre ferait gagner de la vitesse mais le gain n'est pas perceptible.
Et comme ça marche je fais ici une mise à jour provisoire en attendant que j'arrive à convertir mon Object en class(TObject).

A+.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 déc. 2011 à 14:02
@Pseudo3:

pour la capture soit tu renseignes une nouvelle image soit tu coches la case pour supprimer l'existante.
Mais pas les deux à la fois. Puis il faut patienter jusqu'à ce que le cache du serveur soit mis à jour.

ATTENTION:
Tu confonds le MOT RÉSERVÉ "Object" et le TYPE "TObject"
TObject ... T pour Type

ensuite ton problème de passage de paramètre est dû à ta manière de créer l'objet "TTexteSurBezier"

toi tu fais:
TexteSurBezier.Create(30); // c'est faux

alors qu'il faut faire:
TexteSurBezier := TTexteSurBezier.Create(30);

et ne pas oublier de surcharger la déclaration du destructeur avec "override"
et d'ajouter dans le code du destructeur à la fin:
inherited Destroy;

comme dans mon précédent post.

@Caribensila:
salut,

je ne pense pas qu'un pré-calcul soit indispensable.
rappelles-toi le cube tournoyant, le nombre de calculs de positions des 6 faces (une image par face) sur 3 axes en temps réel ... et malgré ça j'arrivais à produire deux effets stroboscopiques consécutifs sur l'intervalle vitesse (Min-Max).

le tout c'est de s'affranchir des composants tel que "TImage", de rationaliser le code et de dessiner dans un "buffer". Il faut aussi supprimer tous les appels à "Application.ProcessMessages;" qui sont à proscrire si on veut de la vitesse car ils sont très couteux (voilà pour les grandes lignes)

@++
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
8 déc. 2011 à 19:23
« pour éviter que ça ne donne l'effet "drapeau ramant dans la choucroute". »

Le plus simple et le plus efficace est de pré-calculer une quinzaine d'images pour une fréquence de 1Hz, par exemple (l'image du drapeau flottant utilisant 2 fois la même image sur un aller-retour de 1 seconde avec 30 images/seconde).
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
8 déc. 2011 à 17:28
Bonjour,

Voilà j'ai tenu compte des remarques les plus importantes sauf que je n'ai pas encore réussi à remplacer mon type object par une class(TObject) pour des problèmes de passage de paramètres.

Comme j'ai également ajouté quelques autres fonctionnalités j'ai donc fait une mise à jour ici.

Par contre lors de cette mise à jour la nouvelle capture n'a pas été enregistrée ici malgré trois tentatives de remplacement !!!??? et j'ai bien coché la case pour supprimer l'ancienne capture mais elle s'obstine à rester, or pour les nouvelles fonctionnalités j'ai été obligé de modifier l'interface.
Comment faire afin que la nouvelle capture apparaisse ici ???

A+.
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
8 déc. 2011 à 10:57
Bonjour,

A Caribensila : Merci pour la note. "Mais tu peux optimiser les calculs dans la procedure tTexteSurBezier.CoordonneesB en supprime r1,r2,r3,r4 et en calculant X et Y directement" :
... Ok je vais voir ce que ça donne.

"l'effet "drapeau dans le vent" serait bluffant !"
... Effectivement, mais faudrait à cet effet trouver une ruse de sioux pour éviter que ça ne donne l'effet "drapeau ramant dans la choucroute".
... Mais peut-être que quelqu'un a une idée ???

A Cirec : Globalement d'accord avec tes remarques.
... mon utilisation du type object au lieu de class(tObjeect) n'est qu'une histoire de vieille habitude mais je vais essayer de changer.

"... et si tu veux pouvoir revenir sur chaque instance il faudra prévoir un tableau de "TTexteSurBezier"" :
... Mon objectif était de rester aussi simple que possible pour les raisons suivantes :
... le code est dans la rubrique débutants,
... pour obtenir un look intéressant on est forcé d'utiliser une fonte de grande taille ce qui fait que le code est utilisable juste pour ajouter un joli titre ou une ou deux légendes sur une image ou une photo, en conséquence de quoi je pense que la possibilité offerte de pouvoir positionner puis figer un premier texte et ensuite de positionner le deuxième texte par rapport au premier devrait suffire dans la plupart des cas. Non ?

Sur ce, j'ai du pain sur la planche pour effectuer les modifs.

En tous cas merci pour toutes les remarques.

A+.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 déc. 2011 à 22:17
Salut,

je rejoins mes camarades pour dire que c'est beau mais ...

Avant de donner une note il va falloir corriger un gros bug.
En fait il y en a plusieurs mais certain sont liées entres eux.

Le principale étant une fuite de mémoire "37 - 44 bytes: TFont" qui augmente à chaque nouveau texte déposé sur la fiche. (Lié au code de l'objet "TTexteSurBezier" et à son utilisation)

Deuxièmement à chaque changement de texture on a un "TBitmap" & "TBitmapImage" non libérés. (Lié à une mauvaise utilisation de la fonction "ImgFile_To_Bmp" voir plus bas **)

Troisièmement le "Unknown" est certainement lié à ce qui suit.

Il faut revoir le code de l'objet "TTexteSurBezier".
Il y a des incontournables dans la création d'objet qu'il faut respecter sinon on s'expose à diverses problèmes ... (je ne rentrerais pas dans le détail (ce serait trop long mais il existe de très bons tutoriels sur net à ce sujet)

La définition de TTexteSurBezier devrait être:
type
TTexteSurBezier = class(TObject)

ensuite, quand on débute avec la création d'objets, il est recommandé d'utiliser "correctement" le constructeur et le destructeur hérité de l'ancêtre. (ici "TObject")

type
TTexteSurBezier = class(TObject)
private
// Params Bézier :
nbPointsC: integer; // Nb de points calculés pour chaque courbe de Bezier
...
public
// TObject étant l'objet de base il n'a pas de constructeur hérité donc pas besoin de mettre "override"
constructor Create(inbPointsC: integer);
destructor Destroy; override;
end;

...
implementation
...
constructor TTexteSurBezier.Create(inbPointsC: integer);
begin
...
end;

destructor TTexteSurBezier.Destroy;
begin
if Assigned(Fonte) then
Fonte.Free;
inherited Destroy;
end;

et dans le code on l'utilise comme tout autre objet:
var
TexteSurBezier: TTexteSurBezier;
begin
TexteSurBezier := TTexteSurBezier.Create(30);
...
et à la fin:
TexteSurBezier.Free;
end;
et ce pour pour chaque nouvel objet (Texte) créé.
et si tu veux pouvoir revenir sur chaque instance il faudra prévoir un tableau de "TTexteSurBezier"
et les libérer, au plus tard, avant de quitter l'application.

ps: on n'invoque jamais le destructeur d'un objet directement
TexteSurBezier.Destroy; // <-- est faux

Destroy est appelé en interne par la méthode Free:
TexteSurBezier.Free;

** Pour utiliser correctement une fonction renvoyant un objet il faut garder une trace de ce dernier sous peine de fuite de mémoire.

function ImgFile_To_Bmp(const NomFichierImg: string): TBitmap;

si je fais ceci :
ImgTexture.Picture.Bitmap.Assign(ImgFile_To_Bmp(FileName));
pan ... j'ai une fuite (une double même) ... parce que l'objet retourné est perdu et ne sera jamais libéré.

en revanche si je fais:
var
BMP: TBitmap;
begin
BMP := ImgFile_To_Bmp(FileName);
ImgTexture.Picture.Bitmap.Assign(BMP);
BMP.Free;
end;

je garde une trace de l'objet créé dans BMP et je le libère à la fin.

vous me direz on pourrait faire ceci alors:
ImgTexture.Picture.Bitmap := ImgFile_To_Bmp(FileName);

ben non si Picture.Bitmap contenait déjà une image on aura une fuite. le bon code serait:
if Assigned(ImgTexture.Picture.Bitmap) then
ImgTexture.Picture.Bitmap.Free;
ImgTexture.Picture.Bitmap := ImgFile_To_Bmp(FileName);

voilà je rentre pas plus dans les détails pour l'instant.

ci-dessous je joins le rapport sur les différentes fuites.
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

37 - 44 bytes: TFont x 4
61 - 68 bytes: TBitmap x 3
117 - 124 bytes: TBitmapImage x 3
149 - 156 bytes: Unknown x 1

---------------------------
OK
---------------------------
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
7 déc. 2011 à 17:57
Aaah ! Que c'est beau une Bézier avec son équation paramétrée !

Mais tu peux optimiser les calculs dans la procedure tTexteSurBezier.CoordonneesB en supprime r1,r2,r3,r4 et en calculant X et Y directement.
Ce sera certes moins lisible, mais une fois au point, ce n'est pas le genre de procédure qu'on revisite beaucoup.

Très beau travail : 10/10 !

PS: En animant tout ça, l'effet "drapeau dans le vent" serait bluffant !
Mais c'est une autre paire de manches et je n'ose pas le demander. ;)
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
7 déc. 2011 à 13:49
Merci !!!

Pour info : je suis en-train d'ajouter quelques fonctions, pour une mise à jour prochaine.

A+.
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
7 déc. 2011 à 12:52
très beau travail !
10/10
amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009
7 déc. 2011 à 12:05
Joli !!!
Rejoignez-nous