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

position pixel

16 réponses
Avatar
John-Pet
Bonjour

supposons deux points sur une picturebox
je dessine une ligne droite entre ces deux points
comment connaitre la position de chaques pixels de cette droite

en faite c'est pour tester la couleur des pixels de cette droite
fictive

merci
JP

--
Adresse mail : john-pet@wanadoo.fr
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net

6 réponses

1 2
Avatar
Jacquouille14
John-Pet a écrit :
Bonjour

supposons deux points sur une picturebox
je dessine une ligne droite entre ces deux points
comment connaitre la position de chaques pixels de cette droite

en faite c'est pour tester la couleur des pixels de cette droite fictive

merci
JP




Bonjour,
Par 2 points ne peut passer qu'une et une seule ligne droite, c'est de
la géométrie.
Un tracé entre 2 points est une section de droite et il ne peut y en
avoir qu'une.
Pour connaitre la position des pixels:
- soit on connait la formule de traçage et on peut en tirer
les positions des pixels
- soit on fait un traçage d'une couleur différente et on va
rechercher tous les pixels de cette couleur.
Noter que suivant l'angle d inclinaison de la section de droite par
rapport à l'horizontale les pixels vus en gros plan peuvent former
un "escalier" et donc leurs positions ne sont pas toujours
régulières. Les pixels sont fixes et ont une forme carrée ou
rectangulaire d'où l'effet d'escalier.
Noter que si en géométrie les 2 points et la ligne droite ou la section
de droite ont par convention une épaisseur nulle, le dessin implique
une épaisseur de votre choix.
--

Jacques dit Jacquouille
Avatar
John-Pet
De retour pour répondre à plusieurs posts sans retour de ma part

je remercie donc tous les intervenants pour leurs réponses
je vois en ligne droite la ligne géométrique qui relie les deux points
par le chemin le plus court quelque soit l'angle.Difficile à dessiner
sur un écran et pour cause de pixels
je ne veux pas dessiner de pixels mais récupèrer les coordonnées de
chaques pixels dessiner par la fonction line de vb6 sans dessiner cette
ligne puis récuperer la couleur de ces pixels.

je vais donc passer le reste de mon AM à cogiter sur l'algo de
bresenham qui me semble bien pour mon problème.

Amicalment
JP

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
at
Le 10/01/2010, John-Pet a supposé :
De retour pour répondre à plusieurs posts sans retour de ma part

je remercie donc tous les intervenants pour leurs réponses
je vois en ligne droite la ligne géométrique qui relie les deux points par le
chemin le plus court quelque soit l'angle.Difficile à dessiner sur un écran
et pour cause de pixels
je ne veux pas dessiner de pixels mais récupèrer les coordonnées de chaques
pixels dessiner par la fonction line de vb6 sans dessiner cette ligne puis
récuperer la couleur de ces pixels.

je vais donc passer le reste de mon AM à cogiter sur l'algo de bresenham qui
me semble bien pour mon problème.

Amicalment
JP



J'ai donné la réponse à ton problème (qui n'est pas de moi, la réponse)

Private Sub BresLine(InitialX As Long, InitialY As Long, FinalX As
Long, FinalY As Long)
' Bresenham's line algorithm for Microsoft Visual Basic 6.0
' Implementation by Robert Lee July, 2002 Public Domain

ScaleMode = 1
DrawWidth = 1

Dim Steep As Boolean
Dim DeltaX As Long, DeltaY As Long, Delta As Long
Dim StepX As Long, StepY As Long
Dim Coord As Long


Steep = False
DeltaX = Abs(FinalX - InitialX)
If (FinalX - InitialX) > 0 Then
StepX = 1
Else
StepX = -1
End If
DeltaY = Abs(FinalY - InitialY)
If (FinalY - InitialY) > 0 Then
StepY = 1
Else
StepY = -1
End If
If DeltaY > DeltaX Then
Steep = True
Swap InitialX, InitialY
Swap DeltaX, DeltaY
Swap StepX, StepY
End If
Delta = (DeltaY * 2) - DeltaX
For Coord = 0 To DeltaX - 1
If Steep Then
PSet (InitialY, InitialX), QBColor(3)

Else
PSet (InitialX, InitialY)
End If
While Delta >= 0
InitialY = InitialY + StepY
Delta = Delta - (DeltaX * 2)
Wend
InitialX = InitialX + StepX
Delta = Delta + (DeltaY * 2)
Next Coord
Me.PSet (FinalX, FinalY)
End Sub
Sub Swap(Var1, Var2)
Var1 = Var1 Xor Var2
Var2 = Var2 Xor Var1
Var1 = Var1 Xor Var2
End Sub


