Algorithme pour arcs de cercles

Jun 11, 2010 18 Replies

Bonjour,



Ma question n'est pas électronique, mais j'imagine que certains ont déjà été confrontés à ce problème.



J'ai réalisé une table à découper plasma pilotée par un PC sur le port parallèle.



Aujourd'hui je me tourne vers quelque chose de plus "portable" (utilisation d'un microcontroleur) et Je suis à la recherche d'une formule mathématique n'utilisant ni fonctions trigonométriques, ni table (quantité de ram limitée) ,me permettant de calculer les points d'un arc de cercle.



pour ceux qui utilisent des machines à commande numérique, je cherche à refaire les fonctions G02 et G03. donc suivre une courbe avec 2 moteurs PAP grace aux informations suivantes :



- position de départ



- position de fin



- rayon



- sens horaire/inverse (G02 ou G03)



- > ou < que 180°



Si vous avez des idées, je suis toutes ouïes



merci



a+ François


Bonjour, y = racine(rayon² - x²) En faisant varier x de -rayon à + rayon, tu obtiens un demi-cercle Cordialement Michel dit "Sam"

"Francois" a écrit dans le message de news: 4c124ddf$0$2986$ snipped-for-privacy@reader.news.orange.fr...

Francois a tapoté du bout de ses petites papattes :

Oui mais en fait tu veux quoi ?

LeLapin

"Francois" a écrit dans le message de news: 4c124ddf$0$2986$ snipped-for-privacy@reader.news.orange.fr...

==================== Il te faudra tout de même utiliser un peu de trigonométrie, transformer les coordonnées polaires (angle et rayon) en coordonnées rectangulaire ( x et y ) x=rayon * cos(phi) y=rayon * sin(phi) Ce qui est d'une grande simplicité à calculer pour un microcontrôleur moyen Si tu programmes en asm et que tu ne trouves pas les routines mathématiques adéquates , tu peux ajouter au µC un coprocesseur mathématique de ce genre par exemple

formatting link

On Jun 11, 6:34 pm, "maior "

les

et

Il a dit qu'il ne voulait pas de fonctions trigo.

ues

re

Ajouter un chip au lieu d'=E9muler ca par soft ? Tu en as d'autres comme ca, des solutions qui compliquent ?

On Jun 11, 4:53 pm, Francois

La question est : pr=E9f=E8res-tu optimiser la vitesse de calcul ou la taille m=E9moire ?

Soit tu devras =E9muler les fonctions par soft (une seule fonction en fait, puisque sin et cos c'est la meme chose =E0 pi/2 pr=E8s) et cela prendra du temps de calcul, soit tu impl=E9mentes une table avant autant de points qu'il te faut sachant que tu n'as pas forc=E9ment besoin de 360 points ... et que la table n'a pas besoin d'etre en RAM.

Et pour mettre dans une table par exemple la fonction sin, tu peux gagner un facteur 4 sur la taille de la table en n'y impl=E9mentant que les valeurs de z=E9ro =E0 pi/2 (le reste se retrouve par sym=E9trie)

En graphique 2D, il y a des algorithmes int=E9ressants pour tracer =E0 bas niveau des cercles et des lignes de fa=E7on efficace en temps et en m=E9moire. Pour les arcs de cercle, voici une page int=E9ressante de Wikipedia :

formatting link

En g=E9om=E9trie euclidienne ou hyperbolique ?

--

-Stan

Bonjour, tu as perdu les "² "!

je ne savais même pas que la géométrie hyperbolique existait ! tout comme je fais de la prose, je crois que je fais de la géométrie euclidienne.

la perte de tes ² m'intrigue, je vais écrire la formule autrement y=racine(rayon*rayon - x*x)

Cordialement Michel dit "Sam"

"Stan" a écrit dans le message de news: snipped-for-privacy@y4g2000yqy.googlegroups.com... > Bonjour,

En géométrie euclidienne ou hyperbolique ?

--

-Stan

Pourtant, ils sont bien l=E0 =E0 pr=E9sent. Mais je ne sais pas d'o=F9 viennent ces pb d'encodage de page...

--

-Stan

le

s :

J'avais pens=E9 au courbes de B=E9zier :

formatting link

Mais on ne peut pas tracer d'arc de cercle :-(

--

-Stan

il y a d=E9j=E0 eu plein de pistes post=E9es, j'ajoute la mienne : CORDIC :-) il faut une multiplication constante suivie d'it=E9rations de d=E9calages/additions, et on fait toutes les fonctions trigo et m=EAme plus, les doigts dans le nez. c'est un peu bourring mais =E7a prend peu de place en m=E9moire et les op=E9rations sont possibles en pr=E9cision arbitraires, tant qu'on a les primitives qu'il faut (addition, soustraction, d=E9calage, multiplication par constante). =E7a fonctionne en "virgule fixe", tout est normalis=E9 entre 0 et 1.

j'ai fait joujou avec =E7a =E0 une =E9poque, pour faire des oscillateurs num=E9riques mais chut...

formatting link
(ne pas faire gaffe aux maths, c'est juste pour comprendre pourquoi =E7a marche et =E0 quoi servent chaque op=E9ration)
formatting link
(pas pire, avec du code source plus digeste)

note : le 8087 (coproc arithm=E9tique du 8086) utilisait =E7a en interne, sur 80 bits. un peu lent, mais efficace. en nombres entiers sur 16 ou 32 bits on fait d=E9j=E0 des trucs sympas :-)

Sinon, pour les cercles il y aussi l'algorithme de Bresenham

formatting link
e_Bresenham et
formatting link
s (meilleur)

ben bon courage ! on attend de voir les r=E9sultats ;-)

yg

--=20

formatting link
/
formatting link

il y a déjà eu plein de pistes postées, j'ajoute la mienne : CORDIC :-) il faut une multiplication constante suivie d'itérations de décalages/additions, et on fait toutes les fonctions trigo et même plus, les doigts dans le nez. c'est un peu bourring mais ça prend peu de place en mémoire et les opérations sont possibles en précision arbitraires, tant qu'on a les primitives qu'il faut (addition, soustraction, décalage, multiplication par constante). ça fonctionne en "virgule fixe", tout est normalisé entre 0 et 1.

j'ai fait joujou avec ça à une époque, pour faire des oscillateurs numériques mais chut...

formatting link
(ne pas faire gaffe aux maths, c'est juste pour comprendre pourquoi ça marche et à quoi servent chaque opération)
formatting link
(pas pire, avec du code source plus digeste)

note : le 8087 (coproc arithmétique du 8086) utilisait ça en interne, sur 80 bits. un peu lent, mais efficace. en nombres entiers sur 16 ou 32 bits on fait déjà des trucs sympas :-)

Sinon, pour les cercles il y aussi l'algorithme de Bresenham

formatting link
et
formatting link
(meilleur)

ben bon courage ! on attend de voir les résultats ;-)

yg

http://ygdes.com / http://yasep.org

On Jun 12, 7:45=A0am, whygee

C'est pas mal, mais l'algo Cordic n=E9c=E9ssite une table ? Alors autant y coller directement les valeurs des cosinus, non ?

dans mes souvenirs, non, CORDIC n'a besoin que d'une constante.

je n'ai pas pris le temps de bien regarder l'article de wikipedia, je ne sais pas ce qu'ils ont bien pu traficoter avec l'algorithme... qui est d'ailleurs assez fascinant :-) yg

--=20

formatting link
/
formatting link

res

je l'ai mis comme dernier lien dans mon post :-D comme quoi il faut lire jusqu'au bout avant de cliquer partout ;-)

yg

--=20

formatting link
/
formatting link

On Jun 12, 9:38=A0pm, whygee

Pas dans le lien que tu as donn=E9 :

formatting link

Bonjour,

Je n'ai pas eu accès au net de tout le WE (merci les orages), et ce matin je vois tous ces messages : SUPER !!

Merci à vous tous, je vais aller voir toutes vos pistes (pour le tracé de cercle avec racine carré j'avais déjà fait, mais ça ne résoud pas mon problème d'arcs)

a+ François

Francois wrote: Si vous avez des idées, je suis tout ouïe ================ Si tu préfères un copié-collé (qui marche ..) , voici un fichier source extrait d'un compilateur commercial

formatting link

( J'ai trouvé ça, fonction élaborée par les informaticiens de la société CCS qui normalement ne devrait pas se trouver sur le Web car, attachée seulement à chaque licence du produit ) Cette méthode, s'inspirant des (vieux) travaux de Bresenham est surtout adaptée pour "allumer" des pixels sur un écran. La transposition en n'importe quel langage est simple , int 16 bits mais "signed"

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required