Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

PictureBox layer(s)

13 réponses
Avatar
Jacquelin Hardy
Bonjour,

j'ai écrit un logiciel de cartes électroniques marines. Or cette carte
est regénérée très souvent, jusqu'à une fois par seconde.

Je voudrais que, par dessus la carte, soit dessiné un cercle d'azimuth
que la routine suivante (non optimisée) produit.

Ma question: est-ce que ce cercle d'azimuth pourrait rester sur la
PicttureBox en permanence, ie. sans avoir à le redessiner à chaque fois
que je regénère la carte ?

Merci

Jacquelin Hardy



Private Sub PicCarte_Click()

' une pictureBox carrée où le côté = hauteur de Form1
' une ShapeBox (circle)

Dim rayon, cpi

cpi = 0.01745329

picCarte.DrawWidth = 2
picCarte.FillStyle = vbSolid
picCarte.ScaleHeight = Form1.ScaleHeight
picCarte.ScaleWidth = picCarte.ScaleHeight

Shape1.Height = picCarte.ScaleHeight
Shape1.Width = picCarte.ScaleWidth
rayon = Shape1.Width / 2

For i = 0 To 350 Step 10
X1 = rayon + rayon * Cos(i * cpi)
Y1 = rayon - rayon * Sin(i * cpi)
X2 = rayon + (rayon + 20) * Cos(i * cpi)
Y2 = rayon - (rayon + 20) * Sin(i * cpi)
picCarte.Line (X1, Y1)-(X2, Y2)
Next i

For i = 5 To 355 Step 10
X1 = rayon + rayon * Cos(i * cpi)
Y1 = rayon - rayon * Sin(i * cpi)
X2 = rayon + (rayon + 10) * Cos(i * cpi)
Y2 = rayon - (rayon + 10) * Sin(i * cpi)
picCarte.Line (X1, Y1)-(X2, Y2)
Next i

For i = 0 To 359
X1 = rayon + rayon * Cos(i * cpi)
Y1 = rayon - rayon * Sin(i * cpi)
X2 = rayon + (rayon + 5) * Cos(i * cpi)
Y2 = rayon - (rayon + 5) * Sin(i * cpi)
picCarte.Line (X1, Y1)-(X2, Y2)
Next i
End Sub

10 réponses

1 2
Avatar
Jean-marc
Jacquelin Hardy wrote:
Bonjour,

j'ai écrit un logiciel de cartes électroniques marines. Or cette carte
est regénérée très souvent, jusqu'à une fois par seconde.

Je voudrais que, par dessus la carte, soit dessiné un cercle d'azimuth
que la routine suivante (non optimisée) produit.

Ma question: est-ce que ce cercle d'azimuth pourrait rester sur la
PicttureBox en permanence, ie. sans avoir à le redessiner à chaque
fois que je regénère la carte ?

Merci

Jacquelin Hardy



Hello,

Non, a ma connaisance, il faut redessiner.

