OVH Cloud OVH Cloud

Géométrie

13 réponses
Avatar
Daniel AUBRY
Je suis peut être hors sujet mais c'est du VB quand même
alors je tente .................

Je dois restituer à l'écran un imprimé existant.
Je le dessine dans un picturebox.
Seulement il y a des courbes dont je ne connais ni le rayon
ni les coordonnées du centre.
Je connais uniquement 3 points dans un quadrillage.
Un balu de chez balu en géométrie pourrait-il me tirer de ce mauvais pas ?

Grand merci d'avance !!!!!!

10 réponses

1 2
Avatar
Jean-Marc
"Daniel AUBRY" a écrit dans le message de
news:418e73b6$0$3449$
Je suis peut être hors sujet mais c'est du VB quand même
alors je tente .................

Je dois restituer à l'écran un imprimé existant.
Je le dessine dans un picturebox.
Seulement il y a des courbes dont je ne connais ni le rayon
ni les coordonnées du centre.
Je connais uniquement 3 points dans un quadrillage.
Un balu de chez balu en géométrie pourrait-il me tirer de ce mauvais pas ?



Hello,

Soit tes 3 points A(x1,y1) B(x2,y2) C(x3,y3).
Ce qu'on cherche, c'est le centre, de coordonnées X et Y ainsi que
le rayon, R.
On sait que l'équation générale d'un cercle, c'est:
(x- XC)^2 + (y-YC)^2 = R. Prenons un point M sur le cercle,
posons quelques équations et ...
quelques mathématiques plus tard, on arrive à un système d'équations
à 4 inconnues, ce qui nous amène à devoir résoudre ceci:

| x^2 + y^2 x y 1 |
DET | x1^2 + y1^2 x1 y1 1 | = 0
| x2^2 + y2^2 x2 y2 1 |
| x3^2 + y3^2 x3 y3 1 |

Le déterminant d'une matrice 4*4, ce n'est pas très amusant à calculer.
L'idée est donc de se ramener à une série de matrices 3*3, dont le
déterminant est beaucoup plus sympathique.

On a le théorème suivant, qui nous dit que pour une matrice i*j
(i les lignes, j les colonnes), on peut développer en ligne ou
en colonnes.
Prenons le développement selon la ième ligne, le théorème nous dit:

DET = Somme de j=1 à N de (-1)^(i+j) * a(ij) * DET(ij),
ou a(ij) est le coeff de la matrice en position ij et
DET(ij) est le déterminant de la matrice obtenue en ENLEVANT
la ligne i et la colonne j.

Ceci n'est pas mal, car du coup nous voila amené à calculer des
déterminants de matrices 3*3, ce qui est aisé gràce la règle
de Sarrus, qui nous dit que:

|a d g|
det |b e h| = aei + dhc + gbf - ceg -fha -ibd
|c f i|

une fois ceci fait, et bien il ne reste plus qu'à identifier les
choses termes à termes, et a faire une judicieuse factorisation pour
se ramener à la forme canonique; une fois la, le centre est trouvé et
le calcul du rayon est trivial. Mais assez fait de maths, il est tard,
revenons à la programmation de ceci, ce qui est étonnament simple une
fois ce qui précède bien compris.

Hop, il ne reste plus qu'à écrire une petite fonction qui va nous calculer
tout ceci:

Il faut créer un type public point, comme ceci:

Public Type point
x As Double
y As Double
End Type

