VB.Net Dessiner dans un picturebox de 220x220

[Résolu]
Signaler
Messages postés
926
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
Salut à tous...

Je suis embêté et je me creuse la tête depuis quelques jours sur ce problème.

J'utilise un picturebox de 220 pixel par 220 pixel et je veux dessiner des croix. Ces croix seront des coordonnées géographiques. Il y a deux possibilité de coordonnées. Soit des coordonnée en Y seront des valeurs entre 5 000 000 et 6 000 000 et en X entre 200 000 et 350 000 (système géodésique) ou en système local donc des coordonnée en Y et X valant de - 5000 à 5000.
 
Comment faire pour dessiner les croix dans un picturebox de 202X220
Quel est le meilleur calcul afin de faire dessiner les croix avec le système géodésique et l'autre calcul pour le système local ???.
La précision est importante, je ne peux arrondir les coordonnées. Ces coordonnées auront 3 décimals.

Merci d'avance
A voir également:

10 réponses

Messages postés
926
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
4
Re...

J'ai trouvé une solution...

Trouver l'amplitude des coordornéées X et Y
Donc trouver Max et Min dans mon tableau pour X et Y
et faire ces petit calcul...

EchelleX = X_initial / (Math.Abs(ValMaxX - ValMinX))
EchelleY = Y_initial / (Math.Abs(ValMaxY - ValMinY))

For i = 0
To UBound(Tableau)
LigneSplit = Tableau(i).Split(Separateur)

CoordXPicturebox = (Convert.ToDouble(LigneSplit(2) - ValMinX) * EchelleX)
CoordYPicturebox = (Convert.ToDouble(LigneSplit(1) - ValMinY) * EchelleY)
'Dessiner Croix
objGraphics.DrawLine(MyPen, CoordXPicturebox, CoordYPicturebox - 2, CoordXPicturebox, CoordYPicturebox + 2)
objGraphics.DrawLine(MyPen, CoordXPicturebox - 2, CoordYPicturebox, CoordXPicturebox + 2, CoordYPicturebox)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Ok, dans ce cas là donc tu ne respecte pas le ratio de départ de ta zone de point.

Tu préfère appliquer une échelle différente sur chacun des axes ce qui aura donc pour effet donc de déformer l'image.

Par contre, au lieu de calculer tes échelles par rapport à la plage théorique possible des valeurs, tu les optimise en les calculant sur la plage d'évolution réelle de tes valeurs. Tu optimise ainsi l'espace d'affichage des points et minimise par la mêmeoccasion, plus ou moins l'effet de déformation en fonction de tes valeurs.
Ce peut effectivement etre un bon compromis.

Par contre attention avec ton calcul, tes points min et max sur chacun des axes se trouveront effectivement dessinés en plein sur l'axe.
Si cela est génant il te faudra prevoir une petite marge de chaque coté en corrigeant tes valeur min et max dans le calcul des échelles et lors des tracé des points :
Min = ValMin - quelques points
Max = ValMax + quelques points

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #   
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Tu ne peux arrondir les coordonnées, mais tu sera bien obligé de le faire pourtant.

Prennons le cas des coordonnées géodesiques, y entre 5000000 et 6000000 soit un gap de 1000000 si j'ai bien compris.
1000000 à representer sur 220 points (pixels). Cela veut dire que 1 pixel va representé 4545.4545 unités géodésiques soit 4545 puisque un pixel est un entier. Tu auras donc une résolution de 4545 sur l'échelle des Y en système géodésique.

En d'autre termes, toute variation sur Y inférieure à 4545 unités sera tout bonnement invisible sur ton image.

Quant à la solution, à quelque chose près je te l'avais déjà donné dans un de tes précédents post. Il te faut appliquer un facteur d'échelle sur tes points.

CoordPB = (CoordGeo - CoordGeoMIN)*(   (CoordPBMAX-CoordPBMIN) / (CoordGEOMAX-CoordGEOMIN) )

Soit si on reprend l'exemple de Y :
Y_PB = ( Y_Geo - 5000000) * ( 220 / 1000000)

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #   
Messages postés
926
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
4
Salut...

meric pour ta réponse...

Ta solution est intéressante mais pour la coordonnée X, qu'est ce que je fais.... Pour le X ca me donne un Gap de 150000.

Mais je ne peux faire
X_PB = ( X_Geo - 200000) * ( 220 / 150000)...

Car je n'ai pas le même rapport entre les coordonnées Y et X.

Donc j'aurais une mauvaise représentation des croix. Mes coordonnées X ne seront pas en relation avec les coordonnée Y.. ???
Les coordonnées X seront décalées et ne seront pas au bon endroit dans le picturebox

Tu comprends.. ??? ou c'est moi qui manque un élément pour saisir ton idée... 
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Oui le problème vien du fait que tu n'as pas le même ratio d'echelle sur ta picturebox (environ 10/11) et sur ta plage de mesure géodésique (15/100). C'est un peu comme lorsque tu essaye d'afficher un film 4/3 sur une tv 16/9 (ou inversement). Soit ut tiens compte du gap sur chaque axe, et au final ça te donne une image étirée (ou compréssée suivant le cas), soit tu fait en sorte de conserver le ratio de départ, et du coup tu as une partie de la zone d'affichage qui ne sert pas sur l'un ou l'autre des axes.