Mais (outre le fait que je ne comprends pas tout ce que fait
ton code, en particulier l'usage de shape1), il est très
facile d'optimiser très très fort ce code.

Si le seul souci est un souci d'optimisation de cette routine,
alors c'est tout simple...


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
LE TROLL
Tiens, t'es vivant, ça tombe bien pour toi, et pour moi aussi, j'ai posé une
question, si tu veux la regarder... as-tu passé de bonnes vacances durant
ces 8 jours ?

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jean-marc" a écrit dans le message
de news: 4637573a$0$14239$
Jacquelin Hardy wrote:
Bonjour,

j'ai écrit un logiciel de cartes électroniques marines. Or cette carte
est regénérée très souvent, jusqu'à une fois par seconde.

Je voudrais que, par dessus la carte, soit dessiné un cercle d'azimuth
que la routine suivante (non optimisée) produit.

Ma question: est-ce que ce cercle d'azimuth pourrait rester sur la
PicttureBox en permanence, ie. sans avoir à le redessiner à chaque
fois que je regénère la carte ?

Merci

Jacquelin Hardy



Hello,

Non, a ma connaisance, il faut redessiner.

Mais (outre le fait que je ne comprends pas tout ce que fait
ton code, en particulier l'usage de shape1), il est très
facile d'optimiser très très fort ce code.

Si le seul souci est un souci d'optimisation de cette routine,
alors c'est tout simple...


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




Avatar
Jacquelin Hardy
Merci Jean-Marc,

>outre le fait que je ne comprends pas tout ce que fait
> ton code, en particulier l'usage de shape1)

Le code dessine 360 petites lignes sur la périphérie d'un cercle
(shape1) correspondant aux 360 degrés d'un cercle. Les dizaines de
degré sont des lignes + longues ainsi que tous les multiples de 5 degrés.

>Si le seul souci est un souci d'optimisation de cette routine,
> alors c'est tout simple...

Outre le fait que je pourais avoir une table de sinus et cosinus
calculée d'avance en "single", comment suggèrerais-tu une meilleure
optimisation ?

Merci

Jacquelin H.


Jean-marc a écrit :
Jacquelin Hardy wrote:
Bonjour,

j'ai écrit un logiciel de cartes électroniques marines. Or cette carte
est regénérée très souvent, jusqu'à une fois par seconde.

Je voudrais que, par dessus la carte, soit dessiné un cercle d'azimuth
que la routine suivante (non optimisée) produit.

Ma question: est-ce que ce cercle d'azimuth pourrait rester sur la
PicttureBox en permanence, ie. sans avoir à le redessiner à chaque
fois que je regénère la carte ?

Merci

Jacquelin Hardy



Hello,

Non, a ma connaisance, il faut redessiner.

Mais (outre le fait que je ne comprends pas tout ce que fait
ton code, en particulier l'usage de shape1), il est très
facile d'optimiser très très fort ce code.

Si le seul souci est un souci d'optimisation de cette routine,
alors c'est tout simple...




Avatar
Jean-marc
Jacquelin Hardy wrote:
Merci Jean-Marc,

outre le fait que je ne comprends pas tout ce que fait
ton code, en particulier l'usage de shape1)



Le code dessine 360 petites lignes sur la périphérie d'un cercle
(shape1) correspondant aux 360 degrés d'un cercle. Les dizaines de
degré sont des lignes + longues ainsi que tous les multiples de 5
degrés.
Si le seul souci est un souci d'optimisation de cette routine,
alors c'est tout simple...



Outre le fait que je pourais avoir une table de sinus et cosinus
calculée d'avance en "single", comment suggèrerais-tu une meilleure
optimisation ?



1) la table de sin et cos est une bonne idée si tu vas au bout de l'idée
en faisant carrément les calculs complets (multiplication et tout et tout)
2) Typer tes variables car les variants sont très lents
3) Utiliser LineTo et MoveToEx de l'API Windows va beaucoup plus vite

Pour exécuter ton code après optimisation, je fais 10.000 passages en
0.8 secondes, c'est à dire 800 ms pour 10.000 passages.
Par passage, ça fait 80 nanosecondes ce qui est très très peu, tu en
conviendras :-)

Il y a encore moyen de gagner à droite et à gauche en évitant de faire
plusieurs tours de boucles, mais ce n'est pas nécessaire ici, amha.

Voici pour les API:

Private Type PointAPI
X As Long
Y As Long
End Type

Private Declare Function LineTo& Lib "gdi32" (ByVal hdc As Long, ByVal X As
Long, ByVal Y As Long)
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As
Long, ByVal Y As Long, lpPoint As PointAPI) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long,
ByVal hdc As Long) As Long

et pour l'utilisation:

Dim x1 As Single, y1 As Single
Dim p As PointAPI


Call MoveToEx(picCarte.hdc, x1, y1, p)

Call LineTo(picCarte.hdc, x1, y1)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jacquelin Hardy
Merci bien Jean-Marc,

j'ai mis tes conseils (Utiliser LineTo et MoveToEx)en appli., et ça
roule très bien.

Bye

Jacquelin H

Jean-marc a écrit :
Jacquelin Hardy wrote:
Merci Jean-Marc,

outre le fait que je ne comprends pas tout ce que fait
ton code, en particulier l'usage de shape1)


Le code dessine 360 petites lignes sur la périphérie d'un cercle
(shape1) correspondant aux 360 degrés d'un cercle. Les dizaines de
degré sont des lignes + longues ainsi que tous les multiples de 5
degrés.
Si le seul souci est un souci d'optimisation de cette routine,
alors c'est tout simple...


Outre le fait que je pourais avoir une table de sinus et cosinus
calculée d'avance en "single", comment suggèrerais-tu une meilleure
optimisation ?



1) la table de sin et cos est une bonne idée si tu vas au bout de l'idée
en faisant carrément les calculs complets (multiplication et tout et tout)
2) Typer tes variables car les variants sont très lents
3) Utiliser LineTo et MoveToEx de l'API Windows va beaucoup plus vite