Puis la fonction elle même, qu prend en paramètres 3 points et
retourne un point M pour le centre, et le rayon R. C'est une
fonction, elle retourne toujours TRUE (on pourrait rajouter
du control d'erreur, etc.). Bref, la voici:

Public Function calculCentreRayon( a As point, _
b As point, _
c As point, _
m As point, _
r As Double) As Boolean
Dim mat(4, 4) As Double
Dim p1 As Double
Dim p2 As Double
Dim p3 As Double

' ligne 2
mat(2, 1) = a.x ^ 2 + a.y ^ 2: mat(2, 2) = a.x:
mat(2, 3) = a.y: mat(2, 4) = 1
' ligne 3
mat(3, 1) = b.x ^ 2 + b.y ^ 2: mat(3, 2) = b.x:
mat(3, 3) = b.y: mat(3, 4) = 1
' ligne 4
mat(4, 1) = c.x ^ 2 + c.y ^ 2: mat(4, 2) = c.x:
mat(4, 3) = c.y: mat(4, 4) = 1

' 3 partielles
p1 = (-1) ^ (1 + 1) * mat_sarrus(mat, 1)
p2 = (-1) ^ (1 + 2) * mat_sarrus(mat, 2)
p3 = (-1) ^ (1 + 3) * mat_sarrus(mat, 3)
' calcul du centre
m.x = p2 / (-2 * p1)
m.y = p3 / (-2 * p1)
' puis le rayon avec le point a par exemple
r = Sqr((a.x - m.x) ^ 2 + (a.y - m.y) ^ 2)
calculCentreRayon = True
End Function

Private Function mat_sarrus(m() As Double, jj As Integer) As Double
Dim a As Double, b As Double, c As Double
Dim d As Double, e As Double, f As Double
Dim g As Double, h As Double, i As Double

Select Case jj
Case 1
a = m(2, 2): b = m(3, 2): c = m(4, 2)
d = m(2, 3): e = m(3, 3): f = m(4, 3)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 2
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 3): e = m(3, 3): f = m(4, 3)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 3
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 2): e = m(3, 2): f = m(4, 2)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 4
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 2): e = m(3, 2): f = m(4, 2)
g = m(2, 3): h = m(3, 3): i = m(4, 3)
End Select
mat_sarrus = (a * e * i) + (d * h * c) + (g * b * f) - (c * e * g) - (f
* h * a) - (i * b * d)
End Function


Et voici un exemple d'appel:

Private Sub Command1_Click()
Dim a As point
Dim b As point
Dim c As point
Dim m As point
Dim r As Double
Dim res As Boolean

a.x = 1: a.y = 0
b.x = -1: b.y = 2
c.x = 3: c.y = 1

res = calculCentreRayon(a, b, c, m, r)
If res Then
MsgBox "le centre est (" & m.x & "," & m.y & ") et le rayon=" & r
End If
End Sub

Et voila!


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Daniel AUBRY
Je cherchais un balu, mais alors là ...............
Monsieur Balu !!!!!!!!!!!!!!!!!!!!!

je vais tenter de mettre tout ceci en application ce matin.

Merci beaucoup.

Dany
"Jean-Marc" a écrit dans le message de news:
418e9a54$0$16540$
"Daniel AUBRY" a écrit dans le message de
news:418e73b6$0$3449$
Je suis peut être hors sujet mais c'est du VB quand même
alors je tente .................

Je dois restituer à l'écran un imprimé existant.
Je le dessine dans un picturebox.
Seulement il y a des courbes dont je ne connais ni le rayon
ni les coordonnées du centre.
Je connais uniquement 3 points dans un quadrillage.
Un balu de chez balu en géométrie pourrait-il me tirer de ce mauvais pas
?



Hello,

Soit tes 3 points A(x1,y1) B(x2,y2) C(x3,y3).
Ce qu'on cherche, c'est le centre, de coordonnées X et Y ainsi que
le rayon, R.
On sait que l'équation générale d'un cercle, c'est:
(x- XC)^2 + (y-YC)^2 = R. Prenons un point M sur le cercle,
posons quelques équations et ...
quelques mathématiques plus tard, on arrive à un système d'équations
à 4 inconnues, ce qui nous amène à devoir résoudre ceci:

| x^2 + y^2 x y 1 |
DET | x1^2 + y1^2 x1 y1 1 | = 0
| x2^2 + y2^2 x2 y2 1 |
| x3^2 + y3^2 x3 y3 1 |

Le déterminant d'une matrice 4*4, ce n'est pas très amusant à calculer.
L'idée est donc de se ramener à une série de matrices 3*3, dont le
déterminant est beaucoup plus sympathique.