Ton soucis est que tu as une zone de mesure extremement allongée verticalement que tu essaye d'afficher dans une image quasiment carrée.
Dans ton cas , puisque c'est l'axe Y qui est le plus important, si tu veux conservé le ratio, c'est lui qui va fixé le facteur d'échelle
X_PB = ( X_Geo - 200000) * ( 220 / 1000000)

Mais ça va as faire très joli et de la même façon tu aura une résolution de 4545 en X . Sur un gap de 150000, ça ne fait guere que 33 pixels utiles en X

Une des solutions serait de pour voir passer en coordonnées logarithmiques au moins sur l'axe des Y, mais tu pert la représentation naturelle des points (la représentation logarithmique a pour effet de compresser les nombres de grande valeur)

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #   
Messages postés
926
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
4
Salut...

J'ai un autre petit probleme que ca fais 1 heure que je cherche et que je ne trouve pas....

Quand je fais un zoom j'ai des croix qui quitte le picturebox. Mais quand je regarde la grosseur du picturebox et les coordonnée de X et Y en pixel, les croix devrais apparaitre dans le picturebox...
Je fais le text avec 2 coordonnées... Au départ les coordonnées son visible dans le picturebox de 205 par 205. J'ai un point qui se situ au centre droit et un autre au centre gauche. Lorsque je zoom, mes croix se distance et ma crois qui se situe au centre gauche se déplace à gauche. La croix de droite se déplace à droite. Ma croix de gauche disparaitra apres 3 zooms et ma croix de droite reste toujours visible. La croix droite se déplace, à chaque fois que je zoom, vers la droite et je peux la visualiser avec le scrollbar. Mais ma croix de gauche devient invisible et je ne peux pas déplacer le scrollbar vers la gauche. Vois-tu pourquoi.
Peut-être me l'as-tu déjà dit mais je ne saisi pas pourquoi ca fonctionne pas.

Private

Sub cmdZoomPlus_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles cmdZoomPlus.Click

Dim i AsInteger
Dim PB1Height
As
Integer, PB1Weight
As
Integer

If cmdZoomMoins.Enabled =
False
Then cmdZoomMoins.Enabled =
True
PictureBox1.Height = Y_initial + 50
PictureBox1.Width = X_initial + 50
Zoom = Zoom + 1
PB1Height = PictureBox1.Location.Y
PB1Weight = PictureBox1.Location.X
PictureBox1.Location =
New Point(PB1Height - 25, PB1Weight - 25)

X_initial = PictureBox1.Width
Y_initial = PictureBox1.Height

Dim objBitMap
As
New Bitmap(X_initial, Y_initial)
objGraphics = Graphics.FromImage(objBitMap)
objGraphics.Clear(Color.White)
EchelleX = X_initial / (Math.Abs(ValMaxX - ValMinX))
EchelleY = Y_initial / (Math.Abs(ValMaxY - ValMinY))

For i = 0
To UBound(Tableau)
LigneSplit = Tableau(i).Split(Separateur)
CoordXPicturebox = (Convert.ToDouble(LigneSplit(2) - ValMinX) * EchelleX)
CoordYPicturebox = (Convert.ToDouble(LigneSplit(1) - ValMinY) * EchelleY)
objGraphics.DrawLine(MyPen, CoordXPicturebox, CoordYPicturebox - 2, CoordXPicturebox, CoordYPicturebox + 2)
objGraphics.DrawLine(MyPen, CoordXPicturebox - 2, CoordYPicturebox, CoordXPicturebox + 2, CoordYPicturebox)

Next i

Me.PictureBox1.Image = objBitMap
objGraphics.Dispose()
objGraphics =
Nothing
End
Sub
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
J'avoue que là je sèche, si tu perds le point c'est parce que je pense tu redéfinie à chaque fois l'origine de la picturebox et encore j'en suis pas sur.

Qaunt à résoudre le problème je ne vois pas.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
926
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
4
effectivement je redéfinie la picturebox à chauqe fois que je zoom...
j'augment de 50 le width et le Height

et par la suite je modifie la valeur de l'Échelle qui est relié à la dimenssion du picturebox...

selon moi je devrais reste dans le picturebox mais je ne vois pas mon erreur

merci quand meme de ton aide
Messages postés
926
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
4
J'ai trouvé....

Si ca t'interesse.....

Je redéfinnissais le picturebox et je le déplacais également (pour le centrer). À chaque zoom je le déplacait de -25 alors je perdais une partie du picturebox...

Merci de ton aide
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
oui c'est qui m'avait semblé, mais je n'avais trouvé de solution au problème.

Parcontre si tu as résolu ton problème, tu peux indiqué comment tu as fait, ça servira pour d'autres qui auraient le même problème que toi.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #