programmation cartésienne.

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 :blush: ). 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 :blush: :blush:).

J'ai trois problèmes :

  • Suivant la position du segment, la boucle for mets un temps beaucoup de temps à trouver la coordonnées du deuxième points car elle part de x=0 jusqu'à x= segment
  • l'incrémentation n'étant pas en nombre entier, je ne tombe jamais sur 0 pour x ou y et je n'arrive jamais à la valeur du diamètre.... je n'arrive qu' à des valeurs approchées d'environ 0.05 à 0.7
  • Je ne sais pas comment faire le passage positif- négatif des axes x-y, la valeur du zéro n'étant jamais atteinte dans mes coordonnées x ou y

Donc mes questions :

  • Comment faire un contrôle dans la boucle for afin que celle-ci soit plus rapidement au résultat ?
  • Est ce possible d'avoir des valeurs "nettes" au milieu et en bouts de "course" ?
  • Comment faire mes passage +- et -+ si je n'ais pas de valeurs "nettes" ?

rendu des interro à .... je plaisante XD

(toujours pas sur d'être clair smiley-red smiley-red).

un p'tit dessin, pt'et

Voui, voui.... ça vient. XD

Edit : c'est dans le premier message

L'idée c'est de tracer l'approximation d'un cercle par ses cordes ou de tracer une corde quelconque d'un cercle?

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.

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

Jean-François:
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]

Toujours en révolution.... la révolution ça me plait XD

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

Edit : coniques

C'est un peu ce que je disais pour les nuit blanches :grin:

Jean-François: (...) 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"

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 -.^

Merci.

En effet, c'est toujours une ellipse.... dégénérée lorsqu'elle devient circulaire XD.

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 = acos(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) :

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 :wink:

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 :grin:.

Jean-François: (...) 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 (?).

Jean-François: 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 :grin:.

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.

ekaki:

Jean-François: (...) 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

ekaki: 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)

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/expon.htm

Mais je ne sais pas trop comment utiliser ça (si ça convient) :sweat_smile:.

Il me semble avoir trouvé une solution graphique pour résoudre ce problème :

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

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 :grin: 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

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 ?

Jean-François: (...) 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 -.^

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

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

ekaki: 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 :grin:

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

J'ai remarqué que ça bouffait pas mal de CPU ces "petits" calculs :astonished:

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!