Private Sub Command1_Click()
BresLine 1680, 2760, 6240, 4080

End Sub
Avatar
John-Pet
at avait énoncé :
Le 10/01/2010, John-Pet a supposé :
De retour pour répondre à plusieurs posts sans retour de ma part

je remercie donc tous les intervenants pour leurs réponses
je vois en ligne droite la ligne géométrique qui relie les deux points par
le chemin le plus court quelque soit l'angle.Difficile à dessiner sur un
écran et pour cause de pixels
je ne veux pas dessiner de pixels mais récupèrer les coordonnées de chaques
pixels dessiner par la fonction line de vb6 sans dessiner cette ligne puis
récuperer la couleur de ces pixels.

je vais donc passer le reste de mon AM à cogiter sur l'algo de bresenham
qui me semble bien pour mon problème.

Amicalment
JP



J'ai donné la réponse à ton problème (qui n'est pas de moi, la réponse)

Private Sub BresLine(InitialX As Long, InitialY As Long, FinalX As Long,
FinalY As Long)
' Bresenham's line algorithm for Microsoft Visual Basic 6.0
' Implementation by Robert Lee July, 2002 Public Domain

ScaleMode = 1
DrawWidth = 1

Dim Steep As Boolean
Dim DeltaX As Long, DeltaY As Long, Delta As Long
Dim StepX As Long, StepY As Long
Dim Coord As Long


Steep = False
DeltaX = Abs(FinalX - InitialX)
If (FinalX - InitialX) > 0 Then
StepX = 1
Else
StepX = -1
End If
DeltaY = Abs(FinalY - InitialY)
If (FinalY - InitialY) > 0 Then
StepY = 1
Else
StepY = -1
End If
If DeltaY > DeltaX Then
Steep = True
Swap InitialX, InitialY
Swap DeltaX, DeltaY
Swap StepX, StepY
End If
Delta = (DeltaY * 2) - DeltaX
For Coord = 0 To DeltaX - 1
If Steep Then
PSet (InitialY, InitialX), QBColor(3)

Else
PSet (InitialX, InitialY)
End If
While Delta >= 0
InitialY = InitialY + StepY
Delta = Delta - (DeltaX * 2)
Wend
InitialX = InitialX + StepX
Delta = Delta + (DeltaY * 2)
Next Coord
Me.PSet (FinalX, FinalY)
End Sub
Sub Swap(Var1, Var2)
Var1 = Var1 Xor Var2
Var2 = Var2 Xor Var1
Var1 = Var1 Xor Var2
End Sub


Private Sub Command1_Click()
BresLine 1680, 2760, 6240, 4080

End Sub



Merci, j'ai vu cela après l'envoi du message
JP

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
Driss HANIB
Salut LE TROLL

je te signale quand même qu'une ligne en diagonale dans un rectangle est
droite sans aucun problème.
Effectivement il y a une instruction pour tracer la ligne et on n'a pas
besoin de formule mathématique pour cela.

Ceci dit la question posée est de rerouver les coordonnées des points tracés
et je pense qu ta méthode pour retrouver les points d'une ligne n'est pas
bonne ou en tout cas pas complète car justement une ligne peut avoir des
angles différents : les lignes verticales ou horizontales ou diagonales
(45° dans tes carrés) ne sont que des cas particuliers.
Comment gères tu les lignes avec un angles différent de 45 ° ??

Driss


"LE TROLL" <le a écrit dans le message de news:

Bonjour Driss,

Ben oui, il a parlé de :
"je dessine une ligne droite entre ces deux points",.
Donc une ligne "droite" et une droite c'est droit, sinon c'est uns lige
(mais pas droite) !

De facto, une ligne droite peut se mettre dans n'importe quelle figure,
mais il n'y aura que trois possibilités pour qu'elle soit droite :
- verticale
- horizontale
- diagonale (chaque pixel suivant devra être aligné dans la diagonale du
précédent).

Le reste, ce ne sont pas des lignes droites, mais des lignes, et
notamment une ligne qui dans un rectangle toucherait les deux angles
opposés, ne saurait être une ligne droite, mais une ligne tout court.

Je ne joue pas sur les mots, je lis ce qui est écrit (pour une fois),
et il me semble qu'il y a confusion entre la demande (ligne droite) et
ligne tout court, si ma foi, l'auteur, qui s'emble ignorer totalement les
réponses, voulait dire une ligne, il n'avait qu'a ne pas écrire "ligne
droite"...

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Driss HANIB" a écrit dans le message de
news:
Salut LE TROLL

en fait une droite peut aussi être la diah=gonale d'un rectangle !
Ta méthode ne fonctionnera que dans le tracé dans un carré , ce qui est
la moins courante, ou en tout cas la méthode la moins générale.