On a le théorème suivant, qui nous dit que pour une matrice i*j
(i les lignes, j les colonnes), on peut développer en ligne ou
en colonnes.
Prenons le développement selon la ième ligne, le théorème nous dit:

DET = Somme de j=1 à N de (-1)^(i+j) * a(ij) * DET(ij),
ou a(ij) est le coeff de la matrice en position ij et
DET(ij) est le déterminant de la matrice obtenue en ENLEVANT
la ligne i et la colonne j.

Ceci n'est pas mal, car du coup nous voila amené à calculer des
déterminants de matrices 3*3, ce qui est aisé gràce la règle
de Sarrus, qui nous dit que:

|a d g|
det |b e h| = aei + dhc + gbf - ceg -fha -ibd
|c f i|

une fois ceci fait, et bien il ne reste plus qu'à identifier les
choses termes à termes, et a faire une judicieuse factorisation pour
se ramener à la forme canonique; une fois la, le centre est trouvé et
le calcul du rayon est trivial. Mais assez fait de maths, il est tard,
revenons à la programmation de ceci, ce qui est étonnament simple une
fois ce qui précède bien compris.

Hop, il ne reste plus qu'à écrire une petite fonction qui va nous calculer
tout ceci:

Il faut créer un type public point, comme ceci:

Public Type point
x As Double
y As Double
End Type

Puis la fonction elle même, qu prend en paramètres 3 points et
retourne un point M pour le centre, et le rayon R. C'est une
fonction, elle retourne toujours TRUE (on pourrait rajouter
du control d'erreur, etc.). Bref, la voici:

Public Function calculCentreRayon( a As point, _
b As point, _
c As point, _
m As point, _
r As Double) As Boolean
Dim mat(4, 4) As Double
Dim p1 As Double
Dim p2 As Double
Dim p3 As Double

' ligne 2
mat(2, 1) = a.x ^ 2 + a.y ^ 2: mat(2, 2) = a.x:
mat(2, 3) = a.y: mat(2, 4) = 1
' ligne 3
mat(3, 1) = b.x ^ 2 + b.y ^ 2: mat(3, 2) = b.x:
mat(3, 3) = b.y: mat(3, 4) = 1
' ligne 4
mat(4, 1) = c.x ^ 2 + c.y ^ 2: mat(4, 2) = c.x:
mat(4, 3) = c.y: mat(4, 4) = 1

' 3 partielles
p1 = (-1) ^ (1 + 1) * mat_sarrus(mat, 1)
p2 = (-1) ^ (1 + 2) * mat_sarrus(mat, 2)
p3 = (-1) ^ (1 + 3) * mat_sarrus(mat, 3)
' calcul du centre
m.x = p2 / (-2 * p1)
m.y = p3 / (-2 * p1)
' puis le rayon avec le point a par exemple
r = Sqr((a.x - m.x) ^ 2 + (a.y - m.y) ^ 2)
calculCentreRayon = True
End Function

Private Function mat_sarrus(m() As Double, jj As Integer) As Double
Dim a As Double, b As Double, c As Double
Dim d As Double, e As Double, f As Double
Dim g As Double, h As Double, i As Double

Select Case jj
Case 1
a = m(2, 2): b = m(3, 2): c = m(4, 2)
d = m(2, 3): e = m(3, 3): f = m(4, 3)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 2
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 3): e = m(3, 3): f = m(4, 3)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 3
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 2): e = m(3, 2): f = m(4, 2)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 4
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 2): e = m(3, 2): f = m(4, 2)
g = m(2, 3): h = m(3, 3): i = m(4, 3)
End Select
mat_sarrus = (a * e * i) + (d * h * c) + (g * b * f) - (c * e * g) - (f
* h * a) - (i * b * d)
End Function


Et voici un exemple d'appel:

Private Sub Command1_Click()
Dim a As point
Dim b As point
Dim c As point
Dim m As point
Dim r As Double
Dim res As Boolean

a.x = 1: a.y = 0
b.x = -1: b.y = 2
c.x = 3: c.y = 1

res = calculCentreRayon(a, b, c, m, r)
If res Then
MsgBox "le centre est (" & m.x & "," & m.y & ") et le rayon=" & r
End If
End Sub