Pour exécuter ton code après optimisation, je fais 10.000 passages en
0.8 secondes, c'est à dire 800 ms pour 10.000 passages.
Par passage, ça fait 80 nanosecondes ce qui est très très peu, tu en
conviendras :-)

Il y a encore moyen de gagner à droite et à gauche en évitant de faire
plusieurs tours de boucles, mais ce n'est pas nécessaire ici, amha.

Voici pour les API:

Private Type PointAPI
X As Long
Y As Long
End Type

Private Declare Function LineTo& Lib "gdi32" (ByVal hdc As Long, ByVal X As
Long, ByVal Y As Long)
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As
Long, ByVal Y As Long, lpPoint As PointAPI) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long,
ByVal hdc As Long) As Long

et pour l'utilisation:

Dim x1 As Single, y1 As Single
Dim p As PointAPI


Call MoveToEx(picCarte.hdc, x1, y1, p)

Call LineTo(picCarte.hdc, x1, y1)



Avatar
Jean-marc
Jacquelin Hardy wrote:
Merci bien Jean-Marc,

j'ai mis tes conseils (Utiliser LineTo et MoveToEx)en appli., et ça
roule très bien.

Bye

Jacquelin H



Hello,

Il est vrai que ce sont 2 fonctions de l'API (un peu méconnues?)
vraiment très efficaces, qui règlent bien des soucis de perfs.

Merci à toi du retour d'info :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
driss hanib
bonjour

est-ce qu'une piste ne serait pas de de garder ces cercles dans un autre
picture box et de "fusionner" avce celui où la carte est redessinnée..
il doit y avoir quelques API pour cela ; il me semble avoir vu sur le net
des programmes qui permettent de fusionner..

Driss


"Jean-marc" a écrit dans le message
de news: 4637573a$0$14239$
Jacquelin Hardy wrote:
Bonjour,

j'ai écrit un logiciel de cartes électroniques marines. Or cette carte
est regénérée très souvent, jusqu'à une fois par seconde.

Je voudrais que, par dessus la carte, soit dessiné un cercle d'azimuth
que la routine suivante (non optimisée) produit.

Ma question: est-ce que ce cercle d'azimuth pourrait rester sur la
PicttureBox en permanence, ie. sans avoir à le redessiner à chaque
fois que je regénère la carte ?

Merci

Jacquelin Hardy



Hello,

Non, a ma connaisance, il faut redessiner.

Mais (outre le fait que je ne comprends pas tout ce que fait
ton code, en particulier l'usage de shape1), il est très
facile d'optimiser très très fort ce code.

Si le seul souci est un souci d'optimisation de cette routine,
alors c'est tout simple...


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




Avatar
Driss HANIB
Bonjour Jean Marc,

je découvre (mais je ne connait pas bien les API) les deux focntions que tu
viens de décrire à Jaquelin.
je crois comprendre qu'elles s'utilisent dans un DC , don , apriori sur
différents "supports" : ecran (picture box), imprimante ?

je voulais savoir quelles sont les unités prévues dans ces focntions :
pixels, points ..
A-t-on le choix ?
car j'utilise , dans un programme , par commodité, les mm
je suis toujours en peine de convertir ces mm en pixels, points ou (unité
DC)

As-tu un lien ou autre qui puisse m'éclairer la dessus.
aujourd'hui, j'utilise les commandes line, print , circle.. des objets
(pictureBox, printer)..
je voudrai "gagner", en efficacité : rapidité, précision..

merci de tes conseils

Driss

"Jean-marc" a écrit dans le message
de news:4637b1b1$0$13859$
Jacquelin Hardy wrote:
> Merci Jean-Marc,
>
>> outre le fait que je ne comprends pas tout ce que fait
>> ton code, en particulier l'usage de shape1)
>
> Le code dessine 360 petites lignes sur la périphérie d'un cercle
> (shape1) correspondant aux 360 degrés d'un cercle. Les dizaines de
> degré sont des lignes + longues ainsi que tous les multiples de 5
> degrés.
>> Si le seul souci est un souci d'optimisation de cette routine,
>> alors c'est tout simple...
>
> Outre le fait que je pourais avoir une table de sinus et cosinus
> calculée d'avance en "single", comment suggèrerais-tu une meilleure
> optimisation ?

1) la table de sin et cos est une bonne idée si tu vas au bout de l'idée
en faisant carrément les calculs complets (multiplication et tout et tout)
2) Typer tes variables car les variants sont très lents
3) Utiliser LineTo et MoveToEx de l'API Windows va beaucoup plus vite

