VB/VB.Net Calcul des coordonnées X ; Y

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonsoir,

j'ai vraiment du mal a calculer les coordonées X ; Y de la map en fonction de la cellid.
Auriez-vous un algo ?

ToOnS m'avait donné ceci qui ne fonctionne pas:

If (cellid = 14) Then
X = 1
Y = 0
Else
X = (cellid Mod 14) + cellid / 28
Y = (cellid Mod 14) - cellid \ 28
End If
Les coordonnées sont vraiment bizard:
Cellid 0 : 0;0 'Ok
Cellid 14 : 1;0 'Ok
Cellid 28 : 1;-1 'non, qui devrait etre 0;2

J'ai fait ceci qui se raproche surement du bon calcul:

x = (i Mod 14)
y = 2 * (i \ 14) + (i Mod 2)
i = (y \ 2) * 14 + x
Bonne soirée
 
Inscrit
16 Aout 2011
Messages
184
Reactions
0
#2
Ahahah ^^ Toi aussi tu fais tes calculs ;) Donc ce que ToOnS a donné est pas très bon ou ne l'est plus ?
 
A

Anonymous

Invité
#3
Bah c'est pas bon mais pourtant son path marche o_o, j'ai juste besoin de savoir si une cell est en bordure
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#4
pour savoir si je suis sur un des 8 bords je fais comme ca :
Code:
'fabrication d'un bitmap
    Public b As Bitmap = New Bitmap(930, 742)
    'création de l'outil de dessin
    Public g As Graphics = Graphics.FromImage(b)
Code:
    Private Sub Draw_Map(ByVal cells As List(Of MapParser.CellData), ByVal PictureBox_ As PictureBox)
        Dim x = 0
        Dim y = 0
        For j = 0 To 39
            For i = 0 To 13
                Dim cellId = j * 14 + i
                Dim line As Boolean = False
                If j And 1 Then ' j est impaire
                    line = True
                    x = i * 64 + 64 ' pour dessiner
                Else ' j est paire
                    x = i * 64 + 32 ' pour dessiner
                End If
                y = j * 18 + 18 ' pour dessiner

                ' 0000 0000 = pas au bord
                Dim Border As Byte = 0
                ' 0000 0001 = bord du haut 
                If j = 0 Then Border += 1
                ' 0000 0010 = bord haut 1
                If j = 1 Then Border += 2
                ' 0000 0100 = bord bas
                If j = 39 Then Border += 4
                ' 0000 1000 = bord bas 1
                If j = 38 Then Border += 8
                ' 0001 0000 = bord gauche  
                If i = 0 And Not line Then Border += 16
                ' 0010 0000 = bord gauche 1 
                If i = 0 And line Then Border += 32
                ' 0100 0000 = bord droit 
                If i = 13 And line Then Border += 64
                ' 1000 0000 = bord droit 1
                If i = 13 And Not line Then Border += 128

                Dim couleur As Color = Color.Green
                If Not cells(cellId).Mov Then couleur = Color.Red

                Dim centre As New Point(x, y)
                DrawPolygon(centre, couleur)
                centre = New Point(centre.X - 10, centre.Y - 7)
                g.DrawString(cellId, Me.Font, Brushes.AliceBlue, centre)
            Next
        Next
        'mise en picturebox
        PictureBox_.Image = b.Clone
    End Sub
