Distance entre 2 points sur un cercle

Signaler
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022
-
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022
-
Bonjour,

J'aimerais connaitre comment calculer la distance entre le point O et les points A et B situés sur la circonférence d'un cercle dans le plan horizontal ou bien vertical.

|----------------| | --------A---------------- |
| | | |
A O B | |
| | | |
| | | O |
| | | |
|----------------| |---------B----------------|

Merci de bien vouloir m'aider et bonne année à tous.

18 réponses

Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Bonjour

ça représente quoi tes traits?
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Bonjour, Désolé les espaces entre les traits ont été enlevés.
Ci-Joint une image qui sera plus explicite. Le problème est de connaitre la longueur des segment rouges et verts en horizontal et en vertical ou bien directement la longueur totale et j'en déduirais la longueur de chaque segment selon la position x, y du point cliqué.
Actuellement quand je clique dans le cercle je trace ces segments par une méthode assez lourde qui consiste à faire le tour du cercle et de repérer si x1(x1 = centre +cos(angle)*rayon) se situe sur la ligne du point x, pareil pour y (avec sin(angle). Je cherche donc une méthode plus rapide.
Merci
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
OK en effet c’est plus compréhensible.
Pour conserver les espaces, il faut utiliser les balises de code (voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code)

Le trait total (morceau rouge plus vert) s’appelle la corde, c’est p’us des maths que de la programmation….
Tu as des formules sur l’article Wikipedia

https://fr.wikipedia.org/wiki/Arc_de_cercle

Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Bonjour Whismeril

Merci pour la réponse mais cela ne m'aide pas beaucoup. J'ai quand même compris qu'il faut se servir d'une corde et de sa flèche.
Mais comment déterminer les points x1,y1 et x2,y2 de l'arc en fonction du point x,y situé dans le cercle?
Le but est justement de tracer une corde horizontale et verticale. Hélas mes notions de géométrie sont âgées de plus de 60 ans !!!
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
De ce que je crois comprendre, tu cliques un point sur le cercle, puis un second et ensuite tu veux tracer et donc forcément tu as x et y de chacun.
Donc la question n’aurait pas de sens donc je ne comprends pas tout.

Peux tu expliquer davantage ?
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Bonsoir,
Merci pour le suivi. Non je clique sur UN SEUL point (x,y) puis dans une boucle allant de 0 à PI *2 je regarde si x1 (x1 = centre +Cos(angle)*rayon) est égal au x du point cliqué. Alors je passe à x2 (x2 = centre +Cos(-angle)*rayon) .et je mémorise ces 2 points. Idem pour y1 et y2 mais avec Sin, bien sûr, !).
Comme je fais le tour du cercle j'ai évidemment 2 fois les mêmes x1et y1. Je prends alors la valeur mini pour x1 et maxi pour x2, idem pour y1 et y2.
Ensuite je trace en vert de x1 au point x cliqué et en rouge de x à x2. Idem pour y1 à y puis à y2.
J'espère avoir été plus clair, hé oui tu n'est pas dans ma tête, HIHIHI.
Bonne fin de soirée.
Messages postés
20
Date d'inscription
dimanche 19 janvier 2020
Statut
Membre
Dernière intervention
8 janvier 2022
5
Bonjour à tous,

Si j'ai bien compris il faut calculer les cordes horizontale et verticale.

Exemple pour la corde horizontale:
Sur l'axe vertical, le segment, entre le centre et la corde horizontale, est le sinus de l'angle x.
La longueur de la corde horizontale est égale à 2 fois la valeur absolue de cos(x).

avec cos²(x)=1-sin²(x) on peut calculer cos(x).

Bon week end.
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Bonjour

Bon y’a un truc que je ne comprends toujours pas.
La formule que tu donnes devrait te donner comme parmi les points, le point que tu as cliqué sur le cercle (à condition bien sûr d’avoir cliqué pile poil sur le cercle) et donc le dessin devrait ressembler à ça (fait à la main, j’ai rien sous la main pour faire ça bien)


Du coup, peux élargir tu explication au contexte et ou au besoin
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Bonjour,

Pour le dessin ce n'est pas grave il est suffisamment explicite !
Décidément je dois mal m'expliquer. C'est l'inverse que je voudrais, quand je clique dans le cercle sur un point x,y je voudrais obtenir le point x1 du bord du cercle et son opposé X2 sur l'horizontale de x.
Pareil pour la verticale y1,y2. A partir de là je peux connaitre la longueur de chaque segment vert et rouge par rapport à x,y. J'ai mis ces deux couleurs pour l'exemple afin de bien montrer les deux segments.
En fait je fais des dégradés de couleurs à l'intérieur du cercle et il faut impérativement que je commence au bord de celui-ci. Par exemple je pars du bleu en x1 pour arriver au vert au point cliqué x, de là je continue du vert pour arriver au violet au point x2. Idem pour la verticale y, y2. Ces couleurs ne sont pas absolues, elles sont choisies en fonction du point cliqué.
Il est donc nécessaire de connaitre la longueur de chaque segment afin de déterminer la quantité de chaque composante r,v,b à modifier pour faire la transition d'une couleur à l'autre.

Bon week-end à toi aussi.
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Haaa.
Tu cliques dans le cercle et pas sur le trait……
C’est là le truc que je n’avais pas capté, et pourtant tu as bien écrit dans à chaque fois.
Alors je n’ai pas le temps aujourd’hui, mais demain, j’ai 3 h de train à tuer….A moins que ce soir peut-être.
Avec un peu de trigo et ou de système d’equations ça va le faire
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Bon la météo n’étant pas avec nous, j’ai eu un peu de temps


Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Bonjour Whismeril,

pgl10 a eu la gentillesse de m'expliquer aussi en détail le calcul. En attendant d'essayer de traduire en code toutes ces explications j'utilise mes boucle.


Private Sub POINT_X(yp, x1 As Integer, x2 As Integer) ' limites gauche droite
Dim a As Single, y As Integer
For a = PId2 To deg_270 Step 0.0025 ' 90° > 270°
y = CY + Sin(a) * raY
If y = yp Then
x1 = CX + Cos(a) * raX
x2 = CX + Cos(a + PI) * raX: Exit For
End If
Next a
End Sub

Private Sub POINT_Y(xp, y1 As Integer, y2 As Integer) ' limites haut bas
Dim a As Single, x As Integer
For a = PI To PIm2 Step 0.0025 ' 180° > 360°
x = CX + Cos(a) * raX
If x = xp Then
y1 = CY + Sin(a) * raY
y2 = CY + Sin(a + PI) * raY: Exit For
End If
Next a
End Sub


C'est malgré tout assez rapide mais plus lourd qu'avec un calcul ne visant que deux points au lieu de balayer de 90° à 270° pour x1 et x2 et de 180° à 360° pour y1 et y2 et de sortir quand la valeur est atteinte. Sur l'image d'exemple figure un cercle mais je travaille également avec une ellipse c'est pour cela que j'utilise deux dimensions de rayon.

Voici ce que j'obtiens. Bien sûr les couleurs peuvent être différentes


Bon dimanche
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583 >
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Dis moi, c’est du vb ce code, pas du C#.
Afin que je déplace dans le bon forum peux tu préciser
  • VBS
  • VBA -> précisez:
    • Word
    • Excel
    • Access
    • Powerpoint
    • Autre
  • VB6 (ou antérieur, précisez)
  • VB.Net - précisez la Framework et ->
    • Winform
    • WPF
    • Autre
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022
>
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022

Bonjour,

Oui c'est du VB6. Excuses-moi je croyais avoir choisi le bon forum.
Que penses-tu du résultat ? Je suis un passionné (entre autres) du graphisme et de la manipulation des couleurs...
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583 >
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Sujet déplacé.
J’ai pas vraiment d’avis sur le résultat ne sachant pas si ça doit être artistique ou représentatif d’une valeur ( un gradient de température ou de pression par exemple)
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022
>
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022

Ce n'est qu'un gradient "artistique" ou prétendu tel !
On travaille même le dimanche et vu la météo ambiante ce n'est pas plus mal.
Encore merci pour les conseils et bonne cotinuation.
Messages postés
331
Date d'inscription
samedi 18 décembre 2004
Statut
Membre
Dernière intervention
9 janvier 2022
2
Bonjour Astro49,
Je vais expliquer le calcul demandé dans le cas où le point de départ P={x,y} se trouve dans le deuxième cadran comme dans l'image publiée le 7 janvier à 10:55 où : x<0 et y>0. Soient : A={x1,y} et B={x2,y} les deux points à droite et à gauche du point P. On a x1=r.cos(t1) et y=r.sin(t1) donc : t1=arcsin(y/r) d'où : x1=r.cos(arcsin(y/r)) et x2=-x1. Maintenant, soient : C={x,y1} et D={x,y2} les deux points en haut et en bas du point P. Le point C a pour symétrique par rapport à la verticale centrale un point S={-x,y1} d'où : -x=r.cos(u1) et y1=r.sin(u1) donc : u1=arccos(-x/r) d'où : y1=r.sin(arccos(-x/r)) et y2=-y1. On peut donc facilement calculer dans ce cas les coordonnées des points A, B, C et D. Ceci suffit pour calculer ensuite les longueurs des segments rouges et verts. Si le point P se trouve dans un autre cadran les formules seront différentes mais on peut les définir de manière analogue. Bonne continuation. pgl10
Messages postés
331
Date d'inscription
samedi 18 décembre 2004
Statut
Membre
Dernière intervention
9 janvier 2022
2
Bonjour,
Voici une image où sont placés les points P, A, B, C, D et S du message précédent.


La longueur des segments verts et rouges est donc très facile à calculer
puisqu'on connaît les coordonnées de A, B, C et D.

Cordialement, pgl10

Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Bon VBA est assez limité.
On ne peut pas dessiner ni récupérer les coordonnées du point cliqué, j'ai donc simulé, mais pas "vu" de résultat.
Si je me suis trompé dans le calcul je ne peux pas m'en être rendu compte, tu me diras.

J'ai aussi du me créer 2 types perso pour l'occasion, à toi de remettre en ordre pour VB6.