Il faut mieux passer par une équation de droite, facile à retrouver si tu
as les coordonnées d'un point origine et du point de fin.

Maintenant effectivement comment est réellement représentée la droite sur
l'objet : là est uine autre chose.

Driss
"LE TROLL" <le a écrit dans le message de news:

Cher ami,

C'est nouveau chat, il faudrait faire des mathématiques pour tracer
une ligne maintenant, en VB, avec les fonctions prévues, ah...

Une droite diagonale (qui n'est donc, ni horizontale, ni verticale),
ne peut, il me semble, ne s'inscrire que dans des multiples et
sous-multiples de carrés, sinon ce n'est pas une droite mais une
"TORDUE", avec des "zigue" et des "zagues", or il a dit (car il parle) :
une "DROITE", alors une droite c'est droit, non ?

Et puis il n'est guère intéressé par les réponses a priori...

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Vincent Guichard" a écrit dans le message
de news:4b45ea34$0$963$
Le 07/01/2010 13:00, John-Pet a écrit :
Bonjour


Bonjour,

supposons deux points sur une picturebox
je dessine une ligne droite entre ces deux points
comment connaitre la position de chaques pixels de cette droite



Les droites sont communément tracées en utilisant l'algo de Bresenham,
tu peux faire une recherche dessus. D'autres algorithmes existent, mais
je crois que c'est celui là qui est utilisé dans les "line" de VB6.

en faite c'est pour tester la couleur des pixels de cette droite
fictive



Est-ce que tu considères la droite "réelle" (au sens mathématique) ou
une approximation traçable (par l'algo sus-nommé par exemple)?

Par exemple, si on considère le segment (0,0)-(6,4), la droite de
Bresenham comprendra les pixels (0,0), (1,1), (2,1), (3,2), (4,3), (5,3)
et (6,4) (soit 7 pixels), alors que la droite réelle passe aussi dans
les pixels (1,0), (2,2), (4,2) et (5,4) (soit 11 pixels) (en se
limittant au rectangle inscrit). Et si la droite réelle passe par un
"coin", est-ce que tu veux les pixels de part et d'autre?

merci
JP




Vincent Guichard










Avatar
LE TROLL
Bon jour Driss,

Le problème c'est qu'avec les pixels, une ligne droite est souvent
tordue, alors l'appellation "ligne droite" me semblait impropre, j'aurais
plutôt dit "ligne"... Mais une ligne droite il me semble, ne peut être
qu'une ligne dont chaque pixel est en alignement avec le suivant, soit par
le coin, soit par un des côtés...

Pour la question, il a les coordonnées (heureusement, sinon il faudrait
chercher et éventuellement trouver une ligne dans un dessins (pas simple et
long), ce qu'il veut c'est récupérer la couleur.
Alors je disais : on trace ailleurs un ligne (non visible à l'écran s'il le
faut), de mêmes coordonnées, puis on scanne tous les pixels dans un
rectangle englobant la ligne, et donc on aura ainsi une matrice de la
position de chaque pixel en fonction des coordonnées (on ne retient que les
pixels ayant la couleur de traçage), ensuite il suffira d'appliquer ceci en
le juxtaposant en lecture sur la couleur de la ligne recherché, et on pourra
lire la couleur de chaque "bon" pixel.

Exemple :
J'ai les coordonnées d'une ligne mais pas sa couleur (ses couleurs), je ne
sais par quel miracle, admettons... admettons que la ligne, pour faire
simple, va du pixel 1,1 au pixel 10,1. (de A à B), Je trace donc avec une
couleur qu'il n'y a pas à l'écran évidemment, une ligne
Line(1,1) - (10,1), couleur = C.
Puis je lis en boucle les pixels qui dans un rectangle recouvrent les
coordonnées du tracé, soit :
for i = 1 (A) to 10 (B)
si lecture du pixel (x, y, couleur) = C mets matrice en liste1...
Puis j'efface tout, et j'ai bien une matrice du cheminement de la ligne
allant du point A au point B, alors ?
Ensuite il suffit de récupérer la matrice et de lire les pixels que la ligne
va prendre pour se tracer, soit:
for i = 0 to list1.listcount -1
litPixel( clng( mid(list1,1,3) ) ), clng( mid(list1,4,3) ) ) )
range couleurPixel_Lu dans liste 2...
next i
Et on a bien en list 2 :
0 pixel x y c
1 pixel x1 y1 c1
2 pixel x2 y2 c2

Toutefois, c'est quand même gros, avoir les coordonnées d'une ligne,
mais pas en connaître la couleur, alors qu'au traçage on donne les
coordonnées et la couleur, vas comprendre ?

Dans tout ça, ce qui m'a agacé, c'est que je donne une réponse
exploitable, je l'ai d'ailleurs depuis quasi-testé intégralement en
programmation, et le mec qui vient tous les 6 mois, n'examine même pas les
possibilités VB, et balance une formule (peut être juste), histoire de bien
handicaper ceux qui n'ont pas fait math spé et sup, alors que la réponse est
a priori résolvable en VB et bien plus simple, même si, peut être ? un peu
plus longue !

Cordialement ;o)

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Driss HANIB" a écrit dans le message de
news:
Salut LE TROLL