avec border as byte (pour avoir 8 bits comme y'a 8 bords) et on peut savoir si on est sur 2 bords en meme temps (par exemple pour cellid=0 , border=17=0001 0001 => gauche et haut)
Code:
    Public Sub DrawPolygon(ByVal centre As Point, ByVal couleur As Color)
        Dim brush = New SolidBrush(couleur)
        Dim points(3) As Point
        points(0) = New Point(centre.X, centre.Y - 18)
        points(1) = New Point(centre.X + 32, centre.Y)
        points(2) = New Point(centre.X, centre.Y + 18)
        points(3) = New Point(centre.X - 32, centre.Y)
        ' dessiner le polygone 
        g.FillPolygon(brush, points)
        g.DrawPolygon(Pens.White, points)
    End Sub
 
A

Anonymous

Invité
#5
Mercii toons sa marche
 
A

Anonymous

Invité
#6
Me revoila ToOnS, j'ai un problème avec mes conditions:

Code:
'si on est pas contre le bord gauche

            If Not .Border = 34 And Not .Border = 40 And Not .Border = 17 And Not .Border = 16 And Not .Border = 32 And Not .Border = 20 And Not .Border = 36 And Not .Border = 33 And Not .Border = 18 And Not .Border = 24 Then

'ensuite, le noeud de droite

            If Not .Border = 130 And Not .Border = 136 And Not .Border = 64 And Not .Border = 128 And Not .Border = 65 And Not .Border = 68 And Not .Border = 129 And Not .Border = 132 And Not .Border = 66 And Not .Border = 72 Then

            'le noeud du dessus
            If Not .Border = 34 And Not .Border = 40 And Not .Border = 1 And Not .Border = 2 And Not .Border = 17 And Not .Border = 65 And Not .Border = 18 And Not .Border = 66 And Not .Border = 33 And Not .Border = 129 Then 'si on est pas contre le bord haut
             

            'le noeud du dessous
            If Not .Border = 40 And Not .Border = 136 And .Border = 4 And Not .Border = 8 And Not .Border = 20 And Not .Border = 68 And Not .Border = 24 And Not .Border = 72 And Not .Border = 36 And Not .Border = 132 Then 'si on est pas contre le bord bas
Je suis bourinné du cerveau avec tout ces calculs XD
C'est bien comme ceci ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#7
3 exmples , les 6 autres ca ressemble :
Code:
   ' si on est contre aucun bord 
            If .Border = 0 Then
                'on ajoute la case du dessus a gauche 
                ADD_Cell(.index, .index - 15 - .Line)
                'on ajoute la case du dessus a droite 
                ADD_Cell(.index, .index - 14 - .Line)
                'on ajoute la case du dessous a gauche 
                ADD_Cell(.index, .index + 13 - .Line)
                'on ajoute la case du dessous a droite 
                ADD_Cell(.index, .index + 14 - .Line)
                If direction = 8 Then
                    'on ajoute la case du dessus (-28)
                    ADD_Cell(.index, .index - 28)
                    'on ajoute la case du dessous (+28)
                    ADD_Cell(.index, .index + 28)
                    'on ajoute la case de gauche (-1)
                    ADD_Cell(.index, .index - 1)
                    'on ajoute la case de droite (+1)
                    ADD_Cell(.index, .index + 1)
                End If
            End If
Code:
 'si on est contre le bord haut
            If .Border And 1 Then
                If Not .Border And 16 Then 'si on est pas contre le bord gauche
                    'on ajoute la case du dessous a gauche 
                    ADD_Cell(.index, .index + 13 - .Line)
                End If
                If Not .Border And 64 Then 'si on est pas contre le bord droite
                    'on ajoute la case du dessous a droite 
                    ADD_Cell(.index, .index + 14 - .Line)
                End If
                If direction = 8 Then
                    'on ajoute la case du dessous (+28)
                    ADD_Cell(.index, .index + 28)
                    If Not .Border And 16 Then 'si on est pas contre le bord gauche
                        'on ajoute la case de gauche (-1)
                        ADD_Cell(.index, .index - 1)
                    End If
                    If Not .Border And 64 Then 'si on est pas contre le bord droite
                        'on ajoute la case de droite (+1)
                        ADD_Cell(.index, .index + 1)
                    End If
                End If
            End If
Code:
'si on est contre le bord gauche
            If .Border And 16 Then
                If Not .Border And 1 Then 'si on est pas contre le bord haut
                    'on ajoute la case du dessus a droite 
                    ADD_Cell(.index, .index - 14 - .Line)
                End If

                If Not .Border And 4 Then 'si on est pas contre le bord bas
                    'on ajoute la case du dessous a droite 
                    ADD_Cell(.index, .index + 14 - .Line)
                End If
                If direction = 8 Then
                    If Not .Border And 1 Then 'si on est pas contre le bord haut
                        'on ajoute la case du dessus (-28)
                        ADD_Cell(.index, .index - 28)
                    End If
                    If (Not .Border And 4) And (Not .Border And 8) Then 'si on est pas contre le bord bas ni sur le bord bas 1
                        'on ajoute la case du dessous (+28)
                        ADD_Cell(.index, .index + 28)
                    End If
                    'on ajoute la case de droite (+1)
                    ADD_Cell(.index, .index + 1)
                End If
            End If
 
Inscrit
16 Aout 2011
Messages
184
Reactions
0
#9
Ouhouh je retire ce que j'ai dit sur le maitre clair de la force xD Je vais m'attarder plus tard sur ce post après avoir débugué mon paquet 3 ( c'est bon mais je dois mettre à jour mon 226 ) ...
 
A

Anonymous

Invité
#10
Je suis desole de t'embeter ToOnS mais diction correspond a la direction du personnage IG ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#11
si direction=8 c'est hors combat si direction=4 (ou autre chose mais bon normalement 4 pour faire pro) c'est en combat (en combat on bouge pas pareil)
 
A

Anonymous

Invité
#12
Euh derniere question tu parle de 6 exemples.
Haut, bas, gauche, droite, centre et le dernier ?
 
A

Anonymous

Invité
#15
Bonsoir,

j'ai repri la prog de mon bot et j'ai voulu trouver l'algo pour calculer X;Y sans passer par la methode de ToOnS et j'ai trouvé ;) !
Mais comment de par hasard j'ai un epic souci:

Y = Cellid / 14

Lorsque la cellid est égale à 26, Y = 2.

26 / 14 = 2 ?!?!?!?

Euh oui oui apparament, c'est ce que mon visual studio veut me dire !
Si je fait une message box au load de ma form il me donne la bonne réponde mais sinon dans mon sub il me donne le nom entier le plus proche. 1.8..... -> 2
Une idee ?

Voila la partie qui nous interesse:
Sub calculXY(ByVal Cellid As UInteger)
Y = Cellid / 14
Dim r = Split(Y, ".")
Y = r(0)

Tien au passage, ceci est bon ?
Dim r = Split(Y, ".")
Y = r(0)

c'est pour les nombre a virgule, je recupere juste le nombre entier.
Enfin je demande au cas ou il y aurai une maniere plus simple.
J'attend de l'aide

Merci
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#16
lolodu92 a dit:
Bonsoir,

...

Tien au passage, ceci est bon ?
Dim r = Split(Y, ".")
Y = r(0)

c'est pour les nombre a virgule, je recupere juste le nombre entier.
Enfin je demande au cas ou il y aurai une maniere plus simple.
J'attend de l'aide

Merci
pour avoir juste le nombre entier : (pas le plus proche mais l'entier sans tenir compte de la virgule : 1.8 -> 1)
dim r = CInt(Math.Floor(Y)) ' split c'est QUE pour les strings
pour le plus proche : (en tenant compte de la virgule : 1.8 -> 2)
dim r = CInt(Y) ' split c'est QUE pour les strings

pour le reste (...) tu as la preuve par toi meme que 26/14 c'est pas =2
 
A

Anonymous

Invité
#17
Ok merci toons mais c'est etrange cette histoire
 
A

Anonymous

Invité
#18
Bonjour,

Me revoila ToOnS avec un nouveau souci, j'ai décidé de reprendre ta façon de faire.
Donc erreur comme d'hab :p

Object reference not set to an instance of an object.
Sur ma variable "Mat", a partir de la cellid 14 tout le reste est nothing.

For j = 0 To 39
For i = 0 To 13
Dim cellId = j * 14 + i
Dim line As Boolean = False
If j And 1 Then ' j est impaire
line = True
x = i * 64 + 64 ' pour dessiner
Else ' j est paire
x = i * 64 + 32 ' pour dessiner
End If
y = j * 18 + 18 ' pour dessiner

' 0000 0000 = pas au bord
Dim Border As Byte = 0
' 0000 0001 = bord du haut
If j = 0 Then Border += 1
' 0000 0010 = bord haut 1
If j = 1 Then Border += 2
' 0000 0100 = bord bas
If j = 39 Then Border += 4
' 0000 1000 = bord bas 1
If j = 38 Then Border += 8
' 0001 0000 = bord gauche
If i = 0 And Not line Then Border += 16
' 0010 0000 = bord gauche 1
If i = 0 And line Then Border += 32
' 0100 0000 = bord droit
If i = 13 And line Then Border += 64
' 1000 0000 = bord droit 1
If i = 13 And Not line Then Border += 128

mat(i) = New node(cellId, x, y, Border, line)
Next
Next

Mon code est bon non ?

Bonne jorunée
 
A

Anonymous

Invité
#19
mat(cellid) = New node(cellId, x, y, Border, line)

et non

mat(i) = New node(cellId, x, y, Border, line)

résolu
 
Haut Bas