Private Type LePoint
    X As Double
    Y As Double
End Type

Private Type LesPoints
    A As LePoint
    B As LePoint
    C As LePoint
    D As LePoint
End Type


Les 2 fonctions de changement de repère, en supposant que tes coordonnées sont en pixels ou repère informatique
Private Function PixelVersTrigo(P As LePoint, O As LePoint) As LePoint 'P point cliqué, 0 centre du cercle (pour Origine)
    Dim res As LePoint
    res.x = P.x - O.x 'translation en X pour obtenir une abscisse par rapport au centre du cercle
    res.Y = O.Y - P.Y 'translation en Y avec changement de signe, les pixels étant positifs en Y vers le bas.
    
    PixelVersTrigo = res
End Function

Private Function TrigoVersPixel(Z As LePoint, O As LePoint) As LePoint 'Z point calculé, 0 centre du cercle (pour Origine)
    Dim res As LePoint
    res.x = O.x - Z.x 'translation en X pour obtenir une abscisse en pixels
    res.Y = Z.Y - O.Y 'translation en Y avec changement de signe, les pixels étant positifs en Y vers le bas.
    
    TrigoVersPixel = res
End Function


Le calcul proprement dit
Private Function CalculLignes(P As LePoint, O As LePoint, R As Double) As LesPoints 'P point cliqué, O centre du cercle, R rayon du cercle, A, B, C et D points calculés
    Dim m As LePoint 'point cliqué dans le repère trigo
    m = PixelVersTrigo(P, O)
    
    'on vérifie si le point est dans le cercle
    Dim rho As Double
    rho = Sqr(m.x * m.x + m.Y * m.Y)
    
    If tho > R Then
        MsgBox ("Point cliqué en dehors du cercle")
        Exit Function
    End If
    
    Dim Pi As Double
    Pi = 3.14159
    Dim A, B, C, D As LePoint
    
    Dim aCosTeta As Double
    aCosTeta = Acos(m.x / R)
    
    A.x = m.x
    A.Y = R * Sin(aCosTeta)
    
    B.x = m.x
    B.Y = R * Sin(2 * Pi - aCosTeta)
    
    Dim aSinBeta As Double
    aSinBeta = Asin(m.Y / R)
    
    C.x = R * Cos(aSinBeta)
    C.Y = m.Y
    
    If aSinBeta < 0 Then
        D.x = R * Cos(Pi - aSinBeta)
    Else
        D.x = R * Cos(3 * Pi - aSinBeta)
    End If
    D.Y = m.Y
    
    'transfo de coordonnées
    Dim res As LesPoints
    res.A = TrigoVersPixel(A, O)
    res.B = TrigoVersPixel(B, O)
    res.C = TrigoVersPixel(C, O)
    res.D = TrigoVersPixel(D, O)
    
    CalculLignes = res
End Function


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Hé bien dis donc tu n'a pas perdu de temps !
Je vais transcoder cela en VB6 et créer des fonctions ArcSin et ArcCos qu n'existent pas en VB.
Je vais faire cela dès que.. car j'ai d'autres projets urgents qui viennent de me tomber dessus.
Le VBA, je connais bien car j'ai fait beaucoup de macrro avec Excel.

Merci beaucoup et bonne année.
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Ha zut, je ne le souvenais pas que asin et acos n’existent pas.
En vba non plus, j’ai triché en codant une fonction qui retourne le résultat d’excel.
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Bonjour

J’ai eu un peu de temps pour le faire en C#, avec un visuel.

Je me suis rendu compte d’une erreur dans le changement de repère « retour »
Private Function TrigoVersPixel(Z As LePoint, O As LePoint) As LePoint 'Z point calculé, 0 centre du cercle (pour Origine)
    Dim res As LePoint
    res.xX= O.X + Z.X 'translation en X pour obtenir une abscisse en pixels
    res.Y = O.Y - Z.Y 'translation en Y avec changement de signe, les pixels étant positifs en Y vers le bas.
    
    TrigoVersPixel = res
End Function


et on peut simplifier un peu le calcul


    B.X = m.X
    B.Y = -1 * A.X

     'et plus loin

    D.X = -1 * C.X
    D.Y = m.Y


Car on est dans le repère Cercle et que les cordes sont horizontale et verticale donc les coordonnées sont symétriques

Ce qui donne
Messages postés
16714
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 janvier 2022
583
Et pas besoin de coder aCos et aSin, car dans le calcul on fait
Cos(aSin x) et Sin(aCos x) et les deux valent racine ( 1 - x2)

Donc aCosTeta et aSinBeta ne sont plus nécessaires et le code est encore simplifié
    A.x = m.x
    A.Y = R * Sqr( 1 - (m.x / R)* (m.x / R))
    
    B.x = m.x
    B.Y = -1 * A.Y
    
    C.x = R * Sqr( 1 - (m.Y / R)* (m.Y / R))
    C.Y = m.Y

    D.x = -1 * C.Y
    D.Y = m.Y
Messages postés
23
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
11 janvier 2022

Bonsoir Whismeril,

Ah ben ça va tout de suite mieux HIHIHI. Merci pour ces rectifications .

Bonne soirée