TEXTE SUR COURBE DE BEZIER

Signaler
Messages postés
54
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
21 décembre 2009
-
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021
-
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

Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
45
@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.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
@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" ! ;)
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
45
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
Afficher les 27 commentaires