Duke49
Messages postés552Date d'inscriptionjeudi 12 octobre 2006StatutNon membreDernière intervention24 janvier 2023
-
6 juin 2015 à 10:18
Bravo Duke et Whismeril et Merci. -
18 juin 2015 à 11:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Class SexaCoordonnee
Friend Axe As Sexagesime = Sexagesime.Nord
Friend Value As Decimal = 0
Friend Property Text As String
Get
Dim Coordonnee() As Byte = Sexagesimal
Return Axe.ToString & ":" & Coordonnee(0) & "-" & Coordonnee(1) & "-" & Coordonnee(2)
End Get
Set(ByVal StV As String)
Dim S() As String = StV.Split(":")
Select Case S(0) '("qu'on le dise une fois pour toutes")
Case "Nord" : Axe = Sexagesime.Nord
Case "Sud" : Axe = Sexagesime.Sud
Case "Ouest" : Axe = Sexagesime.Ouest
Case "Est" : Axe = Sexagesime.Est
End Select 'La prochaine fois qu'on le redit, on ajoute haut et bas.
'Case Haut Axe = Haut et Case Bas, Axe = Bas.
Dim St() As String = S(1).Split("-")
Value = (3600 * St(0) + 60 * St(1) + St(2))
End Set
End Property
Friend Property Sexagesimal As Byte()
Get
Dim R() As Byte = {89, 59, 59}
Dim temp() As Decimal = {0, 0, 0}
temp(0) = Int(Value / 3600)
temp(2) = Value Mod 3600
temp(1) = Int(temp(2) / 60)
temp(2) = temp(2) Mod 60
R(0) = temp(0) : R(1) = temp(1) : R(2) = temp(2)
Return R
End Get
Set(ByVal Coordonnee As Byte())
Value = Coordonnee(0) * 3600 + Coordonnee(1) * 60 + Coordonnee(2)
End Set
End Property
End Class
La géodésie fonctionne bien. Avec un zoom sur une selection qui n'affecte pas les couleurs, on peut peaufiner les détails sans re-inventer le programme.
Les formules sont vérifiées, mais la structure et les labels seraient avantageugement améliorés que ça mangerait pas de pain.
Je recommence tout dans un module "Evolution" qui devrait idéaliser l'approche de l'analyse graphique (vectorialiser les pixels de la courbe) et introduire la reconaissance de forme.
L'objectif est de re-générer la courbe avec un algorythme de Fornar, sorte d'anachronisme qui suppose qu'une application qui colle au passé devrait donner une idée de l'avenir.
On pourrait décomposer en série de Fourrier si le digital ne convenait pas mieux a l'algorithmie qu'au calcul.
Certains savent quel objets de la librairie produisent des adaptations vérifiées, mais ils visitent d'autres sujets. Je recommencerais donc.
Public Class Evolution
Function Bisextile(ByVal An As Integer) As Boolean
REM RICHIE_KIRNINGHAM (Le Langage C) Une année est bisextile si elle est divisible par 4 et pas par cent a l'exception des années divisibles par 400 qui sont bisextiles.
Dim BISEX As Boolean = An Mod 4 = 0
BISEX = BISEX And Not An Mod 100 = 0
If An Mod 400 = 0 Then BISEX = True
Return BISEX
End Function
Function IndexDuJour(ByVal DTDate As DateTime) As UInt16
Dim Calend() As UInt16 = {31.28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
...
Au revoir, et merci Whismeril pour tes encouragements, A bientôt pour un autre sujet.
Bravo Duke et Whismeril et Merci.
J'ai pas fini de fignoler, et pour amélorer le module sexalogique, je développe des environements de tests.
Public Class Form1
'Zoom dans la picturebox.
Dim WithEvents Photo As New PictureBox With { _
.Dock = DockStyle.Fill} ', .SizeMode = PictureBoxSizeMode.StretchImage}
Dim OK As Boolean = True
Sub New()
InitializeComponent()
Controls.Add(Photo)
Dim OpenFileDialog As FileDialog
Try
OpenFileDialog = New OpenFileDialog
OpenFileDialog.Filter = "Tous | *.*|Fichier Bitmap (*.bmp) | *.bmp "
If OpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
'Ouverture de l'image
Photo.Image = Image.FromFile(OpenFileDialog.FileName)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
OK = False
Exit Sub
End Try
End Sub
Sub QuandClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Photo.MouseClick
If OK Then
Dim X As Integer = e.X
Dim W As Integer = Int(Photo.Width / 2)
Dim Y As Integer = e.Y
Dim H As Integer = Int(Photo.Height / 2)
Dim Origin As Bitmap = Photo.Image.Clone
Dim Temp As Bitmap = Photo.Image.Clone
Dim Pixel As Color
For i = 0 To W - 2
For j = 0 To H - 2
Pixel = Origin.GetPixel(i + X / 2, j + Y / 2)
Temp.SetPixel(2 * i, 2 * j, Pixel)
Temp.SetPixel(2 * i + 1, 2 * j, Pixel)
Temp.SetPixel(2 * i, 2 * j + 1, Pixel)
Temp.SetPixel(2 * i + 1, 2 * j + 1, Pixel)
Next
Next
Photo.Image = Temp
End If
End Sub
End Class
Attendez la version finale. C'est comme le scroll, il faut mettre l'objet visual dans le repère, pas greffer des repéres dans l'Óbject.
Whismeril
Messages postés19025Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention19 avril 2024656 11 juin 2015 à 19:02
Bonsoir, n'étant plus dans ce domaine, je n'ai pas de quoi valider vos calculs. Je vous fait confiance.
Public Class Form1
'Je tire une grande form1 dans le concepteur et je copy/colle ce code.
'Auquel j'ajoute sexalogic(ajouter New module et copier\coller)
Dim essai As New MiniGeoBox
Sub New()
InitializeComponent()
essai.MiniBox.Dock = DockStyle.Bottom
'sinon ca s'installe en haut ou je voudrais mettre la pictureBox avec le zoom dans un onglet pour rèver de tout ce que je pourrais rajouter.
Controls.Add(essai.MiniBox)
End Sub
'Je run le debug de mon basic express,
'Je click droit dans le jaune pour choisir une photo,
'(tous les fichiers)
'Je règle les paramètres géodésiques de l'onglet "Limites"
'Et je me repose un peu avant de continuer.
'Et j'ai pas besoin de sauvegarder parce que c'est édité
'chez CodesSauce on dérouille. Merci. ING c'est trop formel.
End Class
Module Sexalogic
Enum Sexagesimal
Nord
Sud
Ouest
Est
End Enum
Class SexaCoordonnee
Friend Axe As Sexagesimal = "Nord"
Friend Value As Decimal = 0
Friend Property Text As String
Get
Dim Coordonnee() As Byte = Sexagesimal
Return Axe.ToString & ":" & Coordonnee(0) & "-" & Coordonnee(1) & "-" & Coordonnee(2)
End Get
Set(ByVal StV As String)
Dim S() As String = StV.Split(":")
Axe = S(0)
Dim St() As String = S(1).Split("-")
Value = (3600 * St(0) + 60 * St(1) + St(2))
End Set
End Property
Friend Property Sexagesimal As Byte()
Get
Dim R() As Byte = {179, 59, 59}
Dim temp() As Decimal = {0, 0, 0}
temp(0) = Int(Value / 3600)
temp(2) = Value Mod 3600
temp(1) = Int(temp(2) / 60)
temp(2) = temp(2) Mod 60
R(0) = temp(0) : R(1) = temp(1) : R(2) = temp(2)
Return R
End Get
Set(ByVal Coordonnee As Byte())
Value = Coordonnee(0) * 3600 + Coordonnee(1) * 60 + Coordonnee(2)
End Set
End Property
End Class
Class SexaBox
#Region "DECLARE CONCEPT"
Friend Tableau As New Panel With {.Name = "Panneau", _
.Anchor = 4, .Location = New Point(0, 0), .Size = New Point(300, 22)}
Dim AxeLabel As New Label With {.Name = "AxeLabel", _
.Anchor = 4, .Location = New Point(0, 2), .Size = New Point(58, 18)}
Dim AxeBox As New ComboBox With {.Name = "AxeBox", _
.Anchor = 4, .Location = New Point(58, 0), .Size = New Point(50, 18)}
Dim Valeur As New NumericUpDown With {.Name = "Valeur", _
.Minimum = 0, .Maximum = 179, _
.Anchor = 4, .Location = New Point(114, 0), .Size = New Point(40, 18)}
Dim Minute As New NumericUpDown With {.Name = "Minute", _
.Minimum = 0, .Maximum = 59, _
.Anchor = 4, .Location = New Point(160, 0), .Size = New Point(35, 18)}
Dim Seconde As New NumericUpDown With {.Name = "Seconde", _
.Minimum = 0, .Maximum = 59, _
.Anchor = 4, .Location = New Point(200, 0), .Size = New Point(35, 18)}
Sub initializeConcept()
Tableau.Controls.Add(AxeLabel)
Tableau.Controls.Add(AxeBox)
Tableau.Controls.Add(Valeur)
Tableau.Controls.Add(Minute)
Tableau.Controls.Add(Seconde)
End Sub
#End Region
Property Coordonnee As SexaCoordonnee
Get
Dim Temp As New SexaCoordonnee
Temp.Sexagesimal = {Valeur.Value, Minute.Value, Seconde.Value}
Temp.Axe = AxeBox.Text
Return Temp
End Get
Set(ByVal value As SexaCoordonnee)
Dim Temp() As Byte = value.Sexagesimal
AxeBox.Text = value.Axe
Valeur.Value = Temp(0) : Minute.Value = Temp(1) : Seconde.Value = Temp(2)
End Set
End Property
Sub New(Optional ByVal text As String = "Haut\Nord\89:59:59")
initializeConcept()
Dim S0() As String = text.Split("\")
AxeLabel.Text = S0(0) : AxeBox.Text = S0(1)
Dim S() As String = S0(2).Split(":")
Valeur.Value = S(0) : Minute.Value = S(1) : Seconde.Value = S(2)
If AxeBox.Text = "Nord" Or AxeBox.Text = "Sud" Then
AxeBox.Items.Add("Nord") : AxeBox.Items.Add("Sud") : End If
If AxeBox.Text = "Ouest" Or AxeBox.Text = "Est" Then
AxeBox.Items.Add("Ouest") : AxeBox.Items.Add("Est") : End If
End Sub
End Class
Class SexaPoint
Dim Nom As String = ""
Friend Longitude As New SexaCoordonnee
Friend Latitude As New SexaCoordonnee
Friend Property Text As String
Get
Dim S As String
S = Latitude.Text & "\" & Longitude.Text
Return S
End Get
Set(ByVal StrPos As String)
Dim S() As String = StrPos.Split("\")
For i As Integer = 0 To 1
If (S(i).Split(":")(0) < "ouest") Then
Latitude.Text = S(i)
Else
Longitude.Text = S(i)
End If
Next
End Set
End Property
End Class
Class SexaCube
Friend Bord() As SexaCoordonnee
Function Height() As Decimal
Return Bord(Sexagesimal.Nord).Value + Bord(Sexagesimal.Sud).Value
End Function
Function Width() As Decimal
Return Bord(Sexagesimal.Ouest).Value + Bord(Sexagesimal.Est).Value
End Function
Function Point(ByVal Longitude As Sexagesimal, ByVal Latitude As Sexagesimal) As SexaPoint
Dim Temp As New SexaPoint
Temp.Longitude = Bord(Longitude)
Temp.Latitude = Bord(Latitude)
Return Temp
End Function
#Region "DECLARE CONCEPT"
Friend MiniTaSexaBox As New TabPage With {.Text = "Limites", .Location = New Point(0, 0)}
Sub initializeConcept()
Dim CadreNord = New SexaBox("Haut\Nord\89:59:59") '.Tableau
CadreNord.Tableau.Location = New Point(CadreNord.Tableau.Location.X, 11)
MiniTaSexaBox.Controls.Add(CadreNord.Tableau)
Dim CadreSud = New SexaBox("Bas\Sud\89:59:59")
CadreSud.Tableau.Location = New Point(CadreSud.Tableau.Location.X, 32)
MiniTaSexaBox.Controls.Add(CadreSud.Tableau)
Dim CadreOuest = New SexaBox("Gauche\Ouest\23:59:59")
CadreOuest.Tableau.Location = New Point(CadreOuest.Tableau.Location.X, 53)
MiniTaSexaBox.Controls.Add(CadreOuest.Tableau)
Dim CadreEst = New SexaBox("Droite\Est\23:59:59")
CadreEst.Tableau.Location = New Point(CadreEst.Tableau.Location.X, 74)
MiniTaSexaBox.Controls.Add(CadreEst.Tableau)
End Sub
#End Region
Sub New()
initializeConcept()
End Sub
End Class
Class SexaRepere
Dim Mesures As Size
Dim Echelle As Point
Friend Matrice As New SexaCube
Property Taille As Size
Get
Dim Tab As New Size
Tab.Height = Echelle.Y * Mesures.Height
Tab.Width = Echelle.X * Mesures.Width
Return Tab
End Get
Set(ByVal value As Size)
Mesures.Height = value.Height / Echelle.Y
Mesures.Width = value.Width / Echelle.X
End Set
End Property
Function Plot(ByVal Gite As SexaPoint) As Point
Dim Position As New Point
Position.Y = (Gite.Latitude.Value * Taille.Height + Matrice.Bord(Sexagesimal.Sud).Value) / Matrice.Height
Position.X = (Gite.Longitude.Value * Taille.Width + Matrice.Bord(Sexagesimal.Est).Value) / Matrice.Width
Return Position
End Function
Function Plot(ByVal Position As Point) As SexaPoint
Dim Gite As New SexaPoint
Gite.Longitude.Value = (Position.X * Matrice.Width - Matrice.Bord(Sexagesimal.Est).Value) / Taille.Width
Gite.Latitude.Value = (Position.Y * Matrice.Height - Matrice.Bord(Sexagesimal.Sud).Value) / Taille.Height
Return Gite
End Function
End Class
Class Photofile
Friend Photo As PictureBox
#Region "Menu"
Sub NewMenu()
Item_Ajouter.DropDownItems.Add(Item_Ajout_Photo)
End Sub
Dim WithEvents Item_Ajouter As New ToolStripMenuItem With {.Name = "ItemAjout", _
.Text = "Ajouter"}
Dim WithEvents Item_Ajout_Photo As New ToolStripMenuItem With {.Name = "ItemAjoutPhoto", _
.Text = "Photo", .ToolTipText = "Charge une photo peripherique"}
Sub AjoutePhoto() Handles Item_Ajout_Photo.Click
Dim OpenFileDialog As FileDialog
Try
OpenFileDialog = New OpenFileDialog
OpenFileDialog.Filter = "Fichier Bitmap (*.bmp) | *.bmp |Tous | *.*"
If OpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
'Ouverture de l'image
Photo.Image = Image.FromFile(OpenFileDialog.FileName)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
Exit Sub
End Try
End Sub
#End Region
Sub New(ByVal Box As PictureBox, Optional ByVal StartLoad As Boolean = False)
NewMenu()
Photo = Box
Photo.ContextMenuStrip = New ContextMenuStrip
Photo.ContextMenuStrip.Items.Add(Item_Ajouter)
If StartLoad Then AjoutePhoto()
End Sub
End Class
Class MiniGeoBox
Dim Detail As New PictureBox
Friend Repere As New SexaRepere
#Region "DECLARE CONCEPT"
Friend MiniBox As New Panel With _
{.Location = New Point(10, 10), .Size = New Point(460, 105), _
.BackColor = Color.AliceBlue, .Anchor = 15}
Dim WithEvents MiniPlan As New PictureBox With {.Location = New Point(260, 0), .Size = New Point(200, 105), _
.BackColor = Color.Beige, .SizeMode = PictureBoxSizeMode.StretchImage, _
.Anchor = 15}
Dim Carton As New Photofile(MiniPlan)
Dim Choix As New TabControl _
With {.Location = New Point(0, 0), .Size = New Point(250, 105)}
Dim PremierChoix As New TabPage With {.Text = "Selection"}
Sub initializeConcept()
MiniBox.Controls.Add(MiniPlan)
MiniBox.Controls.Add(Choix)
Choix.Controls.Add(PremierChoix)
Dim T As New TabPage
T = Repere.Matrice.MiniTaSexaBox
Choix.Controls.Add(T)
End Sub
#End Region
Sub New()
initializeConcept()
End Sub
End Class
End Module
Merci Whismeril,
J'ai trouvé une solution qui marche au petit poil, mais trop brouillon pour développer. Heureusement, je découvre "ENUM" qui change tout.
Jái pas débuggé mais tant pi car
JE MIS, J'ÔTE.
Je sais pas si ca va marcher mais ce qui suit me botte.
Module Sexalogic
Enum Sexagesimal
Nord
Sud
Ouest
Est
End Enum
Class SexaCoordonnee
Friend Axe As Sexagesimal = "Nord"
Friend Value As Decimal = 0
Friend Property Text As String
Get
Dim Coordonnee() As Byte = Sexagesimal
Return Axe.ToString & ":" & Coordonnee(0) & "-" & Coordonnee(1) & "-" & Coordonnee(2)
End Get
Set(ByVal StV As String)
Dim S() As String = StV.Split(":")
Axe = S(0)
Dim St() As String = S(1).Split("-")
Value = (3600 * St(0) + 60 * St(1) + St(2))
End Set
End Property
Friend Property Sexagesimal As Byte()
Get
Dim R() As Byte = {179, 59, 59}
Dim temp() As Decimal = {0, 0, 0}
temp(0) = Int(Value / 3600)
temp(2) = Value Mod 3600
temp(1) = Int(temp(2) / 60)
temp(2) = temp(2) Mod 60
R(0) = temp(0) : R(1) = temp(1) : R(2) = temp(2)
Return R
End Get
Set(ByVal Coordonnee As Byte())
Value = Coordonnee(0) * 3600 + Coordonnee(1) * 60 + Coordonnee(2)
End Set
End Property
End Class
Class SexaBox
#Region "DECLARE CONCEPT"
Friend Tableau As New Panel With {.Name = "Panneau", _
.Anchor = 4, .Location = New Point(0, 0), .Size = New Point(300, 22)}
Dim AxeLabel As New Label With {.Name = "AxeLabel", _
.Anchor = 4, .Location = New Point(0, 2), .Size = New Point(58, 18)}
Dim AxeBox As New ComboBox With {.Name = "AxeBox", _
.Anchor = 4, .Location = New Point(58, 0), .Size = New Point(50, 18)}
Dim Valeur As New NumericUpDown With {.Name = "Valeur", _
.Minimum = 0, .Maximum = 179, _
.Anchor = 4, .Location = New Point(114, 0), .Size = New Point(40, 18)}
Dim Minute As New NumericUpDown With {.Name = "Minute", _
.Minimum = 0, .Maximum = 59, _
.Anchor = 4, .Location = New Point(160, 0), .Size = New Point(35, 18)}
Dim Seconde As New NumericUpDown With {.Name = "Seconde", _
.Minimum = 0, .Maximum = 59, _
.Anchor = 4, .Location = New Point(200, 0), .Size = New Point(35, 18)}
Sub initializeConcept()
Tableau.Controls.Add(AxeLabel)
Tableau.Controls.Add(AxeBox)
Tableau.Controls.Add(Valeur)
Tableau.Controls.Add(Minute)
Tableau.Controls.Add(Seconde)
End Sub
#End Region
Property Coordonnee As SexaCoordonnee
Get
Dim Temp As New SexaCoordonnee
Temp.Sexagesimal = {Valeur.Value, Minute.Value, Seconde.Value}
Temp.Axe = AxeBox.Text
Return Temp
End Get
Set(ByVal value As SexaCoordonnee)
Dim Temp() As Byte = value.Sexagesimal
AxeBox.Text = value.Axe
Valeur.Value = Temp(0) : Minute.Value = Temp(1) : Seconde.Value = Temp(2)
End Set
End Property
Sub New()
initializeConcept()
End Sub
End Class
Class SexaPoint
Dim Nom As String = ""
Friend Longitude As New SexaCoordonnee
Friend Latitude As New SexaCoordonnee
Friend Property Text As String
Get
Dim S As String
S = Latitude.Text & "\" & Longitude.Text
Return S
End Get
Set(ByVal StrPos As String)
Dim S() As String = StrPos.Split("\")
For i As Integer = 0 To 1
If (S(i).Split(":")(0) < "ouest") Then
Latitude.Text = S(i)
Else
Longitude.Text = S(i)
End If
Next
End Set
End Property
End Class
Class SexaCube
Friend Bord() As SexaCoordonnee
Function Height() As Decimal
Return Bord(Sexagesimal.Nord).Value + Bord(Sexagesimal.Sud).Value
End Function
Function Width() As Decimal
Return Bord(Sexagesimal.Ouest).Value + Bord(Sexagesimal.Est).Value
End Function
Function Point(ByVal Longitude As Sexagesimal, ByVal Latitude As Sexagesimal) As SexaPoint
Dim Temp As New SexaPoint
Temp.Longitude = Bord(Longitude)
Temp.Latitude = Bord(Latitude)
Return Temp
End Function
#Region "DECLARE CONCEPT"
Dim User As New Panel With {.Name = "Panneau", _
.Anchor = 13, .Location = New Point(0, 0), .Size = New Point(300, 300)}
Dim Cadre() As SexaBox
Sub initializeConcept()
For i As Sexagesimal = "North" To "East"
Cadre(i) = New SexaBox
Cadre(i).Tableau.Location = New Point(Cadre(i).Tableau.Location.X, i * 20)
User.Controls.Add(Cadre(i).Tableau)
Next
End Sub
#End Region
Sub New()
initializeConcept()
End Sub
End Class
Class SexaRepere
Dim Mesures As Size
Dim Echelle As Point
Dim Repere As SexaCube
Property Taille As Size
Get
Dim Tab As New Size
Tab.Height = Echelle.Y * Mesures.Height
Tab.Width = Echelle.X * Mesures.Width
Return Tab
End Get
Set(ByVal value As Size)
Mesures.Height = value.Height / Echelle.Y
Mesures.Width = value.Width / Echelle.X
End Set
End Property
Function Plot(ByVal Gite As SexaPoint) As Point
Dim Position As New Point
Position.Y = (Gite.Latitude.Value * Taille.Height + Repere.Bord(Sexagesimal.Sud).Value) / Repere.Height
Position.X = (Gite.Longitude.Value * Taille.Width + Repere.Bord(Sexagesimal.Est).Value) / Repere.Width
Return Position
End Function
Function Plot(ByVal Position As Point) As SexaPoint
Dim Gite As New SexaPoint
Gite.Longitude.Value = (Position.X * Repere.Width - Repere.Bord(Sexagesimal.Est).Value) / Taille.Width
Gite.Latitude.Value = (Position.Y * Repere.Height - Repere.Bord(Sexagesimal.Sud).Value) / Taille.Height
Return Gite
End Function
End Class
End Module
Faut-il continuer ?
Je vais commencer par encapsuler tout ca dans des Tabcontroles pur laisser de la place au développements,
Bonjour, j'ai rendu les liens wikipédia cliquables, et ai supprimé la référence à la source puisqu'il s'agit des commentaires de la dite source.
Concernant la géodésie, domaine que j'ai pratiqué pendant plus de 10 ans, pour conserver une précision inférieure au mètre dans les changements de repère, il ne faut pas utiliser les transformation linéaire
L'histoire d'une part : la réalisation de la NTF a débuté vers 1870-1880, avec les moyens de l'époque aussi bien en terme de mesures, que de calculs (inverser des matrices 1000*1000 à la main....). Il en résulte des biais aléatoirement répartit sur le territoire pouvant atteindre plusieurs mètres (ce qui n'est pas si mal, sans les mesures spatiales, on ne s'en serait jamais rendu compte!). D'autre part, les mesures terrestres ne peuvent pas relever la hauteur sur ellipsoïde, c'est une altitude qui est donc associée à ce type de coordonnées. Il faut donc passer par des modèles pour ce type de transformations.
La dérive des continents d'autre part, entre le WGS84 et le RGF93, pourtant basés sur le même ellipsoïde GRS80, les continents s'étant déplacés, les deux réalisations ne sont pas directement compatibles
Je t'invite à consulter le site de l'IGN, référence dans le domaine.
Bien didactique, ce petit programme est une oeuvre.
C'aurait pu être un Snippet comme je préfère.
C'est domage qu'il utilise une carte de France en ressources,
car copier c'est moins fatigant que télécharger la solution.
De toutes façon, et, compte tenu que le concepteur Microsoft s'est toujours pas amélioré,
le simple fait d'hériter un outil visuel brouille.
Donc on peut faire ni mieux, ni plus simple qu'en solution.
Le code est bien commenté; vous devriez avoir un tas d'idée a partir de mon code
La première idée qui me vient, c'est d'afficher les coordonneées GEODESIQUES on click.
J'ai donc commencer par m'informer sur le sujet, et j'ai stupidement suivi les instructions suivantes:
Structure Horaire
Dim Orientation As Boolean 'Est, Ouest
Dim Heure As Byte
Dim Minute As Byte
Dim Seconde As Byte
End Structure
Structure Quadrant
Dim Axe As Boolean 'Nord, Sud
Dim Degre As Byte
Dim Minute As Byte
Dim Seconde As Byte
End Structure
Structure Geodesique
Dim Nom As String
Dim H As Horaire
Dim Q As Quadrant
End Structure
Class Coordonnee
Dim Nom As String = ""
Dim H As Horaire
Dim Q As Quadrant
Property Geodesique As Geodesique
Get
Dim G As Geodesique
With G : .Nom = Nom : .H = H : .Q = Q : End With
Return G
End Get
Set(ByVal value As Geodesique)
With value : Nom = .Nom : H = .H : Q = .Q : End With
End Set
End Property
Property Latitude As Integer
Get
Dim Sens As Integer = -1
If Q.Axe Then Sens = 1
Return Sens * (Q.Degre + (Q.Minute / 60) + (Q.Seconde / 3600))
End Get
Set(ByVal value As Integer)
With Q
If value < 0 Then .Axe = False Else .Axe = True
value = Math.Abs(value)
.Degre = Int(value)
.Seconde = (value - .Degre) * 60
.Minute = Int(.Seconde)
.Seconde = Int((.Seconde - .Minute) * 60)
End With
End Set
End Property
Property Longitude As Integer
Get
Dim Sens As Integer = -1
If H.Orientation Then Sens = 1
Return Sens * (H.Heure + (H.Minute / 60) + (H.Seconde / 3600))
End Get
Set(ByVal value As Integer)
With H
If value < 0 Then .Orientation = False Else .Orientation = True
value = Math.Abs(value)
.Heure = Int(value)
.Seconde = (value - .Heure) * 60
.Minute = Int(.Seconde)
.Seconde = Int((.Seconde - .Minute) * 60)
End With
End Set
End Property
Property Text As String
Get
Dim S As String = Nom & ":"
If H.Orientation Then S = S & "E:" Else S = S & "W:"
S = S & H.Heure & "-" & H.Minute & "-" & H.Seconde & ":"
If Q.Axe Then S = S & "N:" Else S = S & "S:"
S = S & Q.Degre & "-" & Q.Minute & "-" & Q.Seconde
Return S
End Get
Set(ByVal value As String)
Dim S() As String = value.Split(":")
Nom = S(0) : H.Orientation = S(1)
Dim i As Byte = 0
Dim Heure() As String = S(2).Split("-")
If i < Heure.Length Then H.Heure = Heure(i) : i = i + 1
If i < Heure.Length Then H.Minute = Heure(i) : i = i + 1
If i < Heure.Length Then H.Seconde = Heure(i)
i = 0 : Q.Axe = S(3)
Dim Quart() As String = S(4).Split("-")
If i < Quart.Length Then H.Heure = Heure(i) : i = i + 1
If i < Quart.Length Then H.Minute = Heure(i) : i = i + 1
If i < Quart.Length Then H.Seconde = Heure(i)
End Set
End Property
Sub New(Optional ByVal Blase As String = "")
Nom = Blase
End Sub
End Class
Class LimitesDeLaCarte
Dim NO As Coordonnee = Nothing
Dim SE As Coordonnee = Nothing
Function Proportions(ByVal Size As Point) As Point
Dim P As New Point
P.X = NO.Longitude - SE.Longitude
P.Y = NO.Latitude - SE.Latitude
End Function
Sub New()
Dim GNO As New Geodesique
With GNO
.Nom = "Nord Ouest"
.H.Orientation = True
.H.Heure = 12
.H.Minute = 0
.H.Seconde = 0
.Q.Axe = False
.Q.Degre = 90
.Q.Minute = 0
.Q.Seconde = 0
End With
NO.Geodesique = GNO
Dim GSE As New Geodesique
With GSE
.Nom = "Sud Est"
.H.Orientation = False
.H.Heure = 12
.H.Minute = 0
.H.Seconde = 0
.Q.Axe = True
.Q.Degre = 90
.Q.Minute = 0
.Q.Seconde = 0
End With
SE.Geodesique = GSE
End Sub
End Class
J'ai débuggé jusqu'qu'à m'appercevoir que si ça fonctionne parfaitement,
les nombreux changements répètés de repères et les formules bien que linéaires,
ainsi que la précision des calculs, enregistraient avec une précision de quelques degrés avec une régularitè digne d'un générateur alléatoire.
On peut en faire un début d'introduction de didactique pré trigo sphèrique.
J'ai donc tout effacé pour changer d'arithmètique.
Et j'ai perdu un programme qui fonctionnait bien, mais qu'il reste une vieille sauvegarde ci-dessus qui idonne une idée de ce qu'il faut pas faire.
Je TRAVAILLE sur une nouvelle structure
Module Geodésie
'http://codes-sources.commentcamarche.net/source/54067-vb10-creer-vos-propres-calques-sur-une-image
'http://fr.wikipedia.org/wiki/Syst%C3%A8me_sexag%C3%A9simal
'http://fr.wikipedia.org/wiki/Coordonn%c3%a9es_g%c3%a9ographiques
'http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_coordonn%C3%A9es_(cartographie)
Class Coordonnee
Friend Axe As Byte = 0
Friend Value As Decimal
Friend Property Text As String
Get
Dim Coordonnee() As Byte = Sexagesimal
Dim EONS As String() = {"Nord", "Sud", "Est", "Ouest"}
Return EONS(Axe) & ":" & Coordonnee(0) & "-" & Coordonnee(1) & "-" & Coordonnee(2)
End Get
Set(ByVal StV As String)
Dim S() As String = StV.Split(":")
Select Case S(0)
Case "Nord" : Axe = 0
Case "Sud" : Axe = 1
Case "Est" : Axe = 2
Case "Ouest" : Axe = 3
End Select
Dim St() As String = S(1).Split("-")
Value = (3600 * St(0) + 60 * St(1) + St(2))
End Set
End Property
Private Property Sexagesimal As Byte()
Get
Dim R() As Byte = {179, 59, 59}
Dim temp() As Decimal = {0, 0, 0}
temp(0) = Value / 3600
temp(2) = Value Mod 3600
temp(1) = R(2) / 60
temp(2) = R(2) Mod 60
R(0) = temp(0) : R(1) = temp(1) : R(2) = temp(2)
Return R
End Get
Set(ByVal Coordonnee As Byte())
Value = Coordonnee(0) * 3600 + Coordonnee(1) * 60 + Coordonnee(2)
End Set
End Property
End Class
Class Position
Dim Nom As String = ""
Friend Longitude As New Coordonnee
Friend Latitude As New Coordonnee
Function Plot(ByVal Ref As Referentiel, ByVal Repere As Size) As Point
Dim R As Point
R.X = (Longitude.Value + Ref.Est) * Repere.Width / Ref.Width
R.Y = (Latitude.Value + Ref.Sud) * Repere.Height / Ref.Hight
Return R
End Function
Friend Property Text As String
Get
Dim S As String
S = Latitude.Text & "\" & Longitude.Text
Return S
End Get
Set(ByVal StrPos As String)
Dim S() As String = StrPos.Split("\")
'verifie l'ordre Latitude longitude
Dim T0() As String = {"nord", "sud", "north", "n"}
Dim T1() As String = {"est", "ouest"}
For i As Integer = 0 To 1
Dim S0 As String = S(i).Split(":")(0).Trim(" ").ToLower
If T0.Contains(S0) Then
Latitude.Text = S(i)
End If
If T1.Contains(S0) Then
Longitude.Text = S(i)
End If
Next
End Set
End Property
End Class
Class Referentiel
Dim OCoin As New Position
Dim CoinZ As New Position
Friend Nord As Integer
Friend Sud As Integer
Friend Est As Integer
Friend Ouest As Integer
Friend Hight As Integer
Friend Width As Integer
Private Sub Run()
Nord = OCoin.Latitude.Value
Sud = CoinZ.Latitude.Value
Est = OCoin.Longitude.Value
Ouest = CoinZ.Longitude.Value
Hight = Nord + Sud
Width = Est + Ouest
End Sub
Friend Sub init(ByVal A As Position, ByVal Z As Position)
OCoin = A : CoinZ = Z
Run()
End Sub
Sub New()
OCoin.Text = "Nord:90-00-00\Ouest:180-00-00"
CoinZ.Text = "Sud:90-00-00\Est:180-00-00"
Run()
End Sub
End Class
End Module
Que je sauvegarde chez Codes_Sources en passant
Et que je sais pas combien de temps je vais continuer a fignoler
Car je change encore de pays ce Lundi.
J'en profite aussi pour faire un point des autre modules,
sachant que je place une carte du monde avec des méridiens et des parallèles bien parallèles en ressource.
Module Carte
Class Plan_Geodesique
Inherits PictureBox
Friend Aire As New List(Of Position)
Dim Ref As New Referentiel
Sub TireLigne()
If Aire.Count > 1 Then
Dim P() As Integer = DernierTrait()
Dim gr As Graphics = CreateGraphics()
gr.DrawLine(Pens.Red, P(0), P(1), P(2), P(3))
End If
End Sub
Friend Function DernierTrait() As Integer()
Dim R(3) As Integer
Dim O As Position = Aire.Item(Aire.Count - 2)
Dim t As Position = Aire.Item(Aire.Count - 1)
Dim Po As New Point : Po = O.Plot(Ref, Size)
Dim Pt As New Point : Pt = t.Plot(Ref, Size)
R(0) = Po.X
R(1) = Po.Y
R(2) = Pt.X
R(3) = Pt.Y
Return R
End Function
Sub SetPoint(ByVal e As MouseEventArgs)
Dim C As New Position
Dim P As New Point(e.X, e.Y)
Dim Lo As Decimal = P.X * Ref.Width / Size.Width - Ref.Est
Dim La As Decimal = P.Y * Ref.Hight / Size.Height - Ref.Sud
If Lo < 0 Then C.Longitude.Axe = 3 Else C.Longitude.Axe = 2
C.Longitude.Value = Math.Abs(Lo)
If La < 0 Then C.Latitude.Axe = 0 Else C.Latitude.Axe = 1
C.Latitude.Value = Math.Abs(La)
Aire.Add(C)
End Sub
Function PrintLastPoint() As String
If Aire.Count > 0 Then
Dim C As New Position
C = Aire.Item(Aire.Count - 1)
Return C.Text
Else : Return ""
End If
End Function
End Class
Class Planche_Geodesique
Inherits SplitContainer
Friend WithEvents Dessin As New Plan_Geodesique With {.Name = "Dessin", _
.SizeMode = PictureBoxSizeMode.StretchImage, _
.Image = Form1.Cadre.Image.Clone, _
.Dock = DockStyle.Fill}
Dim Info As New Label With {.Size = New Point(15, 17), _
.Anchor = 13, _
.Location = New System.Drawing.Point(5, 1)}
#Region "Events"
Sub Plot(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Dessin.MouseClick
Dessin.SetPoint(e)
Info.Text = Dessin.PrintLastPoint
Dessin.TireLigne()
End Sub
#End Region
Sub New()
Name = "Panel"
Dock = DockStyle.Fill
' Size = New Point(130, 110)
SplitterDistance = 100
Panel1.Controls.Add(Dessin)
Panel2.Controls.Add(Info)
End Sub
End Class
Class Duke
Inherits Planche_Geodesique
#Region "DECLARE: Region"
Private my_NewPoints As Integer = 0
Private my_RegionId As Integer = 0
Dim MesRegions() As MaRegion = Nothing
Structure MaRegion
Dim mr_Nom As String
Dim mr_Path As System.Drawing.Drawing2D.GraphicsPath
End Structure
Private my_Points() As Point = Nothing
#End Region
#Region "Outils"
Dim FlagTexttGP As New System.Windows.Forms.Label With {.Name = "FlagTextGP", _
.AutoSize = True, _
.Location = New System.Drawing.Point(5, 15), _
.Size = New System.Drawing.Size(15, 17), _
.TabIndex = 3, _
.Text = "Aucun"}
Dim txtNomGP As New System.Windows.Forms.TextBox With {.Name = "txtNomGP", _
.Location = New System.Drawing.Point(5, 26), _
.Size = New System.Drawing.Size(15, 22), _
.Anchor = 15, _
.TabIndex = 4}
Dim ButtonAjouter As New System.Windows.Forms.Button With {.Name = "ButtonAjouter", _
.Location = New System.Drawing.Point(5, 43), _
.Size = New System.Drawing.Size(15, 20), _
.TabIndex = 1, _
.Text = "Ajouter", _
.Anchor = 13, _
.UseVisualStyleBackColor = True}
Dim ButtonInit As New System.Windows.Forms.Button With {.Name = "ButtonInit", _
.Location = New System.Drawing.Point(5, 60), _
.Size = New System.Drawing.Size(15, 22), _
.TabIndex = 1, _
.Text = "Tout réinitialiser", _
.Anchor = 13, _
.UseVisualStyleBackColor = True}
Dim ButtonClear As New System.Windows.Forms.Button With {.Name = "ButtonClear", _
.Location = New System.Drawing.Point(5, 80), _
.Size = New System.Drawing.Size(15, 20), _
.TabIndex = 1, _
.Text = "Nettoyer", _
.Anchor = 13, _
.UseVisualStyleBackColor = True}
Dim RegionsListBox As New System.Windows.Forms.ListBox With {.Name = "RegionsListBox", _
.FormattingEnabled = True, _
.ItemHeight = 16, _
.Location = New System.Drawing.Point(5, 100), _
.Size = New System.Drawing.Size(15, 1), _
.Anchor = 15, _
.TabIndex = 3}
Dim labTag As New System.Windows.Forms.Label With {.Name = "labTag", _
.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D, _
.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)), _
.ForeColor = System.Drawing.SystemColors.HotTrack, _
.Location = New System.Drawing.Point(12, 601), _
.Dock = DockStyle.Bottom, _
.Size = New System.Drawing.Size(623, 30), _
.TabIndex = 6, _
.TextAlign = System.Drawing.ContentAlignment.MiddleCenter}
Dim picTampon As New System.Windows.Forms.PictureBox With {.Name = "picTampon", _
.Location = New System.Drawing.Point(12, 31), _
.Size = New System.Drawing.Size(612, 567), _
.TabIndex = 5, _
.TabStop = False, _
.Visible = False}
#End Region
Private Sub DessinDetectable(ByVal pCoord As Point)
If FlagTexttGP.Text <> "Aucun" Or
MesRegions Is Nothing _
Then Exit Sub
Dim id As Integer
For id = 0 To MesRegions.Length - 1
If MesRegions(id).mr_Path.IsVisible(pCoord) = True Then
Me.labTag.Text = MesRegions(id).mr_Nom
Dessin.Cursor = Cursors.Hand
Exit For
Else
Me.labTag.Text = ""
Dessin.Cursor = Cursors.Default
End If
Next
End Sub
Sub New()
Panel2.Controls.Add(ButtonAjouter)
Panel2.Controls.Add(ButtonInit)
Panel2.Controls.Add(ButtonClear)
Panel2.Controls.Add(txtNomGP)
Panel2.Controls.Add(RegionsListBox)
Panel2.Controls.Add(FlagTexttGP)
Panel1.Controls.Add(labTag)
picTampon.Image = DirectCast(Dessin.Image.Clone, Bitmap)
End Sub
End Class
End Module
Public Class Form1
Dim MouseclickedDown As Boolean = False
Dim Ouest As Byte = 170
Dim Est As Byte = 190
Dim Nord As Byte = 85
Dim Sud As Byte = 70
Private Sub Cadre_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Cadre.MouseDown
Dim A As Integer = Ouest : A = (A + Est)
Dim w As Integer = A * e.X / Cadre.Size.Width
Label2.Text = w
A = Nord : A = (A + Sud)
Dim h As Integer = A * e.Y / Cadre.Size.Height
Label1.Text = h
MouseclickedDown = True
End Sub
Private Sub Cadre_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Cadre.MouseMove
End Sub
Private Sub Cadre_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Cadre.MouseUp
MouseclickedDown = False
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim F As New Form
Dim P As New Duke
F.Size = New Point(500, 300)
F.Controls.Add(P)
F.StartPosition = FormStartPosition.CenterScreen
F.Show()
End Sub
End Class
Je sais pas quand je pourrais finir.
En tous cas, Merci Duke.
18 juin 2015 à 11:19
La géodésie fonctionne bien. Avec un zoom sur une selection qui n'affecte pas les couleurs, on peut peaufiner les détails sans re-inventer le programme.
Les formules sont vérifiées, mais la structure et les labels seraient avantageugement améliorés que ça mangerait pas de pain.
Je recommence tout dans un module "Evolution" qui devrait idéaliser l'approche de l'analyse graphique (vectorialiser les pixels de la courbe) et introduire la reconaissance de forme.
L'objectif est de re-générer la courbe avec un algorythme de Fornar, sorte d'anachronisme qui suppose qu'une application qui colle au passé devrait donner une idée de l'avenir.
On pourrait décomposer en série de Fourrier si le digital ne convenait pas mieux a l'algorithmie qu'au calcul.
Certains savent quel objets de la librairie produisent des adaptations vérifiées, mais ils visitent d'autres sujets. Je recommencerais donc.
Au revoir, et merci Whismeril pour tes encouragements, A bientôt pour un autre sujet.
Bravo Duke et Whismeril et Merci.
15 juin 2015 à 04:38
Attendez la version finale. C'est comme le scroll, il faut mettre l'objet visual dans le repère, pas greffer des repéres dans l'Óbject.
11 juin 2015 à 19:02
11 juin 2015 à 12:59
C'est pas grand chose mais ca fonctionne.
11 juin 2015 à 08:06
J'ai trouvé une solution qui marche au petit poil, mais trop brouillon pour développer. Heureusement, je découvre "ENUM" qui change tout.
Jái pas débuggé mais tant pi car
JE MIS, J'ÔTE.
Je sais pas si ca va marcher mais ce qui suit me botte.
Faut-il continuer ?
Je vais commencer par encapsuler tout ca dans des Tabcontroles pur laisser de la place au développements,
Modifié par Whismeril le 6/06/2015 à 11:43
Concernant la géodésie, domaine que j'ai pratiqué pendant plus de 10 ans, pour conserver une précision inférieure au mètre dans les changements de repère, il ne faut pas utiliser les transformation linéaire
Je t'invite à consulter le site de l'IGN, référence dans le domaine.
Modifié par Whismeril le 6/06/2015 à 11:26
C'aurait pu être un Snippet comme je préfère.
C'est domage qu'il utilise une carte de France en ressources,
car copier c'est moins fatigant que télécharger la solution.
De toutes façon, et, compte tenu que le concepteur Microsoft s'est toujours pas amélioré,
le simple fait d'hériter un outil visuel brouille.
Donc on peut faire ni mieux, ni plus simple qu'en solution.
Le code est bien commenté; vous devriez avoir un tas d'idée a partir de mon code
La première idée qui me vient, c'est d'afficher les coordonneées GEODESIQUES on click.
J'ai donc commencer par m'informer sur le sujet, et j'ai stupidement suivi les instructions suivantes:
http://fr.wikipedia.org/wiki/Syst%C3%A8me_sexag%C3%A9simal
http://fr.wikipedia.org/wiki/Coordonn%c3%a9es_g%c3%a9ographiques
http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_coordonn%C3%A9es_(cartographie)
Que je suis arrivé à
J'ai débuggé jusqu'qu'à m'appercevoir que si ça fonctionne parfaitement,
les nombreux changements répètés de repères et les formules bien que linéaires,
ainsi que la précision des calculs, enregistraient avec une précision de quelques degrés avec une régularitè digne d'un générateur alléatoire.
On peut en faire un début d'introduction de didactique pré trigo sphèrique.
J'ai donc tout effacé pour changer d'arithmètique.
Et j'ai perdu un programme qui fonctionnait bien, mais qu'il reste une vieille sauvegarde ci-dessus qui idonne une idée de ce qu'il faut pas faire.
Je TRAVAILLE sur une nouvelle structure
Je sais pas quand je pourrais finir.
En tous cas, Merci Duke.