Et voila!


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Daniel AUBRY
Bonsoir,

j'ai mis tout ceci en application et cela marche impeccable.
Seulement il me reste un probleme :
le cercle traverse un quadrillage et je voudrais qu'il soit invisible avant
et après ce quadrillage.

Si je ne suis pas clair j'ai mis un imprim-ecran à cette adresse :
http://www.daniel-aubry.com/courbe

L'aide de VB pour Circle donne ceci :
Facultatif. Valeurs en précision simple. Lorsqu'un arc, une partie de
cercle ou une ellipse est tracée, les arguments start et end spécifient
(en radians) les points d'origine et de fin de l'arc. La plage de ces deux
valeurs s'étend de -2 à 2 pi radians. La valeur par défaut de start est
0 radians ; celle de end est 2 pi radians.

??????????????????????????????????????


"Jean-Marc" a écrit dans le message de news:
418e9a54$0$16540$
"Daniel AUBRY" a écrit dans le message de
news:418e73b6$0$3449$
Je suis peut être hors sujet mais c'est du VB quand même
alors je tente .................

Je dois restituer à l'écran un imprimé existant.
Je le dessine dans un picturebox.
Seulement il y a des courbes dont je ne connais ni le rayon
ni les coordonnées du centre.
Je connais uniquement 3 points dans un quadrillage.
Un balu de chez balu en géométrie pourrait-il me tirer de ce mauvais pas
?



Hello,

Soit tes 3 points A(x1,y1) B(x2,y2) C(x3,y3).
Ce qu'on cherche, c'est le centre, de coordonnées X et Y ainsi que
le rayon, R.
On sait que l'équation générale d'un cercle, c'est:
(x- XC)^2 + (y-YC)^2 = R. Prenons un point M sur le cercle,
posons quelques équations et ...
quelques mathématiques plus tard, on arrive à un système d'équations
à 4 inconnues, ce qui nous amène à devoir résoudre ceci:

| x^2 + y^2 x y 1 |
DET | x1^2 + y1^2 x1 y1 1 | = 0
| x2^2 + y2^2 x2 y2 1 |
| x3^2 + y3^2 x3 y3 1 |

Le déterminant d'une matrice 4*4, ce n'est pas très amusant à calculer.
L'idée est donc de se ramener à une série de matrices 3*3, dont le
déterminant est beaucoup plus sympathique.

On a le théorème suivant, qui nous dit que pour une matrice i*j
(i les lignes, j les colonnes), on peut développer en ligne ou
en colonnes.
Prenons le développement selon la ième ligne, le théorème nous dit:

DET = Somme de j=1 à N de (-1)^(i+j) * a(ij) * DET(ij),
ou a(ij) est le coeff de la matrice en position ij et
DET(ij) est le déterminant de la matrice obtenue en ENLEVANT
la ligne i et la colonne j.

Ceci n'est pas mal, car du coup nous voila amené à calculer des
déterminants de matrices 3*3, ce qui est aisé gràce la règle
de Sarrus, qui nous dit que:

|a d g|
det |b e h| = aei + dhc + gbf - ceg -fha -ibd
|c f i|

une fois ceci fait, et bien il ne reste plus qu'à identifier les
choses termes à termes, et a faire une judicieuse factorisation pour
se ramener à la forme canonique; une fois la, le centre est trouvé et
le calcul du rayon est trivial. Mais assez fait de maths, il est tard,
revenons à la programmation de ceci, ce qui est étonnament simple une
fois ce qui précède bien compris.

Hop, il ne reste plus qu'à écrire une petite fonction qui va nous calculer
tout ceci:

Il faut créer un type public point, comme ceci:

Public Type point
x As Double
y As Double
End Type

