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 ?
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 ?
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 ?
"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."
"Daniel AUBRY" <mail@daniel-aubry.com> a écrit dans le message de
news:418e73b6$0$3449$626a14ce@news.free.fr...
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."
"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."
"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."
"Daniel AUBRY" <mail@daniel-aubry.com> a écrit dans le message de
news:418e73b6$0$3449$626a14ce@news.free.fr...
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."
"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."
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
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.
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
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.
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
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.
"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
avantet 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."
"Daniel AUBRY" <mail@daniel-aubry.com> a écrit dans le message de
news:418fa5c7$0$9039$636a15ce@news.free.fr...
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."
"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
avantet 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."
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)
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)
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)
Merci de ton aide.
Je vais tenter la solution 2.
Elle me semble plus à ma portée que la 3.
Encore merci.
Merci de ton aide.
Je vais tenter la solution 2.
Elle me semble plus à ma portée que la 3.
Encore merci.
Merci de ton aide.
Je vais tenter la solution 2.
Elle me semble plus à ma portée que la 3.
Encore merci.
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 !
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 !
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 !
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.
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.
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.