Pour exécuter ton code après optimisation, je fais 10.000 passages en
0.8 secondes, c'est à dire 800 ms pour 10.000 passages.
Par passage, ça fait 80 nanosecondes ce qui est très très peu, tu en
conviendras :-)

Il y a encore moyen de gagner à droite et à gauche en évitant de faire
plusieurs tours de boucles, mais ce n'est pas nécessaire ici, amha.

Voici pour les API:

Private Type PointAPI
X As Long
Y As Long
End Type

Private Declare Function LineTo& Lib "gdi32" (ByVal hdc As Long, ByVal X


As
Long, ByVal Y As Long)
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X


As
Long, ByVal Y As Long, lpPoint As PointAPI) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long,
ByVal hdc As Long) As Long

et pour l'utilisation:

Dim x1 As Single, y1 As Single
Dim p As PointAPI


Call MoveToEx(picCarte.hdc, x1, y1, p)

Call LineTo(picCarte.hdc, x1, y1)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




Avatar
jean-marc
"Driss HANIB" wrote in message
news:e%
Bonjour Jean Marc,

je découvre (mais je ne connait pas bien les API) les deux focntions que
tu
viens de décrire à Jaquelin.
je crois comprendre qu'elles s'utilisent dans un DC , don , apriori sur
différents "supports" : ecran (picture box), imprimante ?

je voulais savoir quelles sont les unités prévues dans ces focntions :
pixels, points ..
A-t-on le choix ?
car j'utilise , dans un programme , par commodité, les mm
je suis toujours en peine de convertir ces mm en pixels, points ou (unité
DC)

As-tu un lien ou autre qui puisse m'éclairer la dessus.
aujourd'hui, j'utilise les commandes line, print , circle.. des objets
(pictureBox, printer)..
je voudrai "gagner", en efficacité : rapidité, précision..

merci de tes conseils



Salut Driss,

effectivement ces fonctions utilisent un DC, on peut donc
les utiliser pour de nombreuses applis.

ces fonctions utilisent comme unités les "logical Unit". Je
ne suis pas un expert du domaine, mais voici un lien
utile:
http://msdn2.microsoft.com/en-us/library/ms534247.aspx

Je pense qu'en "remontant" dans la descritpion de Windows GDI
on doit pouvoir trouver toute sortes d'infos utiles:
http://msdn2.microsoft.com/en-us/library/ms536795.aspx

Voila, espérant que cela t'aide !

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Driss HANIB
OK merci

je regarde tout cela. Pour l'instant je m'y perds un peu mais bon comme
dirait un "candidat pour 2 jours encore" : "ensemble tout est possible..en
VB ;o))
Bon week end

Driss
"jean-marc" a écrit dans le message de
news:463b03b2$0$13854$
"Driss HANIB" wrote in message
news:e%
> Bonjour Jean Marc,
>
> je découvre (mais je ne connait pas bien les API) les deux focntions que
> tu
> viens de décrire à Jaquelin.
> je crois comprendre qu'elles s'utilisent dans un DC , don , apriori sur
> différents "supports" : ecran (picture box), imprimante ?
>
> je voulais savoir quelles sont les unités prévues dans ces focntions :
> pixels, points ..
> A-t-on le choix ?
> car j'utilise , dans un programme , par commodité, les mm
> je suis toujours en peine de convertir ces mm en pixels, points ou


(unité
> DC)
>
> As-tu un lien ou autre qui puisse m'éclairer la dessus.
> aujourd'hui, j'utilise les commandes line, print , circle.. des objets
> (pictureBox, printer)..
> je voudrai "gagner", en efficacité : rapidité, précision..
>
> merci de tes conseils

Salut Driss,

effectivement ces fonctions utilisent un DC, on peut donc
les utiliser pour de nombreuses applis.

ces fonctions utilisent comme unités les "logical Unit". Je
ne suis pas un expert du domaine, mais voici un lien
utile:
http://msdn2.microsoft.com/en-us/library/ms534247.aspx

Je pense qu'en "remontant" dans la descritpion de Windows GDI
on doit pouvoir trouver toute sortes d'infos utiles:
http://msdn2.microsoft.com/en-us/library/ms536795.aspx

Voila, espérant que cela t'aide !

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




1 2