Puis la fonction elle même, qu prend en paramètres 3 points et
retourne un point M pour le centre, et le rayon R. C'est une
fonction, elle retourne toujours TRUE (on pourrait rajouter
du control d'erreur, etc.). Bref, la voici:

Public Function calculCentreRayon( a As point, _
b As point, _
c As point, _
m As point, _
r As Double) As Boolean
Dim mat(4, 4) As Double
Dim p1 As Double
Dim p2 As Double
Dim p3 As Double

' ligne 2
mat(2, 1) = a.x ^ 2 + a.y ^ 2: mat(2, 2) = a.x:
mat(2, 3) = a.y: mat(2, 4) = 1
' ligne 3
mat(3, 1) = b.x ^ 2 + b.y ^ 2: mat(3, 2) = b.x:
mat(3, 3) = b.y: mat(3, 4) = 1
' ligne 4
mat(4, 1) = c.x ^ 2 + c.y ^ 2: mat(4, 2) = c.x:
mat(4, 3) = c.y: mat(4, 4) = 1

' 3 partielles
p1 = (-1) ^ (1 + 1) * mat_sarrus(mat, 1)
p2 = (-1) ^ (1 + 2) * mat_sarrus(mat, 2)
p3 = (-1) ^ (1 + 3) * mat_sarrus(mat, 3)
' calcul du centre
m.x = p2 / (-2 * p1)
m.y = p3 / (-2 * p1)
' puis le rayon avec le point a par exemple
r = Sqr((a.x - m.x) ^ 2 + (a.y - m.y) ^ 2)
calculCentreRayon = True
End Function

Private Function mat_sarrus(m() As Double, jj As Integer) As Double
Dim a As Double, b As Double, c As Double
Dim d As Double, e As Double, f As Double
Dim g As Double, h As Double, i As Double

Select Case jj
Case 1
a = m(2, 2): b = m(3, 2): c = m(4, 2)
d = m(2, 3): e = m(3, 3): f = m(4, 3)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 2
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 3): e = m(3, 3): f = m(4, 3)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 3
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 2): e = m(3, 2): f = m(4, 2)
g = m(2, 4): h = m(3, 4): i = m(4, 4)
Case 4
a = m(2, 1): b = m(3, 1): c = m(4, 1)
d = m(2, 2): e = m(3, 2): f = m(4, 2)
g = m(2, 3): h = m(3, 3): i = m(4, 3)
End Select
mat_sarrus = (a * e * i) + (d * h * c) + (g * b * f) - (c * e * g) - (f
* h * a) - (i * b * d)
End Function


Et voici un exemple d'appel:

Private Sub Command1_Click()
Dim a As point
Dim b As point
Dim c As point
Dim m As point
Dim r As Double
Dim res As Boolean

a.x = 1: a.y = 0
b.x = -1: b.y = 2
c.x = 3: c.y = 1

res = calculCentreRayon(a, b, c, m, r)
If res Then
MsgBox "le centre est (" & m.x & "," & m.y & ") et le rayon=" & r
End If
End Sub

Et voila!


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Jean-Marc
"Daniel AUBRY" a écrit dans le message de
news:418fa5c7$0$9039$
Bonsoir,

j'ai mis tout ceci en application et cela marche impeccable.
Seulement il me reste un probleme :
le cercle traverse un quadrillage et je voudrais qu'il soit invisible


avant
et après ce quadrillage.

Si je ne suis pas clair j'ai mis un imprim-ecran à cette adresse :
http://www.daniel-aubry.com/courbe

L'aide de VB pour Circle donne ceci :
Facultatif. Valeurs en précision simple. Lorsqu'un arc, une partie de
cercle ou une ellipse est tracée, les arguments start et end spécifient
(en radians) les points d'origine et de fin de l'arc. La plage de ces deux
valeurs s'étend de -2 à 2 pi radians. La valeur par défaut de start est
0 radians ; celle de end est 2 pi radians.



Hello,

content que a fonctionne. Pour le reste, hmm..

Plusieurs solutions comme ça à vue de nez:
1/ Comme un bourrin - Difficulté= 1/5
après avoir dessiné tes cercles, tu dessines des rectangles
blancs tout autour du quadrillage, les rectangles blancs vont
recouvrir les portions non désirées des arcs.

2/ Comme un petit malin - Difficulté= 2/5
Tu as ton centre et ton rayon, et bien tu n'as qu'à dessiner toi
même ton cercle, à coup de line. Si tu prends un pas suffisament
petit, le résultat est nickel et surtout, comme tu calcules toi
même chaque x et chaque y, il te suffit de tester que le point est
dans le quadrillage. Si oui tu traces, sinon tu traces pas.

3/ Comme un chef - Difficulté= 5/5
Tu calcules les points d'intersections de ton cercle et des bords
de ton quadrillage. Une fois ces points connus, tu calcules les
angles de départ et d'arrivée de ton cercle, et tu passes ça en
paamètre à l'appel de ta fonctions.

Moi j'implémenterais la solution 2.


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Daniel AUBRY
Merci de ton aide.

Je vais tenter la solution 2.
Elle me semble plus à ma portée que la 3.

Encore merci.

Dany
"Jean-Marc" a écrit dans le message de news:
418fad1c$0$16547$
"Daniel AUBRY" a écrit dans le message de
news:418fa5c7$0$9039$
Bonsoir,

j'ai mis tout ceci en application et cela marche impeccable.
Seulement il me reste un probleme :
le cercle traverse un quadrillage et je voudrais qu'il soit invisible


avant
et après ce quadrillage.

Si je ne suis pas clair j'ai mis un imprim-ecran à cette adresse :
http://www.daniel-aubry.com/courbe

L'aide de VB pour Circle donne ceci :
Facultatif. Valeurs en précision simple. Lorsqu'un arc, une partie de
cercle ou une ellipse est tracée, les arguments start et end spécifient
(en radians) les points d'origine et de fin de l'arc. La plage de ces
deux
valeurs s'étend de -2 à 2 pi radians. La valeur par défaut de start est
0 radians ; celle de end est 2 pi radians.



Hello,

content que a fonctionne. Pour le reste, hmm..

Plusieurs solutions comme ça à vue de nez:
1/ Comme un bourrin - Difficulté= 1/5
après avoir dessiné tes cercles, tu dessines des rectangles
blancs tout autour du quadrillage, les rectangles blancs vont
recouvrir les portions non désirées des arcs.

2/ Comme un petit malin - Difficulté= 2/5
Tu as ton centre et ton rayon, et bien tu n'as qu'à dessiner toi
même ton cercle, à coup de line. Si tu prends un pas suffisament
petit, le résultat est nickel et surtout, comme tu calcules toi
même chaque x et chaque y, il te suffit de tester que le point est
dans le quadrillage. Si oui tu traces, sinon tu traces pas.

3/ Comme un chef - Difficulté= 5/5
Tu calcules les points d'intersections de ton cercle et des bords
de ton quadrillage. Une fois ces points connus, tu calcules les
angles de départ et d'arrivée de ton cercle, et tu passes ça en
paamètre à l'appel de ta fonctions.

Moi j'implémenterais la solution 2.


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Barsalou
La solution de jean-Marc est élégante mais inutilement compliquée.
Voici une routine plus simple (j'ai omis les déclarations de variables)

Démonstration :
Soient 3 points M1(x1,y1), M2(x2,y2), M3(x3,y3)
On cherche le centre C(x,y) et le rayon R du cercle passant par ces 3
points.

'OM1²= (x - x1)² + (y - y1)² = x² - 2x*x1 + x1² + y² - 2y*y1 + y1² = R²
'OM2²= (x - x2)² + (y - y2)² = x² - 2x*x2 + x2² + y² - 2y*y2 + y2² = R²
'OM3²= (x - x3)² + (y - y3)² = x² - 2x*x3 + x3² + y² - 2y*y3+y3² = R²
'
'OM1² - OM2² = 2x(x2 - x1) + 2y(y2 - y1) + x1² - x2² + y1² - y2² = 0
'OM1² - OM3² = 2x(x3 - x1) + 2y(y3 - y1) + x1² - x3² + y1² - y3² = 0
'
'Posons:
'a1 = 2(x2 - x1)
'b1 = 2(y2 - y1)
'c1 = x1² - x2² + y1² - y2²
'a2 = 2(x3 - x1)
'b2 = 2(y3 - y1)
'c2 = x1² - x3² + y1² - y3²
'
'quantités qui peuvent être calculées immédiatement.
'
'On a :
'a1*x + b1*y + c1 = 0
'a2*x + b2*y + c2 = 0
'
'
'd 'où :
'x = (c1*b2 - c2*b1) / (b1*a2 - b2*a1)
'y = (c2*a1 - c1*a2) / (b1*a2 - b2*a1)
'
'Le calcul de R est ensuite immédiat :
'
'R = sqr [(x - x1)² + (y - y1)²]
'
'NOTA : si le dénominateur b1*a2 - b2*a1 est nul, les 3 points sont alignés
'
D'où la routine :

Public Sub Cercle(x1, y1, x2, y2, x3, y3)
a1 = 2 * (x2 - x1)
a2 = 2 * (x3 - x1)
b1 = 2 * (y2 - y1)
b2 = 2 * (y3 - y1)
c1 = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2
c2 = x1 * x1 - x3 * x3 + y1 * y1 - y3 * y3
dénom = b1 * a2 - b2 * a1
If dénom = 0 Then
'ici appeler une routine pour joindre les 3 points
Else
x = (c1 * b2 - c2 * b1) / dénom
y = (c2 * a1 - c1 * a2) / dénom
R = Sqr((x - x1) * (x - x1) + (y - y1) * (y - y1))
'ici appeler la routine de traçage du cercle
End If
End Sub
Bon courage !
Avatar
Jean-Marc
"Barsalou" a écrit dans le message de
news:
La solution de jean-Marc est élégante mais inutilement compliquée.
Voici une routine plus simple (j'ai omis les déclarations de variables)



Hello,

<snip la très belle démonstration>

Joli, plus efficace et moins compliqué. Certainement la
meilleure façon de faire!

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Jean-Marc
"Daniel AUBRY" a écrit dans le message de
news:418fb4a5$0$6469$
Merci de ton aide.

Je vais tenter la solution 2.
Elle me semble plus à ma portée que la 3.

Encore merci.



Re hello,

Voici un petit exemple au besoin. Il faut:
- une forme
- un pictureBox (5000 * 5000 twip en gros)
- un textBox (pour mettre le rayon)
- un bouton de commande (pour tracer le cercle)

tu cliques un point en dehors du quadrillage, puis tu
entres le rayon dans la textBox (1000 ou 2000 par exemple)
et tu cliques sur le bouton de commande.

Code non optimisé ni rien du tout, mais l'idée générale est la:

Option Explicit
Const CTE_PI = 3.141592653
Dim xc As Single, yc As Single
Dim x1 As Single
Dim y1 As Single
Dim x2 As Single
Dim y2 As Single

'
' pour dessiner le cercle
'
Private Sub Command1_Click()
Dim r As Single
Dim i As Double
Dim x As Single
Dim y As Single
Dim aumoinsun As Boolean

r = Val(Text1.Text)
For i = 0 To 2 * CTE_PI Step 0.005
x = xc + r * Cos(i)
y = yc + r * Sin(i)
If inrect(x, y) Then
If aumoinsun Then
Picture1.Line -(x, y)
Else
Picture1.PSet (x, y)
aumoinsun = True
End If
End If
Next i
End Sub


'
' pour tester si un point (x,y) est dans le rectangle
'
Private Function inrect(x As Single, y As Single) As Boolean
If (x >= x1) And (x <= x2) And (y >= y1) And (y <= y2) Then
inrect = True
End If
End Function

'
' pour dessiner le rectangle au départ
'
Private Sub Form_Activate()
Dim larg As Single
Dim haut As Single

larg = Picture1.Width
haut = Picture1.Height
x1 = larg / 3
y1 = haut / 3
x2 = larg * 2 / 3
y2 = haut * 2 / 3
Picture1.Line (x1, y1)-(x2, y2), , B
End Sub

'
' pour fixer le centre du cercle
'
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As
Single, y As Single)
xc = x
yc = y
Picture1.Line (xc - 30, yc)-(xc + 30, yc)
Picture1.Line (xc, yc - 30)-(xc, yc + 30)
End Sub


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Daniel AUBRY
J'ai tout changé et appliqué ta méthode.
Je ne note pas de différence quant au temps
d'execution mais il y a moins de code.

si vous voulez voir ce que cela donne :
http://www.daniel-aubry.com/courbe

Merci à vous deux.


"Barsalou" a écrit dans le message de news:

La solution de jean-Marc est élégante mais inutilement compliquée.
Voici une routine plus simple (j'ai omis les déclarations de variables)

Démonstration :
Soient 3 points M1(x1,y1), M2(x2,y2), M3(x3,y3)
On cherche le centre C(x,y) et le rayon R du cercle passant par ces 3
points.

'OM1²= (x - x1)² + (y - y1)² = x² - 2x*x1 + x1² + y² - 2y*y1 + y1² = R²
'OM2²= (x - x2)² + (y - y2)² = x² - 2x*x2 + x2² + y² - 2y*y2 + y2² = R²
'OM3²= (x - x3)² + (y - y3)² = x² - 2x*x3 + x3² + y² - 2y*y3+y3² = R²
'
'OM1² - OM2² = 2x(x2 - x1) + 2y(y2 - y1) + x1² - x2² + y1² - y2² = 0
'OM1² - OM3² = 2x(x3 - x1) + 2y(y3 - y1) + x1² - x3² + y1² - y3² = 0
'
'Posons:
'a1 = 2(x2 - x1)
'b1 = 2(y2 - y1)
'c1 = x1² - x2² + y1² - y2²
'a2 = 2(x3 - x1)
'b2 = 2(y3 - y1)
'c2 = x1² - x3² + y1² - y3²
'
'quantités qui peuvent être calculées immédiatement.
'
'On a :
'a1*x + b1*y + c1 = 0
'a2*x + b2*y + c2 = 0
'
'
'd 'où :
'x = (c1*b2 - c2*b1) / (b1*a2 - b2*a1)
'y = (c2*a1 - c1*a2) / (b1*a2 - b2*a1)
'
'Le calcul de R est ensuite immédiat :
'
'R = sqr [(x - x1)² + (y - y1)²]
'
'NOTA : si le dénominateur b1*a2 - b2*a1 est nul, les 3 points sont
alignés
'
D'où la routine :

Public Sub Cercle(x1, y1, x2, y2, x3, y3)
a1 = 2 * (x2 - x1)
a2 = 2 * (x3 - x1)
b1 = 2 * (y2 - y1)
b2 = 2 * (y3 - y1)
c1 = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2
c2 = x1 * x1 - x3 * x3 + y1 * y1 - y3 * y3
dénom = b1 * a2 - b2 * a1
If dénom = 0 Then
'ici appeler une routine pour joindre les 3 points
Else
x = (c1 * b2 - c2 * b1) / dénom
y = (c2 * a1 - c1 * a2) / dénom
R = Sqr((x - x1) * (x - x1) + (y - y1) * (y - y1))
'ici appeler la routine de traçage du cercle
End If
End Sub
Bon courage !


Avatar
Jean-Marc
"Daniel AUBRY" a écrit dans le message de
news:418fdf5b$0$6469$
J'ai tout changé et appliqué ta méthode.
Je ne note pas de différence quant au temps
d'execution mais il y a moins de code.



Guère étonnant. La méthode d'éric est plus simple et plus
"performante" (moins d'opérations arithmétiques et moins d'appels de
fonctions) mais pas suffisament plus pour qu'on puisse mesurer des
différences significatives sur le tracé de quelques dizaines ou
centaines de courbes. Ca deviendrait surement intéressant si on
faisait le calcul des dizaines ou centaines de milliers de fois
(auquel ca on coderait tout ça en C ou en Fortran qu'on appelerait
depuis VB).

si vous voulez voir ce que cela donne :
http://www.daniel-aubry.com/courbe



Très chouette.
tu as utilisé la solution 2 ?

Merci à vous deux.



Mais de rien :-)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
1 2