je te signale quand même qu'une ligne en diagonale dans un rectangle est
droite sans aucun problème.
Effectivement il y a une instruction pour tracer la ligne et on n'a pas
besoin de formule mathématique pour cela.

Ceci dit la question posée est de rerouver les coordonnées des points
tracés et je pense qu ta méthode pour retrouver les points d'une ligne
n'est pas bonne ou en tout cas pas complète car justement une ligne peut
avoir des angles différents : les lignes verticales ou horizontales ou
diagonales (45° dans tes carrés) ne sont que des cas particuliers.
Comment gères tu les lignes avec un angles différent de 45 ° ??

Driss


"LE TROLL" <le a écrit dans le message de news:

Bonjour Driss,

Ben oui, il a parlé de :
"je dessine une ligne droite entre ces deux points",.
Donc une ligne "droite" et une droite c'est droit, sinon c'est uns lige
(mais pas droite) !

De facto, une ligne droite peut se mettre dans n'importe quelle
figure, mais il n'y aura que trois possibilités pour qu'elle soit droite
:
- verticale
- horizontale
- diagonale (chaque pixel suivant devra être aligné dans la diagonale du
précédent).

Le reste, ce ne sont pas des lignes droites, mais des lignes, et
notamment une ligne qui dans un rectangle toucherait les deux angles
opposés, ne saurait être une ligne droite, mais une ligne tout court.

Je ne joue pas sur les mots, je lis ce qui est écrit (pour une fois),
et il me semble qu'il y a confusion entre la demande (ligne droite) et
ligne tout court, si ma foi, l'auteur, qui s'emble ignorer totalement les
réponses, voulait dire une ligne, il n'avait qu'a ne pas écrire "ligne
droite"...

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Driss HANIB" a écrit dans le message de
news:
Salut LE TROLL

en fait une droite peut aussi être la diah=gonale d'un rectangle !
Ta méthode ne fonctionnera que dans le tracé dans un carré , ce qui est
la moins courante, ou en tout cas la méthode la moins générale.

Il faut mieux passer par une équation de droite, facile à retrouver si
tu as les coordonnées d'un point origine et du point de fin.

Maintenant effectivement comment est réellement représentée la droite
sur l'objet : là est uine autre chose.

Driss
"LE TROLL" <le a écrit dans le message de news:

Cher ami,

C'est nouveau chat, il faudrait faire des mathématiques pour tracer
une ligne maintenant, en VB, avec les fonctions prévues, ah...

Une droite diagonale (qui n'est donc, ni horizontale, ni verticale),
ne peut, il me semble, ne s'inscrire que dans des multiples et
sous-multiples de carrés, sinon ce n'est pas une droite mais une
"TORDUE", avec des "zigue" et des "zagues", or il a dit (car il parle)
: une "DROITE", alors une droite c'est droit, non ?

Et puis il n'est guère intéressé par les réponses a priori...

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Vincent Guichard" a écrit dans le message
de news:4b45ea34$0$963$
Le 07/01/2010 13:00, John-Pet a écrit :
Bonjour


Bonjour,

supposons deux points sur une picturebox
je dessine une ligne droite entre ces deux points
comment connaitre la position de chaques pixels de cette droite



Les droites sont communément tracées en utilisant l'algo de Bresenham,
tu peux faire une recherche dessus. D'autres algorithmes existent, mais
je crois que c'est celui là qui est utilisé dans les "line" de VB6.

en faite c'est pour tester la couleur des pixels de cette droite
fictive



Est-ce que tu considères la droite "réelle" (au sens mathématique) ou
une approximation traçable (par l'algo sus-nommé par exemple)?

Par exemple, si on considère le segment (0,0)-(6,4), la droite de
Bresenham comprendra les pixels (0,0), (1,1), (2,1), (3,2), (4,3),
(5,3)
et (6,4) (soit 7 pixels), alors que la droite réelle passe aussi dans
les pixels (1,0), (2,2), (4,2) et (5,4) (soit 11 pixels) (en se
limittant au rectangle inscrit). Et si la droite réelle passe par un
"coin", est-ce que tu veux les pixels de part et d'autre?

merci
JP




Vincent Guichard














1 2