PictureBox layer(s)

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-marc
Le #15411031
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/
LE TROLL
Le #15411011
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" 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/




Jacquelin Hardy
Le #15410861
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...




Jean-marc
Le #15410851
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/
Jacquelin Hardy
Le #15410731
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)



Jean-marc
Le #15410721
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/
driss hanib
Le #15410711
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" 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/




Driss HANIB
Le #15409511
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" 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/




jean-marc
Le #15409491
"Driss HANIB" 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/
Driss HANIB
Le #15409481
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" news:463b03b2$0$13854$
"Driss HANIB" 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/




Publicité
Poster une réponse
Anonyme