Arduino Forum

International => Français => Topic started by: jfs on Nov 21, 2011, 01:30 pm

Title: programmation cartésienne.
Post by: jfs on Nov 21, 2011, 01:30 pm
J'ai quelques soucis avec un système cartésien.

Je dois tracer les segments d'un cercle dont les extrémités sont tangentes à l'intérieur du périmètre de ce dernier (pas sur d'être très clair  :smiley-red: ). Le diamètre du cercle peut être paramétré, mais la circonférence ne sera pas un chiffre "rond" ou inversement.

Dans une première approche, cela semble relativement simple, on calcule la valeur des segments (pair ou non) de façon à ce que le nombre de ces derniers rentre dans le cercle et que leurs extrémités se jouxtent.

les segment sont placés par le biais d'une boucle for qui compare la longueur de l'hypothénus du triangle cartésien formé par les vecteurs x-y , y-x et la valeur que doit avoir le segment, en plaçant toujours le point variable sur le cercle (toujours pas sur d'être clair  :smiley-red: :smiley-red:).

(http://i49.servimg.com/u/f49/11/19/17/06/segmen10.jpg)


J'ai trois problèmes :



Donc mes questions :



rendu des interro à .... je plaisante  XD
Title: Re: programmation cartésienne.
Post by: patsol on Nov 21, 2011, 01:38 pm
Quote
(toujours pas sur d'être clair  smiley-red smiley-red).

un p'tit dessin, pt'et
Title: Re: programmation cartésienne.
Post by: jfs on Nov 21, 2011, 02:55 pm
Voui, voui.... ça vient.  XD


Edit : c'est dans le premier message
Title: Re: programmation cartésienne.
Post by: fdufnews on Nov 21, 2011, 03:02 pm
L'idée c'est de tracer l'approximation d'un cercle par ses cordes ou de tracer une corde quelconque d'un cercle?
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 21, 2011, 03:55 pm
Mhm, c'est un cercle physique.
(un cercle mathématique ne peut pas être tracé ni représenté car c'est une infinité de segments)

Mais l'idée c'est simplement de tracer un cercle (sur un affichage, un écran, etc.) ou c'est de calculer des valeurs dans le cercle (points d'origine/fin des segments, longueur des segments, etc.) ?

Car si c'est uniquement pour générer une représentation graphique du cercle il y a peut-être des outils (bibliothèques) qui font déjà cela (Processing ? GDLib...) et/ou il y a moyen de simplifier sans que cela ne soit physiquement visible (genre un cercle de 720 segments : Il faut une bonne résolution pour voir que c'est une suite de segments).

Si c'est pour effectuer des calculs de trigonométrie, il y a de forte chance que la méthode ne soit pas optimale dans un système cartésien : En physique appliquée [modélisation des mathématiques] nous utilisons un système polaire pour résoudre les équations en rapport avec trigonométrie. C'est bien plus simple; il suffit de mettre une fonction de PI en Step dans la boucle For.
Title: Re: programmation cartésienne.
Post by: jfs on Nov 21, 2011, 04:03 pm
Je parle de cerle pour simplifier... comme c'est paramétrable, cela peut devenir une ellipse.

Ce qu m'intéresse, c'est le tracé des segments, le cercle est uniquement pour justifier et n'a pas vraiment besoins d'être tracé.

Je ne veux pas passer par une lib.

J'ai déjà une version qui fonctionne, mais uniquement pour un nombre de segments pair et divisible par 4, en faisant un quart du camembert, puis en le "copiant" avec une rotation.


Je vais tout de même regarder si j'arrive à m'en sortir en coordonnée polaire....  , mais je sens que je vais de nouveau passer quelques nuit blanches XD
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 21, 2011, 04:19 pm

Je parle de cerle pour simplifier... comme c'est paramétrable, cela peut devenir une ellipse.

Ce qu m'intéresse, c'est le tracé des segments, le cercle est uniquement pour justifier et n'a pas vraiment besoins d'être tracé.
(...)


Tu veux tracer des courbes aléatoires alors, genre Splines ?
Ou cela reste une forme de révolution ? (cercle, ellipse, etc.)

Si cela reste de révolution il y a les Coniques qui permettent de résoudre les équations.
[ ax2 + 2bxy + cy2 + 2dx + 2ey + f = 0 ; si e=0 : cercle et si 0<e<1 : ellipse]
Title: Re: programmation cartésienne.
Post by: jfs on Nov 21, 2011, 04:24 pm
Toujours en révolution.... la révolution ça me plait  XD

Aurais tu un exemple (liens) qui explique les coniques ?

Edit : 
coniques (http://fr.wikipedia.org/wiki/Conique)

C'est un peu ce que je disais pour les nuit blanches  :smiley-mr-green:
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 21, 2011, 05:02 pm

(...)
Aurais tu un exemple (liens) qui explique les coniques ?
(...)


Il y a de la documentation genre :
-> http://www.scribd.com/doc/14819165/Regressions-coniques-quadriques-circulaire-spherique
Et quelques autres que l'on peut trouver sur internet.

Mais je te préviens; c'est du lourd ce domaine !

J'ai bien quelques exemples de codes, mais mon soucis est qu'ils ne sont pas en C. Jamais pensé à utiliser une Arduino pour effectuer ce genre de calculs o.o"
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 21, 2011, 05:23 pm
A la limite, si tu es certain que cela reste dans une forme entre le cercle et l'ellipse et que cela ne part pas en hyperbole etc. et que tu me donnes un peu de temps (je vais être occupé au taf' jusqu'à une heure tardive), je te posterai un bout de code qui devrait fonctionner -.^
Title: Re: programmation cartésienne.
Post by: jfs on Nov 21, 2011, 07:11 pm
Merci.

En effet, c'est toujours une ellipse.... dégénérée lorsqu'elle devient circulaire  XD.
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 22, 2011, 12:15 am
Ok.
Et oui, un cercle est un cas particulier d'ellipse -.^
Dans ce cas c'est assez simple (j'espère que je ne vais pas me planter après avoir dit ça !).

Donc en partant de la conique :
ax² + 2bxy + cy² + 2dx + 2ey + f = 0
On simplifie car on sait que cela ne décrochera pas en hyperbole/parabole :
(x/a)² + (y/b)² = 1

Ensuite ce que l'on fait d'habitude comme je l'ai souligné précédemment, c'est que l'on passe dans un système polaire :
x = a*cos(theta)
y = b*sin(theta)
On peut vérifier que si a = b (cas du cercle), cela correspond bien à la génération d'un cercle; le rayon étant a = b = r.

Puis on arrange cela pour faire tourner l'angle dans une boucle For (genre radar qui va dessiner l'ellipse) :
Code: [Select]
for(t=0;t<angle;t++)
{
 x = a*cos(t*2*PI/angle);
 y = b*sin(t*2*PI/angle);
}


A noter que accessoirement le code n'est pas du tout optimisé ^.^" C'est juste pour donner un exemple.


Edit de Jean-François: juste fait une ch'tite correction dans la boucle for  ;)
Title: Re: programmation cartésienne.
Post by: jfs on Nov 22, 2011, 07:53 am
Merci pour ce petit bot de code qui fonctionne bien.

Par contre, je n'arrive pas à déterminer l'origine de la fonction (le centre de l'ellipsoïde).

Les points sont plus nombreux dans les émisphéres "x" donc les distances entres les points sont moins grandes que dans la zone "y".... et c'est le problème autour duquel je tourne depuis trois semaines  :smiley-mr-green:.
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 22, 2011, 04:11 pm

(...)
Par contre, je n'arrive pas à déterminer l'origine de la fonction (le centre de l'ellipsoïde).


Mhm... C'est à dire ?
L'origine des calculs se fait par rapport aux foyers de l'ellipse (il y a deux points) (?).
A la limite si tu veux connaître les coordonnées du barycentre de l'ellipse il suffit de calculer le point médian entre les deux foyers (?).

Les points sont plus nombreux dans les émisphéres "x" donc les distances entres les points sont moins grandes que dans la zone "y".... et c'est le problème autour duquel je tourne depuis trois semaines  :smiley-mr-green:.


Ah oui, ça, c'est normal.
Il n'y a que pour un cercle que l'intervalle entre les points sont égaux. Dans le cas de l'ellipse le facteur de transformation fait que l'intervalle entre les points n'est pas constant; ils se répartissent en fonction de la projection de la parabole.

On pourrait compenser leur répartition en introduisant une variation hyperbolique proportionnelle à l'angle formé entre la droite passant par les foyers et l'angle de projection mais il y a des inconvénients : Perte massive de résolution sur les parties les plus courbées de l'ellipse et impossibilité de résoudre l'équation lorsque que les sommets des foyers sont confondus (cas du cercle).

A coté de cela, il y a une question que je ne t'ai pas posé : C'est pour quoi faire ? ^.^ Parce qu'il y a peut-être une meilleure voie pour résoudre ton problème... Par exemple, les équations gaussiennes, ou l'algo de Bresenham. Mais cela dépend du contexte etc.
Title: Re: programmation cartésienne.
Post by: jfs on Nov 23, 2011, 05:04 pm


(...)
Par contre, je n'arrive pas à déterminer l'origine de la fonction (le centre de l'ellipsoïde).


Mhm... C'est à dire ?
L'origine des calculs se fait par rapport aux foyers de l'ellipse (il y a deux points) (?).
A la limite si tu veux connaître les coordonnées du barycentre de l'ellipse il suffit de calculer le point médian entre les deux foyers (?).



J'avais pas pensé aux deux foyers je regarderai ça en y pensant  XD



Il n'y a que pour un cercle que l'intervalle entre les points sont égaux. Dans le cas de l'ellipse le facteur de transformation fait que l'intervalle entre les points n'est pas constant; ils se répartissent en fonction de la projection de la parabole.

On pourrait compenser leur répartition en introduisant une variation hyperbolique proportionnelle à l'angle formé entre la droite passant par les foyers et l'angle de projection mais il y a des inconvénients : Perte massive de résolution sur les parties les plus courbées de l'ellipse et impossibilité de résoudre l'équation lorsque que les sommets des foyers sont confondus (cas du cercle).


Avec une solution de ce type ? (ensuite pour une nombre impair....  XD)

(http://www.mathcurve.com/courbes2d/orthogonale/hyperboles%20ellipses.gif)

J'ai trouvé ça sur ce site :

http://www.mathcurve.com/courbes2d/orthogonale/orthogonale.shtml


Ou ça avec la même question pour un nombre impairs de portions :

(http://xavier.hubaut.info/coursmath/com/comp/zsin.gif)

http://xavier.hubaut.info/coursmath/com/expon.htm


Mais je ne sais pas trop comment utiliser ça (si ça convient)  :smiley-sweat:.
Title: Re: programmation cartésienne.
Post by: jfs on Nov 24, 2011, 12:09 am
Il me semble avoir trouvé une solution graphique pour résoudre ce problème :

(http://i49.servimg.com/u/f49/11/19/17/06/ellips11.jpg)


Avec une ellipse dont l'excentricité est plus prononcée :

(http://i49.servimg.com/u/f49/11/19/17/06/ellips10.jpg)


Sur papier j'ai réussi la même chose avec un chiffre impair de segments, mais je n'arrive pas à le reproduire en code  :smiley-mr-green:
Je verrai ça demain.

En gros les lignes bleues sont la projection du cercle sur l'ellipse, en étant dirigée par l'axe des x qui est divisé en parts égales du nombre de segments.

Il faut ensuite que je détermine les points d'intersection enter les lignes bleues et mon ellipse et....  d'autres problèmes arriveront  XD
Title: Re: programmation cartésienne.
Post by: jfs on Nov 24, 2011, 11:07 pm
Avec des nombres extrêmes de segments (soit 5-100) je m'aperçois qu'il subsiste une différence entre les segments des x et des y  =(

Apparemment il faudrait que mes lignes bleues soient paraboliques ou hyperboliques... est ce que quelqu'un pourrait m'expliquer comment définir une fonction des ces deux types qui pourrait correspondre à ce que je recherche ?
Title: Re: programmation cartésienne.
Post by: ekaki on Nov 25, 2011, 06:28 am
(...)
Apparemment il faudrait que mes lignes bleues soient paraboliques ou hyperboliques... est ce que quelqu'un pourrait m'expliquer comment définir une fonction des ces deux types qui pourrait correspondre à ce que je recherche ?


J'en parlais précédemment, donc...
Si je ne m'abuse, l'intégration numérique entre le périmètre de l'ellipse et l"hyperbole passant par les foyers est :
yc=sqrt(a²sin(theta)²+b²cos(theta)²)
yc étant l'abscisse curviligne.

PS. Penses à mettre un dissipateur sur l'Atmel Jean-François -.^
Title: Re: programmation cartésienne.
Post by: jfs on Nov 25, 2011, 08:20 am

J'en parlais précédemment, donc...

J'avais noté  XD, je ne voulais pas te froisser par ma dernière remarque.


Si je ne m'abuse, l'intégration numérique entre le périmètre de l'ellipse et l"hyperbole passant par les foyers est :
yc=sqrt(a²sin(theta)²+b²cos(theta)²)
yc étant l'abscisse curviligne.

Merci pour cette formule, pour l'instant je n'ai pas encore réussi à la mettre en forme dans mon programme.... mais je en désespère pas  :smiley-mr-green:



PS. Penses à mettre un dissipateur sur l'Atmel Jean-François -.^

J'ai remarqué que ça bouffait pas mal de CPU ces "petits" calculs :smiley-eek:
Title: Re: programmation cartésienne.
Post by: Super_Cinci on Nov 25, 2011, 09:21 am
J'essaie de comprendre, mais fiou! ça me rappelle de vieux souvenirs de prépa, il y a 14 ans, je t'aurais pondu cela en 2 minutes, pis surtout, j'aurais compris tout de suite ce que tu voulais vraiment faire. Je me demande si tu n'as pas intérêt à basculer sur la platine chipkit max32 (32 bits 80MHz, soit plus que 20 x plus rapide en float, mais sans eeprom...)

bon courage!
Title: Re: programmation cartésienne.
Post by: jfs on Nov 29, 2011, 12:46 pm
Toujours pas réussi à faire ma fonction para-hyper-bolique.... mais en attendant, j'aimerais trouver le moyen de mettre les cercles rouges à l'intersection entre les lignes bleues et l'ellipse :

(http://i49.servimg.com/u/f49/11/19/17/06/sprock10.jpg)

Est ce que quelqu'un peut m'indiquer comment déterminer ces points ?
Title: Re: programmation cartésienne.
Post by: jfs on Dec 02, 2011, 07:47 am
C'est bon, j'ai réussi à faire quelques chose de satisfaisant (sauf la vitesse d'exécution) :

(http://i49.servimg.com/u/f49/11/19/17/06/sprock11.jpg)

J'ai fait un mix entre ma méthode d'approche de la position du segment par intégration et de rotation polaire.... en gros de l'intégration polaire  XD
Title: Re: programmation cartésienne.
Post by: ekaki on Dec 03, 2011, 04:56 pm
Joli ! ^.^
T'as fait une vérification cyclique de la longueur des segments afin de vérifier ?
Title: Re: programmation cartésienne.
Post by: jfs on Dec 03, 2011, 05:02 pm
En fait je suis en train de faire des contrôles et ça me prend des plombes à chaque essais.(je trace un cercle de la valeur du segments, ça me donne une bonne idée de la "précision").

Pour 10 segments avec un ratio de 70%, il manque environ 1/2 segments de longueur au périmètre pour que les 10 puissent s'inscrire dans l'ellipse.

Pour 51 segments, et un ratio de 50%, j'ai fait un facteur de correction qui me permet d'aller de 15 à 60 segments sans trop d'erreur.

Là je contrôle avec 101 segments et il manque 1/3 de segments pour que le dernier s'ajuste sur le premier.....

Donc la méthode est pas encore au top, mais  ça avance  :D
Title: Re: programmation cartésienne.
Post by: ekaki on Dec 03, 2011, 11:25 pm
Attention, en faisant une vérification par addition de tous les segments et en comparant par rapport à la formule du périmètre écliptique il est normal que cela soit trop court si tu définis 10 ou 20 segments.
Et ce, même si les segments sont tous de la même taille.
Pour que cela colle "finement" avec la formule du périmètre écliptique il faut mettre un nombre de segment très grand. (en théorie nombre segments infini => périmètre écliptique)

En fait par vérification je pensais plus à comparer la longueur de chaque segments entre eux. Histoire d'être sur qu'ils sont tous de la même longueur (moins une erreur à 10-5 ou dans le genre, liée aux approximations de calcul).
Title: Re: programmation cartésienne.
Post by: jfs on Dec 03, 2011, 11:43 pm
Ce que je voulais dire c'est que je divise la distance (x1-y1) - (x2-y2) de chaque segment. Ce point est le centre d'un cercle dont le diamètre correspond à la valeur espérée du segment, si les cercles se touchent sans se chevaucher, c'est suffisant pour moi... un contrôle graphique-visuel en quelque sorte :

(http://i49.servimg.com/u/f49/11/19/17/06/sprock12.jpg)

J'essaye de trouver une méthode pour définir un périmètre optimum pour un cercle circonscrit, mais pour l'instant ce n'est pas encore ça.

P=segment/sin(radians(360)/nbrSegments/2)*PI

Ou
P = périmètre
segment= longueur des segments
nbrSegments = le nombre de coté du polygone inscrit

Il subsiste une erreur, même lorsque l'ellipse est un cercle et avec n'importe quel nombre de segments
Title: Re: programmation cartésienne.
Post by: jfs on Dec 04, 2011, 08:19 pm
J'ai un peu changé ma formule pour calculer le périmètre de mon cercle circonscrit :

P=segment/sin(radians(360)/nbrSegments)*PI*2*corr

Ou
P = périmètre
segment= longueur des segments
nbrSegments = le nombre de coté du polygone inscrit
corr = facteur de correction en fonction du nombre de segments

Je dois corriger en multipliant par "corr" pour arriver au plus juste, voici les valeurs (approchées) relevées pour la variable "corr" pour différents nombre de segments :

201 > 0.5589
191 > 0.531  
181 > 0.507
171 > 0.952
161 > 0.90
151 > 0.8405
141 > 0.79
131 > 0.73
121 > 0.67885
111 > 0.93
101 > 0.849    
91 > 0.76      
81 > 0.905    
71 > 0.987    
61 > 0.851  
51 > 0.995    
41 > 0.918  
31 > 0.945  
21 > 0.988
20 > 0.989   
19 > 0.946   
18 > 0.987   
17 > 0.979   
16 > 0.969   
15 > 0.979   
14 > 0.959   
13 > 0.955   
12 > 0.97    
11 > 0.945
10 > 0.8641

Je ne sais pas comment trouver une relation entre ces valeurs afin de les calculer automatiquement.... si quelqu'un trouve une relation ou le moyen de la trouver  ;)

Edit : je corrige les valeurs en même temps que je renforce mes essais  ;)
Title: Re: programmation cartésienne.
Post by: ekaki on Dec 04, 2011, 10:52 pm
Depuis quelques jours je suis charrette au taf' et comme ça rame pas mal le forum (à priori ce n'est pas lié à ma connexion VPN farfelue) j'ai pas vraiment eu le temps de me pencher sur tes dernières évolutions. Tout au mieux de lire tes messages... Que je mets déjà plus de 30s à ouvrir (ce n'est pas très pratique).
Mais dès que je peux, je regarde cela -.^

Sinon, placer une variable de premier degré ne me semble pas suffisant pour faire des ajustements dans ces ensembles.
Du reste en voyant les fluctuations f(corr), cela ne parait ni linéaire ni exp/log (?). Logiquement cela doit être fonction de cos/sin, au minimum.
Title: Re: programmation cartésienne.
Post by: jfs on Dec 04, 2011, 10:55 pm
... j'ai pas vraiment eu le temps de me pencher sur tes dernières évolutions. Tout au mieux de lire tes messages...
Mais dès que je peux, je regarde cela -.^

Pas de soucis, c'est déjà super sympa d'y prêter attention.


Du reste en voyant les fluctuations f(corr), cela ne parait ni linéaire ni exp/log (?). Logiquement cela doit être fonction de cos/sin, au minimum.


C'est ce que je me disais également, j'ai cherché tout ce dimanche et je n'ai pas réussi à trouver...  :smiley-sweat: