Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#26 11-10-2010 21:52:04
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
oui il y a la fonction abs
Hors ligne
#27 13-10-2010 09:55:34
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Bonjour,
Me revoilà, je n'ai pas lâché et ne lâcherai pas, si tu es toujours là...
Bien après réflexions et étude de ton dessin, je crois comprendre que ta problématique est celle-ci :
Que le sens de parcours soit le sens trigo ou le sens horaire, que tu parcoures le petit ou le grand arc, tu veux les coordonnées du milieu de l'arc parcouru.
Peux-tu me dire si oui ou non, c'est bien ça ?
En attendant ta confirmation, je pars du principe que oui.
Le coup du milieu de la corde me semble être une fausse bonne idée : je n'ai encore trouvé aucun moyen de déterminer si l'arc parcouru est le grand ou le petit

Analyse sur deux exemples
Je continue à mesurer les arcs dans le sens trigo, mais je modifie les tests...
1. Si le sens est le sens trigo
a) Exemple1. Points A et B
L'arc AB a une mesure [tex]\beta-\alpha >\pi[/tex], c'est le grand arc.
La position de son milieu est déterminée par l'angle [tex]\frac{\beta+\alpha}{2}[/tex]
Vérification. A l'oeil [tex]\approx {\pi\over 6}\;et\;\beta\approx {11\pi\over 8}[/tex]
D'où
[tex]\beta -\alpha ={11\pi\over 8}- {\pi\over 6}={29\pi\over 24}>\pi[/tex]. C'est bon, gd arc parcouru.
Et
[tex]\frac{\beta+\alpha}{2} =\frac{\dfrac{11\p}{8}+\dfrac {\pi}{6}}{2}={37\pi\over 48}>\alpha[/tex]. C'est bon.
Je suis bien bien entre A et B dans le sens trigo.
b) Exemple2 Points A et B1.
Je choisis pour [tex]\beta[/tex] la mesure de l'arc AB1
A l'oeil [tex]\beta \approx {9 \pi \over 8}[/tex]
Visuellement de A à B1 je parcours le petit arc.
Vérification.
[tex]\beta -\alpha ={9\pi\over 8}- {\pi\over 6}={23\pi\over 24}<\pi[/tex]. C'est bon, petit arc parcouru.
Et
[tex]\frac{\beta+\alpha}{2} =\frac{\dfrac{9\p}{8}+\dfrac {\pi}{6}}{2}={31\pi\over 48}>\alpha[/tex].
C'est bon.
Que ce soit le petit ou le grand arc parcouru, la position du milieu est bonne...
2. Si le sens est le sens horaire
a) Exemple 1. Points A et B
L'arc AB a une mesure [tex]\beta-\alpha >\pi[/tex], le calcul nous donne le grand arc (c'est normal), or je parcours, dans ce sens, en fait le petit arc...
D'où correction : il faut prendre le point diamétralement opposé au milieu trouvé au 1. a), soit le point M du dessin...
La position de son milieu est déterminée par l'angle [tex]\frac{\beta+\alpha}{2}+\pi = {37\pi \over 48}+\pi={85\pi\over 48}>\beta[/tex]. C'est bon
Visuellement, je suis bien sur l'arc BDA...
b) Exemple 2. Points A et B1.
De nouveau, je choisis pour [tex]\beta[/tex] la mesure de l'arc AB1
A l'oeil [tex]\beta \approx {9 \pi \over 8}[/tex]
Visuellement de A à B1, dans ce sens, je parcours le grand arc.
Or le calcul 1.b me donne le petit.
Je dois donc corriger la position du milieu en ajoutant pi à sa position angulaire
Vérification.
[tex]\frac{\beta+\alpha}{2}+pi ={31\pi\over 48}+\pi>\beta[/tex]. C'est bon.
Visuellement mon milieu se trouve bien entre les points B et M sur le grand arc AB1.
Alors, tout est bien dans le meilleur des mondes ?
Non, parce qu'il reste un cas litigieux non évoqué ci-dessus, celui ou [tex]\beta - \alpha=\pi[/tex], [AB] est alors un diamètre... Il n'y a ni petit ni grand arc...
Là encore, c'est le sens qui va déterminer le point.
Si sens +, on ne change pas les calculs du 1.
On optimise simplement le test dans 1. avec non plus avec [tex]\beta-\alpha>\pi[/tex] mais [tex]\geq \pi[/tex]
Si sens -, on ne change pas non plus les calculs du 2.
On optimise simplement le test dans 2. avec non plus avec [tex]\beta-\alpha>\pi[/tex] mais aussi [tex]\geq \pi[/tex]
@+
Hors ligne
#28 14-10-2010 11:58:45
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Bonjour,
C'est exactement ca, je veux le point milieu de l'arc parcouru, peux importe son sens, et si c'est le grand ou le petit arc.
Je n'ai pas beaucoup de temps cette fin de semaine pour me pencher sur le sujet, je te remercie pour le temps que tu y as passé, je vais essayer de regarder ca de plus près ce weekend..
Bonne journée!
Hors ligne
#29 14-10-2010 15:19:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Re,
Ok, cela dit quelques surprises ne sont pas à exclure dans le cas [AB] diamètre, à cause des problèmes d'arrondi (en principe, il ne devrait pas y en avoir tellement).
Maintenant je vais réfléchir pour voir si on peut avoir sinon des valeurs exactes, du moins les moins inexactes possible ;-)
Résumé : les tests doivent se faire, sens + ou -, avec [tex]\beta - \alpha \geq \pi[/tex]...
@+
Hors ligne
#30 16-10-2010 11:55:48
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Si je comprend bien ton raisonnement, il faut ajouter PI tout le temps dans le sens horaire. C'est ce que j'ai fait et effectivement mes 2 milieux sur des petits arcs parcouru sont correctement calculés, et sur 1 grand arc ca fonctionne aussi. J'ai par contre deux autres petits arcs ou cette fois-ci je me retrouve avec le point opposé (celui du grand arc...) Je soupconne un problème de calcul dans alpha et beta mais je ne comprends pas pourquoi ca le fait uniquement sur ces arcs... je continu à cherche ;)
Hors ligne
#31 16-10-2010 12:41:46
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Salut,
Donne les exemples numériques s'il te plaît...
En théorie, avec des calculs en valeurs exactes (donc des maths pures) ça marche...
En pratique, avec les erreurs d'arrondis ou de calculs dus au langage et au processeur de la machine, ça peut arriver...
@+
Hors ligne
#32 16-10-2010 22:43:41
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Alors,
J'ai un cercle que je parcours dans le sens horaire,
Départ=A(71;90.9)
Arrivée=B(93,3;91,6)
Rayon=23,76
Résulat du milieu (83,6;46,5)
Tous les petits arcs sans horaire sont concernés..
Dans le sens trigo je parcours le grand arc définit par:
A(32,5;96,7)
B(47,4;95,86)
Rayon 8,74
J'ai le point opposé (39.9;100)...
alors que pour le grand arc suivant toujours dans le sens trigo:
A(32,7;101.1)
B(51,98;90,15)
Rayon 12,2
C'est ok, mon point milieu est (33,8;80,6)
Je n'y comprend plus rien..
Dernière modification par jnjn63 (16-10-2010 22:55:32)
Hors ligne
#33 17-10-2010 08:08:37
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Re,
Tous les petits arcs sens horaire sont concernés
Diantre !
J'ai bien la position des points et les rayons, mais pas celles des centres : je vais essayer de deviner, mais ça va être dur... ;-)
En attendant les centres, je réfléchis à ton problème : je répète, cette fois, c'est mathématiquement sans faille.
C'est le passage à l'acte qui déconne.
Je trouverai pourquoi, c'est une certitude, mais il me faut tous les éléments...
As-tu un moyen dans les cas que tu as cités de récupérer les valeurs des angles calculées par ton script ?
Si oui, je prends aussi les angles.
@+
PS
Je penche pour une erreur humaine...
Hors ligne
#34 17-10-2010 10:51:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Salut,
Me rev'la...
Bon, Tu places A après B (dans le sens trigo) contrairement à la convention que j'ai posée dès le départ.
J'ai eu le tort d'avoir la flemme de passer à l'acte informatique.
En fait, les calculs se font avec \alpha et \beta mais sur la base du calcul de [tex]\frac{\alpha + \beta}{2}[/tex] auquel on ajoute pi si le sens est le sens horaire.
Pas de tests à faire...
Parce que si avec mes conventions, beta-alpha est inférieur à pi, dans ton cas beta-alpha <0 et est bien inférieur à pi...
Avec grosso modo, tes 2 points A et B et le centre estimé pifométriquement.
Programme test en python.
from math import cos,sin,pi
dico=["trigo","horaire"]
a,b=pi/2+0.2,pi/2-0.1
x1,y1=80+24*cos(a),70+24*sin(a)
x2,y2=80+24*cos(b),70+24*sin(b)# Affiche les coordonnées de A et B
print "A(",x1,";",y1,")"
print "B(",x2,";",y2,")"
# Choix du sens
sens=0
###
# Calcul de l'angle milieu selon le sens
if sens==0:
c=(a+b)/2
else:
c=(a+b)/2+pi
# Affichage pour contrôle
print "Sens :",dico[sens]
print " alpha =",a
print " beta =",b
print " Angle milieu =",c
print
x3,y3=80+24*cos(c),70+24*sin(c)
print "M(",x3,";",y3,")"
print
print "------------------------------------"
1er cas. A placé après B dans le sens trigo.
a) sens trigo
A( 75.2319360609 ; 93.5215978682 )
B( 82.3960019995 ; 93.8800999667 )
Sens : trigo
alpha = 1.77079632679
beta = 1.47079632679
Angle milieu = 1.62079632679M( 78.8004999375 ; 93.9700062495 )
------------------------------------
b) J'inverse les points A et B pour qu'ils soient dans le bon ordre.
>>>
A( 82.3960019995 ; 93.8800999667 )
B( 75.2319360609 ; 93.5215978682 )
Sens : trigo
alpha = 1.47079632679
beta = 1.77079632679
Angle milieu = 1.62079632679M( 78.8004999375 ; 93.9700062495 )
------------------------------------
Ça ne change pas la position du milieu...
2. Sens horaire
a) Positions de A et B inversées
A( 75.2319360609 ; 93.5215978682 )
B( 82.3960019995 ; 93.8800999667 )
Sens : horaire
alpha = 1.77079632679
beta = 1.47079632679
Angle milieu = 4.76238898038M( 81.1995000625 ; 46.0299937505 )
------------------------------------
b) Positions de A et B correctes
A( 82.3960019995 ; 93.8800999667 )
B( 75.2319360609 ; 93.5215978682 )
Sens : horaire
alpha = 1.47079632679
beta = 1.77079632679
Angle milieu = 4.76238898038M( 81.1995000625 ; 46.0299937505 )
Pas d'incidence, non plus...
Conclusion dans 1 cas sur 2, la position est fausse.
Dans le sens trigo, plaçons A après B.
Alors
* Aller de A à B dans le sens trigo, c'est parcourir le grand arc --> position fausse.
* Aller de A à B dans le sens horaire c'est parcourir le petit arc --> position fausse.
Je dois donc trouver deux lignes de code corrigeant les erreurs de placement...
Quel que soit le sens de parcours de l'arc par ta machine, avant ce choix, les données une fois rentrées, tu dois impérativement aboutir à [tex]\beta > \alpha[/tex], sinon mes calculs sont faux 1 fois sur 2.
Je regarde de nouveau ton script de plus près...
Tu ne disposes que 9 variables de M1 à M9 pour les calculs ?... Je vais chercher à économiser.
Je reposte quand j'aurai trouvé quelque chose de propre.
@+
Hors ligne
#35 17-10-2010 11:19:57
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Merci de te pencher autant sur le problème, la pour le moment je t'avoue que je n'ai pas beaucoup de temps mais j'essaye de suivre le plus possible. Concernant les variables, il y a la possibilité d'en créer une infinité avec le code $. Exemple: $val1 $val2, etc..
Pour les calculs il faut utiliser M1-M9 mais rien n'empêche de stocker les résultat dans une variable $ une fois que l'étape de calcul est terminée.
Concernant les points de centre:
1)
Départ=A(71;90.9)
Arrivée=B(93,3;91,6)
Rayon=23,76
Centres=C(82,85;70,26)
Résulat du milieu (83,6;46,5)
2)
A(32,5;96,7)
B(47,4;95,86)
Rayon 8,74
C(39,98;91,22)
Résultat j'ai le point opposé (39.9;100)...
3)
A(32,7;101.1)
B(51,98;90,15)
Rayon 12,2
C(39,81;91,17)
Résultat ok, mon point milieu est (33,8;80,6)
Concernant alpha et béta effectivement dans mon code j'inverse juste les points de départs en fonction du sens parcouru en suivant cette régle:
Si je suis en sens trigo, mon point de départ sera celui qui aura le beta le plus grand, si je suis en sens horaire c'est cette fois-ci mon point d'arrivée. Dans mon code, mon point A et B n'est donc pas basé sur la même variable au départ (soit $depX soit X et idem pour Y) Mais après tes remarques, je pense que ce raccourci est faux, il faut bien que je teste sur la valeur de Béta et Alpha pour définir laquelle est la plus grande..
Hors ligne
#36 17-10-2010 13:43:21
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Re,
J'avais noté ta remarque après coup...
J'ai "normalisé" ton code pour que, sens horaire ou sens trigo, le point d'entrée
- Soit toujours A
- Que ses coordonnées soient toujours (M1;M2)
- Que l'angle associé soit [tex]\alpha[/tex]
et que le point de sortie
* Soit toujours B
* Que ses coordonnées soient toujours(M3 ; M4)
* - Que l'angle associé soit [tex]beta[/tex]
et je vais supposer que tu commences n'importe où sur un cercle et que tu es susceptible de t'arrêter n'importe où sur le cercle.
Alors dans le sens horaire, j'aurais ainsi 3 possibilités :
1. Le point B est tel que [tex]\beta <\alpha[/tex]
L'angle du milieu est bien [tex]{\alpha +\beta \over 2}[/tex]
2. Le point B est tel que [tex]\beta >=\alpha[/tex]
Et là 2 cas peuvent se présenter :
a) [tex]\beta <\alpha+\pi[/tex] alors l'angle milieu est [tex]{\alpha +\beta \over 2}-\pi[/tex]
Dans certains cas l'angle sera négatif, mais le point sera au bon endroit : Cos(x) = Cos (2pi+x) et Sin(x)=Sin(2pi+x).
b) [tex]\beta >=\alpha+\pi[/tex] alors l'angle milieu est [tex]{\alpha +\beta \over 2}+\pi[/tex]
Dans certains cas l'angle est supérieur à 2pi, mais le point est au bon endroit.
3 Exemples :
1.
A( 84.7680639391 ; 93.5215978682 )
B( 100.195303635 ; 82.9672553408 )
Sens : horaire
alpha = 1.37079632679
beta = 0.570796326795
Angle milieu = 0.970796326795M( 93.5514193615 ; 89.8080547578 )
2. a)
A( 84.7680639391 ; 93.5215978682 )
B( 56.4784021318 ; 65.2319360609 )
Sens : horaire
alpha = 1.37079632679
beta = 3.34159265359
Angle milieu = -0.785398163397M( 96.9705627485 ; 53.0294372515 )
2. b)
A( 84.7680639391 ; 93.5215978682 )
B( 89.3460402154 ; 47.8945361439 )
Sens : horaire
alpha = 1.37079632679
beta = 5.11238898038
Angle milieu = 6.38318530718M( 103.880099967 ; 72.3960019995 )
Si je ramène l'angle entre 0 et pi à la fin :
A( 84.7680639391 ; 93.5215978682 )
B( 89.3460402154 ; 47.8945361439 )
Sens : horaire
alpha = 1.37079632679
beta = 5.11238898038
Angle milieu = 0.1M( 103.880099967 ; 72.3960019995 )
Tu vois le point est bien aussi au bon endroit...
Dans le sens trigo
Ayant supposé que tu commences n'importe où et que tu peux t'arrêter n'importe où, tu es susceptible d'entrer à pi/6, de faire le tour et de t'arrêter à pi/8 : ça, j'avais éliminé cette éventualité.
Mais avec tes retours...
Donc là, moins de cas.
Soit j'ai [tex]\beta>=\alpha[/tex], soit j'ai [tex]\beta <\alpha[/tex]
1er cas : l'angle du milieu est bien [tex]{\alpha +\beta \over 2}[/tex]
A( 100.784609691 ; 82.0 )
B( 102.17310878 ; 79.1844023768 )
Sens : trigo
alpha = 0.523598775598
beta = 0.392699081699
Angle milieu = 3.59974158224M( 58.4750542032 ; 59.3850714347 )
2e cas : l'angle du milieu est par contre [tex]{\alpha +\beta \over 2}+\pi[/tex]. Là il arrivera que l'angle du milieu soit > 2pi.
A( 100.784609691 ; 82.0 )
B( 102.17310878 ; 60.8155976232 )
Sens : trigo
alpha = 0.523598775598
beta = 5.89048622548
Angle milieu = 3.20704250054M( 56.0513858423 ; 68.4303248985 )
Encore une fois, on peut le ramener dans l'intervalle [0 ; 2i], mais mathématiquement, c'est inutile, puisque les coordonnées sont inchangées.
Reste que ta machine n'aime peut-être pas les angles > 2pi, mais ça me surprendrait...
Je corrigerais déjà le début du code ainsi :
[CCW] ; Rotation sens trigo
M1=$depX ; X Point A
M1=M1-aI ; X point A rapporté à 0
M2=$depY ; Y Point A
M2=M2-aJ ; Y point A rapporté à 0
M3=X ; X Point B
M3=M3-aI ; X point B rapporté à 0
M4=Y ; Y Point B
M4=M4-aJ ; Y point B rapporté à 0
@Calcul1a[CW] ; Rotation sens anti-trigo
M1=$depX ; X Point A
M1=M1-aI ; X point A rapporté à 0
M2=$depY ; Y Point A
M2=M2-aJ ; Y point A rapporté à 0
M3=X ; X Point B
M3=M3-aI ; X point B rapporté à 0
M4=Y ; Y Point B
M4=M4-aJ ; Y point B rapporté à 0
@Calcul1a
Ce qui appelle une remarque de ma part : as-tu la possibilité d'écrire 2 fois le même morceau de code ?
Après, les correctifs de quadrants ne changent pas, mais il faut faire 2 sous-calculs différents selon que tu es en sens CW ou CCW.
La position par rapport à un repère centré sur C étant obtenue, la correction pour ramener les valeurs dans le repère d'origine, restent inchangés...
Cette fois, j'ai bien dû passer partout...
@+
Hors ligne
#37 17-10-2010 16:55:05
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Oui on peu créer autant de sous programme que nécessaire par exemple @Calcul1CW et @Calcul1CCW, bref tout ce qu'on veut!
Je suis plutôt passif pour le moment mais je pense qu'en début de semaine je serais sur le sujet ;)
Hors ligne
#38 17-10-2010 21:53:51
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Re,
Je vais essayer de réécrire ton script demain...
J'ai oublié "ne ... pas" : je voulais demandé Ce qui appelle une remarque de ma part : as-tu la possibilité de ne pas écrire 2 fois le même morceau de code ?
@+
Hors ligne
#39 17-10-2010 22:47:09
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Ce n'est pas un soucis, lors je parcours un cercle en sens horaire ou anti horaire il suffit que je fasse un renvoi directe vers un sous programme commun ;)
Hors ligne
#40 19-10-2010 09:32:12
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Bonjour,
Si cela te gêne que des angles soient supérieurs à 2*pi, on s'en tire par un test et une soustraction.
J'ai ramené les tests dans le sens horaire à 2 : que j'ajoute ou que j'enlève pi, j'aboutirai toujours au même point, l'écart entre les 2 calculs étant de 2pi.
Dans le sens horaire donc, soit on a beta<=alpha, alors on parcourt un petit arc et (alpha+beta)/2 donne le bon angle,
soit beta>alpha, alors que l'arc soit le petit grand, il faudra ajouter pi à la valeur de l'angle du milieu.
Un peu d'algèbre : à quelle condition a-t-on (alpha+beta)/2 > beta c'est à dire l'angle milieu placé entre A et B dans le sens horaire .
(alpha+beta)>2 > beta donne alpha +beta > 2beta soit alpha > beta donc pour un point de sortie coincé entre A et le point que j'ai appelé D d'angle 0..
Dans tous les autres cas, le point milieu sera le point diamétralement opposé à l'angle cherché. d'où dans ce cas un ajout de pi au calcul de l'angle milieu.
Je réduis en outre le nombre de tests de corrections de quadrants :
* un cosinus >0 (donc une abscisse >0 puisque RAD est >0) donnera toujours un angle entre 0 et pi/2
* un cosinus <0 (donc une abscisse <0 puisque RAD est >0) donnera toujours un angle compris entre pi/2 et pi
Les calculs d'arc cosinus étant déjà faits, il suffit de corriger l'angle :
* dans le 1er cas si le sinus est négatif en faisant 2*pi-angle
* dans le 2e cas si le sinus est négatif, en faisant 2*pi-angle
Alors, puisque dans tous les cas l'arc cosinus donne un angle 0 et pi, donc un sinus >0, dans les 2 cas, il faut calculer 2* pi -angle si le sinus est négatif : donc un seul test...
Donc
[CW]
M1=$depX ; X Point A (toujours le point d'entrée)
M1=M1-aI ; X point A rapporté à 0
M2=$depY ; Y Point A
M2=M2-aJ ; Y point A rapporté à 0
M3=X ; X Point B (toujours le point de sortie)
M3=M3-aI ; X point B rapporté à 0
M4=Y ; Y Point B
M4=M4-aJ ; Y point B rapporté à 0
M5=arccos(M1/RAD) ; angle alpha du point d'entrée A
IF M2 < 0 THEN THEN M5=2*pi-M5
M6=arccos(M3/RAD) ; angle beta du point de sortie B
IF M4<0 THEN M6=2*pi-M6
@Calcul1a
[CCW]
M1=$depX ; X Point A (toujours le point d'entrée)
M1=M1-aI ; X point A rapporté à 0
M2=$depY ; Y Point A
M2=M2-aJ ; Y point A rapporté à 0
M3=X ; X Point B (toujours le point de sortie)
M3=M3-aI ; X point B rapporté à 0
M4=Y ; Y Point B
M4=M4-aJ ; Y point B rapporté à 0
M5=arccos(M1/RAD) ; angle alpha du point d'entrée A
IF M2<0 THEN THEN M5=2*pi-M5
M6=arccos(M3/RAD) ; angle beta du point de sortie B
IF M4<0 THEN M6=2*pi-M6
@Calcul1b
[Calcul1a]
IF M6>M5 OR M6=M5 THEN M7=(M5+M6)/2
IF M6<M5 THEN M7=(M5+M6)/2 +pi
IF M7>2*pi or M7=2*pi THEN M7 = M7-2*pi ; on ramène entre 0 et 2pi tout angle éventuellement >= 2pi
@calcul2
[Calcul1b]
IF M6<M5 OR M6=M5 THEN M7=(M5+M6)/2
IF M6>M5 THEN M7=(M5+M6)/2
IF M7>2*pi or M7=2*pi THEN M7 = M7-2*pi ; on ramène entre 0 et 2pi tout angle éventuellement >= 2pi
@Calcul2
[Calcul2]
$X3=RAD*cos(M7) ; Calcul X point milieu
$Y3=RAD*sin(M7) ; Calcul Y point milieu
M4=$X3+aI ; Retour au centre du départ
M5=$Y3+aJ ; Retour au centre du départ
R1 = !CFCW, <X>+,!M4,<Y>+, !M5,!X, !Y ; je ne touche pas à ces 3 lignes
$depX=X ; n'étant pas sûr de
$depY=Y ; leur rôle : à toi de voir...
@+
PS
Je trouve quand même bête que les 2 calculs [CW] et [CCW] soient exactement les mêmes.
Y a-t-il un moyen autre que les étiquettes [CW] et [CCW] de transmettre à la machine le sens de rotation ?
Par exemple, via une variable ? Pour les besoins de la cause, je l'appellerais sens : sens = 0 (si sens trigo) sens = 1 (si sens horaire)
Si oui, on supprime un des deux calculs [CW] ou [CCW], on en garde un, on le rebaptise [Commun] et à la fin au lieu de @calcul1a ou @calcul1b on procède ainsi avec 2 lignes au lieu d'une :
IF sens = 0 THEN @calcul1a
IF sens = 1 THEN @calcul1b
Tiens-moi au courant...
Hors ligne
#41 21-10-2010 18:25:47
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Bonsoir,
Hello jnj63; qu'est-ce que ça donne ?
Tu auras rectifié de toi-même dans [CCW], qu'il fallait écrire
IF M2<0 THEN M5=2*pi-M5
IF M4<0 THEN M6=2*pi-M6
tout comme dans [CW], ainsi que dit dans les explications préalables.
J'avais oublié la modif que j'avais trouvée... Désolé.
Cela dit, mon programme Python aue j'ai adapté là, me paraît cette fois sans faille...
@+
Hors ligne
#42 21-10-2010 21:41:17
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Bonsoir,
Merci pour tout,
Je suis dessus depuis hier, je crois que la fonction arccos n'accepte pas de valeurs en dehors de -1 et 1 du cou j'ai une erreur...
Je me demande si on va y arriver...
Je continu à cherche..
Hors ligne
#43 21-10-2010 22:40:08
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Re,
La fonction arccos (le [tex]cos^{-1}[/tex] des calculatrices) permet de trouver l'angle à partir de son cosinus...
Etant donné que le cosinus d'un angle est compris entre -1 et +1, la fonction arccos ne marche pas en dehors de ces valeurs...
Cela dit, Considérons un cercle dont le centre O est le centre du repère et dont le rayon est R.
Sur ce cercle, je place encore un point I(R;0)
Prenons sur ce cercle deux points A et B de coordonnées A(x1,y1) et B(x2, y2) les cosinus des angles [tex]\alpha=\widehat{IOA}\; et\; beta =\widehat{IOB}[/tex] sont bien x1/R et x2/R et ces 2 valeurs sont bien dans l'intervalle [-1 ; +1]
S'il y a erreur, ça ne vient pas de là : l'erreur est à chercher en amont...
Ce qui veut dire que les points choisis n'appartiennent pas au cercle de rayon R :
- soit parce que le rayon est incorrect,
- soit parce que les coordonnées sont fausses.
Faisons le contraire :
Prenons un point A faisant un angle alpha avec (OI) du cercle de centre O et de rayon R.
Son abscisse est x = R.cos(alpha)...
Supposons que je te donne cette valeur x et le rayon R sans te dire comment j'ai obtenu x...
Tu vas calculer arccos(x/R) et tu vas trouver quoi ? alpha !
Pourquoi ? Parce que arccos(x/R) = arccos(R.cos(alpha)/R)= arccos(cos(alpha))=alpha...
Il ne peut pas y avoir d'erreur !
Mais ça ce sont des mathématiques, on travaille dans l'absolu, toi tu es dans le concret donc dans le relatif...
Tu es soumis à l'imprécision des calculs réels...
Donne-moi
Coordonnées du centre du cercle et son rayon et les coordonnées des points qui te posent problème pour voir si le problème est celui que je crois (mathématiquement, cette fois, mon programme est juste : j'ai pataugé un moment, mais, maintenant, je suis sûr de moi) et je réfléchirai à intercepter les erreurs pour trouver un correctif des coordonnées avec les arrondis...
Ton usinage a besoin de quelle précision ? 1/100e mm ?
@+
Hors ligne
#44 23-10-2010 14:33:44
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Re,
Pour gagner du temps :
si mes hypothèses sont exactes, alors la sortie des cosinus de l'intervalle [-1 ; +1] doit être très minime...
Je viens de vérifier avec un rayon de 25 mm la différence entre 25*cos(0.999) et 25*cos(0.998) et de 2/100e de mm..
Dans un premier temps, teste donc ces extrêmes et ramène à 1 ou -1, lesdites valeurs incorrectes :
M8=M1/RAD
M9=M3/RAD
IF M8>1 THEN M8=1
IF M8<-1 THEN M8=-1
IF M9>1 THEN M9=1
IF M9<-1 THEN M9=-1
M5=ARCCOS(M8)
M6=ARCCOS(M9)
Dans les deux groupes [CW] et [CCW], introduire ces modifs.
Si ça ne suffit pas, j'ai trouvé à 99% comment savoir dans les deux sens si A est placé avant ou après B.
Dans le repère centré sur C, centre du cercle, plaçons le point D de coordonnées (R;0). l'axe y=0
Je réfléchis maintenant au cas où A et B sont de part et d'autre de cette droite...
Sens trigo
Si A et B sont dans les 1er ou 2e quadrants alors si :
DA < DB alors A est placé avant B sur le cercle
Si A et B sont au dessous de l'axe alors si :
DA < DB alors A est placé après B sur le cercle
Sens horaire
Si A et B sont au dessus de l'axe (1er et 2e quadrants) alors si :
DA < DB alors A est placé avant B sur le cercle
Si A et B sont au dessous de l'axe alors si :
DA < DB alors A est placé après B sur le cercle
Avant et après désignent l'ordre dans lequel on rencontre les points A et B, dans le sens de rotation choisi en partant du point D.
Donc il me reste le cas particulier A et B sont de part et d'autre de l'axe
Cela résolu, je me pencherai sur le cas du milieu ...
@+
[Edit]24/10/2101 14:00 : j'avance, j'ai bientôt fini !
Dernière modification par yoshi (23-10-2010 22:00:52)
Hors ligne
#45 25-10-2010 10:59:11
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
RE,
J'ai fini, je vais passer à la phase écriture dans ton langage : ça va faire un programme très long (et demander du temps et comme tu ne sembles pas disposer de beaucoup de temps pour répondre, ça ne va pas me simplifier la tâche...), vu que je ne sais pas si :
* Ton "BASIC" admet les sous programmes appelés avec GOSUB avec retour après l'endroit de l'appel par RETURN,
* Ton "BASIC" accepte le ELSE, ELSEIF, END IF... etc et si une condition peut donc être traitée sur plusieurs lignes
L'instruction @calcul1a est clairement l'équivalent d'un GOTO.
Je finirai l'écriture, que tu te remanifestes ou pas, même si ce n'est que pour ma satisfaction personnelle. ;-)
@+
Hors ligne
#46 25-10-2010 17:14:58
- jnjn63
- Membre
- Inscription : 04-10-2010
- Messages : 20
Re : Point milieu d'un arc de cercle
Salut et merci beaucoup pour le temps que tu passe sur ce problème,
Effectivement je n'ai pas beaucoup de temps en ce moment voir pas du tout...
Mon basic n'admet pas d'autres rappels que les @.. Ce n'est pas trés pratique :( pas de gosub, pas de else etc.) c'est un basic trés trés basique...
J'espère réellement pouvoir y consacrer du temps dans la semaine, la place de spectateur ne plait pas trop..
Bonne soirée!
Hors ligne
#47 25-10-2010 19:14:45
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Salut,
OK ! Bon, on fera avec (ou sans, c'est comme on veut).
Alors l'idée générale est la suivante.
J'appelle A le point d'entrée et B celui de sortie, quel que soit le sens...
J'appelle D le point de coordonnées D(RAD ; 0) dans le repère centré sur C centre du cercle.
Héla, je n'ai pas de trouvé de fonction qui ne soit que croissante..
Il y aurait bien eu la longueur de l'arc de cercle, mais pour le calculer, retour à la case départ : j'aurais eu besoin de [tex]|\beta-\alpha|[/tex]...
Donc je vais comparer les longueurs des cordes [DA] et [DB] : elles sont dans dans le même ordre que leurs carrés, pas besoin de passer aux racines...
Avec A(M1 ; M2) et B(M3 ; M4)
J'ai [tex]L_1 = DA^2=(M_1-RAD)^2+M_2^2[/tex] et [tex]L_2 = DA^2=(M_3-RAD)^2+M_4^2[/tex]
Pour chaque sens, trigo et horaire, je suis obligé d'envisager 3 cas :
A et B au dessus de l'axe des x, A et B, au dessous, A et B de part et d'autre de l'axe des x.
Dans ce dernier cas, je dois examiner 2 sous cas ; : A au dessus et B au dessous, A au dessous et B au dessus.
Le milieu de l'arc sera l'un des 2 points d'intersection de la médiatrice de [AB] avec le cercle de centre C.
L'équation du cercle est x²+y²=RAD² dans le repère centré sur C.
Venons-en à la médiatrice, elle par C, donc son équation est du type y=mx. Reste à déterminer le coefficient directeur m.
Pour cela, il me faut le coefficient directeur m' de la droite (AB), et la médiatrice étant une perpendiculaire particulière, j'en déduirai m grâce à la formule m*m' = -1.
(AB) a pour coefficient directeur [tex]\frac{M_4-M_2}{M_3-M_1}[/tex]
Avant de le calculer je dois prévoir le cas où M3 = M1 rendant nul le dénominateur et déclenchant une erreur en cas de calcul : je dois traiter ce cas avant...
Alors le coeff. dir. de [AB] calculé, je dois prendre l'opposé de son inverse, soit calculer [tex]-\frac{M_3-M_1}{M_4-M_2}=\frac{M_1-M_3}{M_4-M_2}[/tex]
Mais je dois prévoir le cas où m est nul, (AB) horizontal, et donc traiter aussi ce cas avant tout calcul...
Cela fait, je note et calcule [tex]K=\frac{M_1-M_3}{M_4-M_2}[/tex]...
La médiatrice a donc pour équation y= K.x...
Je remplace y dans l'équation du cercle :
x²+K²x²=RAD², soit x²(1+K²)=RAD² ou encore [tex]x^2=\frac{RAD^2}{1+K^2}[/tex]
Mais là, je me retrouve avec :
[tex]x=\pm\sqrt{\frac{RAD^2}{1+K^2}}[/tex]
Laquelle des 2 abscisses convient ? La positive ou la négative ?...
Je suis obligé d'utiliser un coefficient S supplémentaire qui vaudra 1 ou -1...
Je prends par défaut la valeur positive et quand j'aurai ma réponse je ferai S*racine par défaut...
Quand j'ai la bonne racine x, je calcule l'ordonnée y par y= K.x...
Un exemple.
Sens trigo...
A et B au dessus.
Supposons L1 >= L2 (donc DA >=DB) : dans ce sens, si je pars de D et que je tourne, je rencontre B puis A.
Or, comme A est mon point d'entrée, je ne peux pas avoir un arc d'un demi-cercle (ce cas M4 = M2 a été traité avant), donc je parcours un grand arc... le point milieu cherché sera le point diamétralement opposé au milieu situé entre B et A -dans l'ordre de parcours depuis D)
Et alors
* Soit mon coeff K est positif et alors le "mauvais" point milieu a une abscisse +, donc le point cherché a une abscisse - , donc S=-1,
* Soit mon coeff K est négatif et alors le "mauvais" point milieu a une abscisse -, donc le point cherché a une abscisse + , donc S= 1.
Là encore, j'économise un test en prenant S=1 comme valeur par défaut d'abord, puis je teste si ici si K>0 et je corrige S=-1
Si K est négatif, le test s'arrête et K n'est pas changé...
Je vais procéder à l'identique dans le nombre de sous-programmes voulus et je déterminerai S à chaque fois.
Ce n'est qu'ensuite que je rejoindrai un "tronc commun" où le calcul de K deviendra nécessaire, puis le calcul de x, par [tex]S*\sqrt{\frac{RAD^2}{1+K^2}}[/tex].
Ca doit pouvoir être fixé au départ une fois pour toutes et ainsi éviter de le répéter dans chaque sous-programme.
Ca va m'obliger à utiliser probablement une douzaine de variables, j'espère qu'on peut, sinon on est mal...
M'as-tu compris ?
@+
Hors ligne
#48 05-11-2010 15:29:32
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Bonjour,
J'ai attendu d'avoir une confirmation ou pas de mes suppositions, rien ne venant je me résigne à publier comme promis une version quasiment définitive...
[CW]
M1=$depX ; X Point A (toujours le point d'entrée)
M1=M1-aI ; X point A rapporté à 0
M2=$depY ; Y Point A
M2=M2-aJ ; Y point A rapporté à 0
M3=X ; X Point B (toujours le point de sortie)
M3=M3-aI ; X point B rapporté à 0
M4=Y ; Y Point B
M4=M4-aJ ; Y point B rapporté à 0
S=1
IF M1 = M3 AND M2 = M4 THEN @calcul1a ; cas où A = B
IF M1 = M3 THEN @calcul1b ; cas où A et B symétriques / à l'axe des x
IF M2 = M4 THEN @calcul1c ; cas où A et B symétriques / à l'axe des y
K = (M1- M3)/(M4 – M2) ; calcul du coeff directeur de la médiatrice de [AB]
L1 = (M1- RAD)^2 + M2^2 ; calcul de DA²
L2 = (M3 – RAD)^2 + M4^2 ; calcul de DB²
IF M2 * M4 > 0 THEN @calcul2a ; si les deux points sont tous deux au dessus ou au dessous
@calcul2b ; si les 2 points sont l'un au dessus l'autre au dessous
[CCW]
M1=$depX ; X Point A (toujours le point d'entrée)
M1=M1-aI ; X point A rapporté à 0
M2=$depY ; Y Point A
M2=M2-aJ ; Y point A rapporté à 0
M3=X ; X Point B (toujours le point de sortie)
M3=M3-aI ; X point B rapporté à 0
M4=Y ; Y Point B
M4=M4-aJ ; Y point B rapporté à 0
S=1
IF M1 = M3 AND M2 = M4 THEN @calcul1a
IF M1 = M3 THEN @calcul1b
IF M2 = M4 THEN @calcul1c
K = (M1- M3)/(M4 – M2)
L1 = (M1- RAD)^2 + M2^2
L2 = (M3 – RAD)^2 + M4^2
IF M2 * M4 > 0 THEN @calcul3a
@calcul3b
[Calcul1a]
M8 = -M1
M9 = - M2
@calcul5
[Calcul1b]
M9=0
IF M2>0 THEN S = -1
M8 = S * RAD
@Calcul5
[calcul1c]
M8 = 0
IF L1 > L2 THEN S = -1
M9 = S * RAD
@calcul5
[calcul2a]
IF L1 > L2 THEN S = -1
@calcul4
[Calcul2b]
IF L1 > L2 THEN S = -1
@calcul4
[calcul3a]
IF L1 < L2 THEN S = -1
@calcul4
[Calcul3b]
IF L1 < L2 THEN S = -1
@calcul4
[calcul4]
M8 = S* SQRT(RAD^2/(1+K^2))
M9 = K * M8
@calcul5
@calcul5
$X3 = M8 ; abscisse X point milieu
$Y3 = M9 ; ordonnée Y point milieu
M5=$X3+aI ; Retour au centre du départ
M6=$Y3+aJ ; Retour au centre du départ
R1 = !Cm3FCW, <X>+,!M5,<Y>+, !M6,!X, !Y ; je ne touche pas à ces 3 lignes
$depX=X ; n'étant pas sûr de
$depY=Y ; leur rôle : à toi de voir...
A te lire, j'espère...
Hors ligne
#49 29-11-2010 20:25:50
- jnjn633
- Invité
Re : Point milieu d'un arc de cercle
Bonjour et d'abord désolé pour ce long silence ;)
Alors j'ai été pas mal pris et je me suis enfin remis sur ce projet en essayant de récupérer ce que tu avais fait. J'ai eu pas mal d'erreurs, de boucles, etc. pour la simple raison que le language de programmation de mon logiciel est pleins de bugs surtout quand il s'agit d'utiliser des conditions multiples...
Pour résoudre ces problèmes j'avais fait ajouter les fonction ASA et AEA (Arc Start Angle et Arc End Angle) pour calculer les angles facilement. Voici l'idée du calcul:
- Je calcul systématiquement la corde de mon arc
- Si l'angle de mon arc est inférieur à 180, je parcours le petit arc, le calcul est bon d'office, je récupére l'argument du point milieu de ma corde et je fais le calcul avec le rayon comme module
- Si mon angle est supérieur à 180, j'ajoute PI a mon module pour aller chercher le point opposé à ma corde (grand arc parcouru)
- Je traite le cas des demi-cercles et celui des cercles complet (en sachant que seuls les demi-cercles dont les points sont verticaux ou horizontaux sont traités)
- Le reste c'est les calculs dont on a parlé depuis le début..
Avec ce code j'arrive à obtenir ce fameux point milieu dans beaucoup de cas..J'espère 99% des cas, pour le moment c'est assez infaillible.. Merci pour l'aide que tu m'as apporté, dommage que le language utilisé par ce logiciels ne soit pas à la hauteur pour faire quelque chose d'aussi poussé que ce que tu as proposé..
Voici le code:
[CW]
M1=0
M2=0
M3=0
M4=0
M5=0
M6=0
M7=0
M8=0
M9=0
$ARCSPAN=0
$XC=0
$YC=0
$ARG=0
M1=X ; X Point A
M1=M1-aI
M2=Y ; Y Point A
M2=M2-aJ
M3=$depX
M3=M3-aI ; X Point B
M4=$depY
M4=M4-aJ ; Y Point B
IF M1=0 AND M3=0 THEN @ALICWX ; Cercles alignés sur X
IF M2=0 AND M4=0 THEN @ALICWY ; Cercles alignés sur Y
$TEST1=M1+M3 ; Test si sur X
$TEST2=M2+M4 ; Test si sur Y
IF $TEST1<>0 OR $TEST2<>0 THEN @NORMCW ; Autres Cercles
@FINCAL
[NORMCW]
M6=ASA-AEA
IF (M6<0) THEN M5=360
$ARCSPAN =M5+(ASA - AEA)
M7 = $ARCSPAN ; Angle de l'arc
IF (M7>180) OR (M7=0) THEN M8=PI ; Test grand arc parcouru ou cercle complet
$XC=(M1+M3)/2 ; Point milieu corde en X
$YC=(M2+M4)/2 ; Point milieu corde en Y
IF (M1=M3) AND (M2=M4) THEN $XC=X-aI ; Cercle complet
IF (M1=M3) AND (M2=M4) THEN $YC=Y-aJ ; Cercle complet
IF $XC<0 THEN M8=M8+PI ; Correction a pi prés
IF $XC=0 THEN $XC=0.001 ; Pas de bug division par 0
$ARG=ARCTAN($YC/$XC)+M8 ; Calcul argument avec correction a pi pré + correction grand arc
M8=RAD*COS($ARG) ; Calcul point milieu de l'arc en X avec module = rayon
M9=RAD*SIN($ARG) ; Calcul point milieu de l'arc en Y avec module = rayon
[ALICWX]
IF M2>M4 THEN M8=-RAD ; Cercle en dessous des X
IF M2<M4 THEN M8=RAD ; Cercle au dessus des X
IF (M2=M4) AND (M1=M3) THEN @NORMCW ; Pour éviter bug
[ALICWY]
IF M1>M3 THEN M9=RAD ; Cercle à droite des Y
IF M1<M3 THEN M9=-RAD ; Cercle à gauche des Y
IF (M2=M4) AND (M1=M3) THEN @NORMCW ; Pour éviter bug
[CCW]
M1=0
M2=0
M3=0
M4=0
M5=0
M6=0
M7=0
M8=0
M9=0
$ARCSPAN=0
$XC=0
$YC=0
$ARG=0
M1=X ; X Point A
M1=M1-aI
M2=Y ; Y Point A
M2=M2-aJ
M3=$depX
M3=M3-aI ; X Point B
M4=$depY
M4=M4-aJ ; Y Point B
IF M1=0 AND M3=0 THEN @ALICCWX ; CERCLE 180° SUR X
IF M2=0 AND M4=0 THEN @ALICCWY ; CERCLE 180° SUR Y
$TEST1=M1+M3 ; TEST POUR X
$TEST2=M2+M4 ; TEST POUR Y
IF $TEST1<>0 OR $TEST2<>0 THEN @NORMCCW ; AUTRES CAS
@FINCAL
[NORMCCW]
M6=AEA-ASA
IF (M6<0) THEN M5=360
$ARCSPAN=M5+(AEA - ASA)
M7 = $ARCSPAN ; Angle de l'arc
IF (M7>180) OR (M7=0) THEN M8=PI ; Test grand arc parcouru ou cercle complet
$XC=(M1+M3)/2 ; Point milieu corde en X
$YC=(M2+M4)/2 ; Point milieu corde en Y
IF (M1=M3) AND (M2=M4) THEN $XC=X-aI ; Cercle complet
IF (M1=M3) AND (M2=M4) THEN $YC=Y-aJ ; Cercle complet
IF $XC<0 THEN M8=M8+PI ; Correction à pi prés
IF $XC=0 THEN $XC=0.001 ; Pas de bug division par 0
$ARG=ARCTAN($YC/$XC)+M8 ; Calcul argument avec correction a pi prés + correction grand arc
M8=RAD*COS($ARG) ; Calcul point milieu de l'arc en X
M9=RAD*SIN($ARG) ; Calcul point milieu de l'arc en Y
[ALICCWX]
IF M2>M4 THEN M8=RAD ; Cercle au dessus des X
IF M2<M4 THEN M8=-RAD ; Cercle en dessous des X
IF (M2=M4) AND (M1=M3) THEN @NORMCW ; pour éviter bug
[ALICCWY]
IF M1>M3 THEN M9=-RAD ; Cercle a gauche des Y
IF M1<M3 THEN M9=RAD ; Cercle à droite des Y
IF (M2=M4) AND (M1=M3) THEN @NORMCW ; pour éviter bug
[FINCAL]
M8=M8+aI
M9=M9+aJ
R1 = !CFCW, <X>+,!M8,<Y>+,!M9,!X, !Y
$depX=X
$depY=Y
Bonne soirée et si tu as des suggestions n'hésite pas
Merci encore
#50 29-11-2010 23:10:30
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Point milieu d'un arc de cercle
Salut,
Je t'ai bien cru perdu corps et biens.
Je regarderai ton nouveau prog plus tard...
Le seul défaut de cette méthode vient de l'emploi de l'arccos, si jamais on sort de l'intervalle [-1 ; +1] même de quelques pouillèmes : je crois avoir repéré que tu as pris des contre-mesures.
En principe, ma 2nde méthode à partir des longueurs ne peut pas souffrir de ce genre de pbs...
L'as-tu testée et si oui, qu'est-ce qu'elle donne ? Je me doute qu'il y doit y avoir des ajustements à faire, parce que programmer sans voir les résultats n'est jamais simple...
@+
Hors ligne







