L'Air du Bois est une plateforme Open Source de partage collaboratif ouverte à tous les amoureux du travail du bois. (En savoir plus)

Rejoindre l'Air du Bois Se connecter

Boris Beaulant

Défi : Comment trouver analytiquement l'approximation d'une Ellipse par une série d'arcs de cercle ?

Quoi de mieux pour commencer cette nouvelle année 2024 que de remettre les méninges en route avant d'aller à l'atelier ?

Dans le cadre du développement de la prochaine version d'OpenCutList, il se trouve que j'ai bien envie de profiter de l'intelligence collective pour résoudre un problème de géométrie.

Le contexte

OpenCutList va permettre d'exporter une projection 2D des pièces au format DXF.
Mais comme chacun le sait SketchUp ne connait pas la courbe et dessine seulement des segments. Afin d'aller plus loin qu'un simple export de polygones, avec Martin Müller, on a écrit un algorithme qui tente de retrouver les portions de polygones qui seraient des arcs de cercle ou d'ellipses. (les autres types de courbure ne sont pas détectés ... un autre défi ?).

Le système marche plutôt bien, mais on se heurte à un nouveau défi.

Limites du format DXF

Le format DXF est né à une époque ou la puissance des ordinateurs n'était celle d'aujourd'hui. Il a donc parfois certaines limitations par rapport à l'usage que l'on veut en faire aujourd'hui.
En effet, un "chemin" continu en DXF se dessine avec une Polyline.
Une polyline est une série de sommets (points) ordonnées et reliés par des segments ou des arcs de cercle. La forme crée par la polyline peut être ouverte ou fermée.

Et c'est là que la limitation intervient. Il n'est pas possible ici de relier deux sommets par un arc d'ellipse. Pour ça, il faudra dessiner un arc d'ellipse non connecté au reste du chemin ... ce qui, avec les divers arrondis, peut apporter des discontinuités dans le "chemin". Bref, ça ne va pas.

Le problème à résoudre

L'option est donc de convertir les arcs d'ellipse en une série d'arcs de cercle le plus approchant possible. En limitant tout de même leur nombre pour garder des fichiers légers à manipuler une fois sur les machines.

Ce que nous avons

Soit un arc d'ellipse défini par :

  • Rx, son grand rayon
  • Ry, son petit rayon
  • C, son centre (point 2D)
  • a, son angle d'inclinaison
  • a1, l'angle de début d'arc (dans le repère de l'ellipse) ou E1, son point de début
  • a2, l'angle de fin d'arc (dans le repère de l'ellipse) ou E2, son point de fin

Ce que nous voulons

Une liste ordonnée d'arcs de cercle approximants l'arc d'ellipse rouge avec pour chacun :

  • P1, son point de début
  • P2, son point de fin
  • C, son centre

A vos copies 🤯

Mis à jour
ourea
( Modifié )

1ère étape : exprimer le problème dans le repère de l'ellipse (axes coïncidant à x et y : a = 0, C = (0,0)). Au moins dans un premier temps, il vaut mieux chercher à résoudre le problème dans ce repère et appliquer les transformations adéquates avant et après 😉.

Kentaro

ourea Une petite matrice de rotation du repère, et hop, on peut le faire à n'importe quel moment du calcul. Cela ne change rien au processus.

ourea
( Modifié )

Avant de résoudre analytiquement un problème mathématique, quand on a l'habitude, on commence par l'exprimer dans sa forme la plus simple. Ca fait partie du "processus" de résolution...

Tu ne verras jamais un mathématicien traiter le problème (ou y réfléchir) directement sous cette forme.

D’où ma suggestion à Boris Beaulant...

Kentaro

ourea Oui, bien sur, c'est un truc de base. Mais cela ne change pas grand chose au problème... Le repère, on le change quand on veut, c'est une question marginale.

ourea

Ca permet de réduire le nombre de variables et supprimer les couplage avant de commencer à réfléchir.

Sinon Kentaro, je peux encore en placer une sans que tu viennes m'emmerder ? T'as que ça à faire de tes journées ?

Kentaro

ourea Oui, comme déjà dit, c'est un truc évident, cette histoire du repère. Mais c'est pas ça qui résoud la question.

Faut pas prendre la mouche comme ça, je ne vois pas en quoi je suis venu t'emmerder... J'ai simplement dit qu'une petite matrice de rotation, et hop, la question était réglée. Je l'ai dit très gentiment, et sans aucune animosité.

ourea
( Modifié )

Est-ce qu'on est dans la section réponses ?

Personne n'est dupe...

Boris Beaulant

Hey les gars commencez pas l'année en vous bouffant le nez. Paix et amour 😘. Restons-en là !

ourea, ta remarque est fondée. Mais, j'ai posé le problème ainsi, parce que c'est ainsi qu'il est à résoudre. En occulter un bout (même s'il parait évident) produit pas un résultat valable. C'est toujours dans les trucs faciles qu'on écarte qu'on fera le plus d'erreur.
Pour preuve, mon algo actuel donne des effets de bord que j'explique mal pour les ellipses qui ont justement ... un angle...

Par ailleurs, cette question étant destinée à survivre dans le temps à mon besoin, je serais content qu'elle apporte une réponse générale.

Kentaro, chacun ses évidences.

ourea
( Modifié )

Bonne année Boris Beaulant, je te souhaite le meilleur (et moins d'échanges comme ceux-là - j'en suis désolé).

Justement, si ton algo actuel opère dans ce repère général, une résolution dans le repère de l'ellipse (avec transformations appropriées avant et après) éviterait les "effets de bord" que tu observes, puisque le découpage en arcs de cercle serait indépendant de l'orientation / position de l'ellipse (lorsqu'observé dans le repère de l'ellipse, s'entend). C'est une solution.

Transformation avant : translation en (0,0) puis rotation.
Transformation après : rotation inverse puis translation en C.

Boris Beaulant
( Modifié )

Meilleurs voeux ourea !

Non, ce qui semble donner des résultats incohérants, c'est la recherche d'un point (dans le repère général) sur l'ellipse (code ici)

ourea

Les formules m'ont l'air bonnes... Par contre, tu peux essayer de remplacer ellipse_def.angle par -ellipse_def.angle (et/ou angle par -angle, dans une moindre mesure), car il dépend de la convention utilisée (que j'ignore).

ourea
( Modifié )

Boris Beaulant, en complément, voici ce que j'obtiens avec tes formules, pour
ellipse_def.center.x = 3
ellipse_def.center.y = 2
ellipse_def.xradius = 0.8
ellipse_def.yradius = 0.2
ellipse_def.angle = 0.2
et angle qui varie par pas de 0.1.

En somme, ça fonctionne... Ton problème doit donc venir d'ailleurs.

Boris Beaulant

ourea merci d'avoir regardé. J'ai trouvé mon problème ! Il venait en effet d'ailleurs. J'ajoutais 2 fois l'angle d'inclinaison ... 🙄

ourea

Voilà un problème de réglé...

Et au fait, Martin Müller n'a pas d'idées sur une méthode ? Il parait pourtant plutôt bien armé pour ça...

J'ai bien peur que la détermination d'une solution optimale nécessite une approche itérative, ce qui n'est pas ce que vous voulez, j'imagine ?

Boris Beaulant

Plus il y a de gens, plus il y a d'idées 😉

une solution optimale nécessite une approche itérative, ce qui n'est pas ce que vous voulez, j'imagine ?

J'ai pas de frein à ça tant que ça fait pas des calculs de 10min.

mofran

j'ai un reste de frustration a propos au fait que le format standard natif créé par autodesk n'est pas évolutif! il manque un chainon? pourquoi dxf pour tout par tout , si il ne coche pas toutes les cases de l'esquisse 2d? que dit autodesk a ce propos? si c'est ce qu'autocad propose de mieux, autocad est il mort ou faut il militer pour l'apparition un dxf+courbecomplexe ???
il n'existe rien d'autre ou les pistes existantes ne sont pas suffisament reprises globalement pour être supporté par les cadors du market? OCL va t'il renverser la vapeur? (yes)

Boris Beaulant
( Modifié )

mofran le SVG supporte très bien tout ça et OCL exporte aussi en SVG.

Le DXF reste malheureusement un standard universel dans les logiciels métier et autres machines d’usinage.

DXF supporte les splines, mais à ma connaissance ça ne mixe que des courbe de Béziers sans cassure de courbe.

Oui DXF n’est pas le format qui va bien. Je le comparerai bien au système impérial qui rend les américains fiers et qui est merdique à implémenter dans du code. Grosse perte de temps.

Bref, vive le système métrique et les standards ouverts !

AtelierDZT
( Modifié )

Bonjour Boris Beaulant et meilleurs voeux pour cette nouvelle année !
J'ose tenter un ping à Toutenbois qui aura peut-être le temps et je l'espère les compétences en Maths adéquates ! 🙏😋

Toutenbois

Salut Je suis passé voir le sujet hier, cependant il faut bien admettre que les maths c'est pas comme le vélo... 20ans à enseigner en collège, conjuguer avec des années de menuiserie, plus passionné par les épures que par les méthodes analytiques pour obtenir les angles et autre information necessaires , m'ont bien ramolli le cerveau. D'autant plus que j'ai toujours été passionné de pédagogie, c'est a dire la manière de bien enseigner plutôt que math pour le plaisir de faire des maths... et je crois pouvoir dire que mes élèves ne s'en sont que mieux porté.

Boris Beaulant

😉

Belle année à toi Sam.

fab83

Toutenbois on en aurait tous voulu des profs avec cette approche au collège 😉

fab83

Bonjour et bonne année à tous
Je n'ai pas de réponse à donner par contre si je comprend prend l'idée reviens à transformer une spline en polyline
Bon bah sa ne va pas te plaire les autocad-like que je connais (nanocad - acad-draftsight) ont éludés la réponse et transforment la spline en succession de droites
là ou ils sont capable de le faire avec une ellipse ils ont semble t'il jeter l'éponge pour les splines ....

francoisB30
( Modifié )

bonjour avez vous trouvé une solution ?

Boris Beaulant

Il y en a plusieurs et avec chacune avantages et inconvénients du différents.
Je vais panachez ce qui a été proposé ici et je vous donnerai la solution retenue.

Connectez-vous pour ajouter un commentaire.
?

11 réponses

2
Boris Beaulant
( Modifié )
Meilleure réponse

C'est top, vous m'avez bien aidé avec vos réponses ! Voici la solution que j'ai finalement utilisée.
Comme toutes les solutions d'approximation, c'est une affaire de compromis...

La stratégie

  1. Je crée un tableau d'échantillonnage de points répartis tous les sur 1/4 d'ellipse. Il y a donc déjà plus de points dans les parties aplaties de l'ellipse.
  2. Je parcours ce tableau pour trouver l'équation d'un cercle avec les 3 premiers points (en commençant du côté du petit rayon de l'ellipse). Puis je compare avec le 4 ième pour savoir s'il peut faire partie du même cercle avec un décalage maximal de 0.001 pouce. Si oui, je regarde le suivant. Si non, je re-calcul un cercle avec 3 points. Et je répète l'opération jusqu'à plus avoir de points. S'il me reste moins de 3 points, j'utilise la formule pour trouver le cercle oscultateur pour les 1 ou 2 points qui me reste. De là, j'ai donc une liste de portions avec un angle de début et de fin et le centre du cercle associé.
  3. Je duplique ce résultat sur autant de quarts d'ellipse qu'il en faut pour couvrir l'arc d'ellipse que je veux approximer.
  4. Je trouve dans cette liste avec l'angle de début et de fin de mon arc les différentes portions qui m'intéressent. Et je recoupe celle de début et de fin pour correspondre précisément aux angles de l'arc.
  5. Je n'ai plus qu'à parcourir les portions pour dessiner la polyline comme succession d'arc de cercle.

Besoins remplis

  • L'approximation étant toujours calculé sur une ellipse complète, j'ai toujours des points clés coïncidents peu import les angles de début et de fin de l'arc.
  • Il y a toujours des points aux extrémités des rayons de l'ellipse.
  • Dans la limite du premier échantillonnage à 1°, l'approximation s'affine plus si les valeur sont grandes. L'écart à la courbe étant exprimé en unité absolue.

En vrai, ça fait quand même toujours pas mal de points quand l'ellipse s'aplatie. Mais c'est aussi le prix à payer pour avoir la précision voulue.

Pour les plus curieux, le code est .

Mis à jour
Kentaro

You did it! Bravo!

Jean Galmot

👍

francoisB30

bravo

Connectez-vous pour ajouter un commentaire.
2
Kentaro
( Modifié )

Sans trop réfléchir...

Une ellipse a une équation cartésienne ou polaire. On peut facilement trouver cette équation à partir des paramètres que tu donnes, Rx, Ry, C, a, etc.

A partir de cette équation, tu prends 3 points sur l'ellipse.

On peut facilement trouver un arc de cercle passant par ces 3 points (la encore à partir de l'équation cartésienne ou polaire d'un cercle).

ici, les équations permettant de trouver l'arc de cercle passant par 3 points:

cral-perso.uni...cercle_3pts.pdf

Sur les parties où la courbure de l'ellipse est faible, on peut prendre des points relativement éloignées.

Là où la courbure est plus accentuée, il faudra réduire la distance entre les points (pour définir la courbure, il suffit de prendre le rapport entre la corde et la flèche définies par ces 3 points).

On doit pouvoir trouver une petite formule permettant d'optimiser la distance entre les points de manière à minimiser l'écart type entre les points de l'ellipse et le cercle.

Autre piste plus "puissante": Pour "lisser" une courbe définie par un nuage de points, il y a les techniques de régression non paramétrique. Ce sont des maths, mais une fois les formules programmées, cela devrait tourner tout seul.

A noter que mon petit logiciel de dessin 2D produisant des dxf, Deltacad, me résoud ce genre de probleme tout seul: trouver l'arc de cercle passant par 3 points définis, et donne des courbes non segmentées.

Mis à jour
Kentaro
( Modifié )
Boris Beaulant

Ca risque fort de ne pas nous amener à des arcs de cercle tout ça.

Boris Beaulant
( Modifié )

Merci Kentaro pour les pistes.

Pour le moment, je cherche le cercle oscultateur tous les Pi/32 (entre a1 et a2) pour en extraire sa "courbure" et c'est pas trop mal. Mais ça fait trop de points, je trouve.

Kentaro
( Modifié )

Boris Beaulant

Pour ta question d'origine, comment trouver un arc de cercle passant par 3 points d'une ellipse, j'ai mis la réponse plus haut.

A toi de définir la distance entre les points donnant l'approximation que tu considères comme la plus acceptable entre l'arc d'ellipse et l'arc de cercle.

La notion de cercle osculateur est intéressante, mais tu vas avoir une succession d'arcs de cercles très rapprochés si tu ne veux pas une succession de bosses.

Sinon, regarde les techniques de lissage ou comment trouver l'équation d'une courbe passant par x points (polynomiale).

De toute façon, tu auras toujours une approximation, et plus tu auras de points, plus l'approximation sera faible.

Boris Beaulant
( Modifié )

Faut que je creuse les trios de points pris sur l'ellipse pour y faire passer un cercle.

A toi de définir la distance entre les points donnant l'approximation que tu considères comme la plus acceptable entre l'arc d'ellipse et l'arc de cercle.

Oui, mais c'est dans un sens la sous-question de la question posée ici aussi.
On sait que ça sera toujours de l'approximation. Donc l'envie est de trouver le "meilleur" compromis entre nombre de points et écart avec l'ellipse d'origine.

Sinon, regarde les techniques de lissage ou comment trouver l'équation d'une courbe passant par x points (polynomiale)

Barf le problème est un peu à l'envers ici. On a déjà le truc lisse : c'est l'ellipse. Et on veut en faire des points reliés par des arcs de cercle.

Kentaro
( Modifié )

Boris Beaulant

Faut que je creuse les trios de points pris sur l'ellipse pour y faire passer un cercle.

ça, c'est simple, tu as les formules plus haut.

"Donc l'envie est de trouver le "meilleur" compromis entre nombre de points et écart avec l'ellipse d'origine."

ça se calcule facilement. Tu prends 3 points relativement éloignés sur l'ellipse. Tu as les équations de l'ellipse et du cercle passant par les 3 points. Tu calcules alors les écarts entre les deux courbes (il suffit du point au milieu entre deux points), et si c'est plus que ce que tu veux comme approximation, tu réduis la distance entre les 3 points. C'est itératif, jusqu'à ce que tu aies l'approximation recherchée. L'avantage, c'est que sur des parties de courbes peu courbées, l'itération ne durera pas longtemps.
Et de plus, tu peux mettre un test au début de l'iteration en calculant la courbure par le rapport entre la corde et la flèche sur les 3 points.
Si la courbure est faible, tu peux prendre des points éloignés, si la courbe est forte, il faudra prendre des points plus rapprochés.

Boris Beaulant

ça, c'est simple [...]

Barf, reste à trouver une stratégie efficiente pour choisir les trios de points.

Jean-Claude Di Fazio

La méthode qui consiste à vérifier l’écart entre un point de l’ellipse et son équivalent sur l’arc de cercle me paraît bonne.
En utilisant la propriété des foyers de l’ellipse (la somme des distances d’un point quelconque à chaque foyer est constante et vaut 2 fois la longueur du grand axe), l’erreur en chaque point reconstitué est assez rapide à calculer.
Sinon, autre méthode très différente, on trace tout au compas : peinturemamanl...tus.fr/?p=25052
Puis on vérifier le taux d’erreur sur les points de raccordement (4 tous symétrique donc un seul calcul).

Je me souviens qu’en cours de dessin technique on traçait avec 8 points, dont les 4 donnés par grand axe et petit axe et 4 autres fournis par deux cercles centrés sur les foyers.

etiennedesthuilliers
( Modifié )

comme je suis d 'une inculture crasse a quoi cela peut servir de connaitre une telle formule et dans quel cas je pourrais trouver cela en menuiserie et du fait de mon inculture je serait arrêté dans mon travail
mais si c" est un jeu continuons a résoudre la quadrature du cercle
modestement je travaille au simblot et j arrête lors que l œil est content
mon oncle jardinier le faisait avec son cordeaux et 3 plantoirs
bien amicalement le dernier de la classe

AtelierDZT
( Modifié )

Si j'ai bien compris, il s'agit d'exporter des données Sketchup au format DXF en améliorant la "résolution" des fausses courbes (successions de segments) en les transformant en vraies approximations courbes :)

Ce fichier DXF pourra être ensuite intégré dans un processus de CAO/DAO voire FAO.
De l'informatique à la menuiserie, il n'y a parfois qu'une fraise et un moteur qui la fait tourner...et un autre moteur qui la fait se déplacer 😇

AtelierDZT, l'amateur de CNC 🤩

Boris Beaulant
( Modifié )

✔ Testé

J'ai testé avec la recherche de cercle par 3 points et la stratégie suivante :

  • découper l'arc d'ellipse avec un point de test tous les de 1°
  • prendre 3 points consécutifs en extraire le cercle correspondant
  • boucler sur les points suivant jusqu'à ce que le point ne soit plus sur le cercle avec un delta donné.
  • créer l'arc et recommencer à l'étape 1 jusqu'à la fin du tableau de points.

Le résultat donne l'image jointe. Testé avec 2 tailles. et delta = 0.1mm

Problèmes :

  • Le delta n'a pas la même influence suivant la taille de la forme
  • Les points clé ne sont pas forcément à des endroits stratégiques (extremum). Leur position dépend du départ
Kentaro

Boris Beaulant Peut-être peut-on faire un truc glissant:

cercle P1 P2 P3
cercle P2 P3 P4, etc

et faire la moyenne entre les arcs de cercle ?

ourea
( Modifié )

Boris Beaulant C'est entre autre l'effet du pas constant en angle.

A mon sens, tu ne peux pas te passer du calcul de la courbure locale pour pouvoir mettre plus de point là où la courbure est la plus grande d'emblée (étapes 1 et 2 de ma réponse).

Une fois que tu as les valeurs des courbures (ou, mieux, l'expression de la courbure en fonction de l'angle de coordonnée polaire), il est possible de répartir les points selon ce profil de valeurs.

Une méthode (pas tout à fait directe) et de traiter la courbure comme une densité de probabilité (c), l'intégrer (C), prendre l'inverse (C^-1), et ensuite, pour N points, tu calcules la valeur de C^-1 à intervalles réguliers.
C'est la méthode de la transformée inverse mais avec un échantillonnage régulier plutôt qu'aléatoire.
Tu noteras qu'il est possible de faire du tout analytique ou du numérique, en tabulant les valeurs.

Sinon, tu demandes "How to distribute points on an ellipse so that the point density matches the local curvature?" à ChatGPT, et il te dit à peu près pareil... 😉

Boris Beaulant
( Modifié )

il est possible de répartir les points selon ce profil de valeurs.

Wep, je comprends bien le principe, mais je vois pas comment ça peut se faire concrètement.

Sinon, tu demandes à ChatGPT

Il sort un truc différent à chaque fois et c'est pas toujours fonctionnel.

Bon, tout ça me montre que j'aurai du mieux écouter au lycée ... je tutoie mes limites rien à essayer comprendre ce que tu écris :)

ourea

Désolé, c'est surtout que je me limite à donner les grandes lignes pour voir s'il y a un intérêt, mais je peux mieux développer (je le ferai sous ma réponse). Après la mise en pratique peut aussi réserver des surprises...

Pour le reste, je ne crois de toute façon pas que l'on apprenne ça au lycée 😉

Eric78

cf mon post où il y a le rayon de courbure Rc en fonction de l'angle polaire.
Sinon et comme proposé aussi par ourea, je rejoins le fait qu'il vaudrait mieux itérer sur le rayon de courbure (sans oublier les extrema locaux), retrouver les angles polaires correspondants avec la formule du rayon de courbure, ce qui donne alors les points intermédiaires.

Boris Beaulant
( Modifié )

Eric78 c'est certain que la formule de la courbure donne une chose intéressante. cf la vague de l'image jointe.
Mais en l'état, je vois pas trop comment l'utiliser.

ourea

Boris Beaulant Que représente la vague, en fait ?

Boris Beaulant
( Modifié )

ourea le courbure en fonction de t. a et b étant les rayons de l'ellipse.

$$\kappa(t) = \frac{ab}{(a^2\sin^2(t) + b^2\cos^2(t))^{3/2}}$$

def curvature(a, b, t)
 (a * b) / Math.sqrt((a**2 * Math.sin(t)**2 + b**2 * Math.cos(t)**2)**3)
end
ourea
( Modifié )

👍

Dans l'approche décrite plus haut, reste plus qu'à intégrer 😕... autant dire que je procéderais numériquement.

Kentaro
( Modifié )

En effet, l'échelonnement des points dépend de la courbure. Un truc tout bête pour avoir une "idée" de la courbure, c'est de calculer, pour chaque triplet, le rapport entre la corde et la flèche. Si le rapport est inférieur à un paramètre donné, il faut modifier le triplet.

JPA33

Bonjour,

Méthode purement graphique :

A partir du Croquis de Boris :

  • Considérer les 2 Segments [cE3] et [cE1] qui sont les 2 'Demi-diamétres conjugués' connus de l'Arc d'Ellipse [E1,E3] à trouver (les Points €t à cet Arc).
  • Utiliser la Méthode Graphique donnant, à partir des '2 Demis- diamètres conjugués' connus, les Positions et Grandeurs des 2 demi- Axes principaux de l'Ellipse à trouver (Cela fait parti de l'Etude des Coniques en Géométrie plane).
    Plus évident en raisonnant avec les 2 'Diamètres Conjugués' et les 2 'Axes Principaux' de l'Ellipse à trouver en grandeur et Position.
  • Enfin, tracer au Compas, le 'Grand Cercle' et le 'Petit Cercle'..... puis entre les 2, localement sur l'Arc Cherché, les Points Descriptifs de l'Arc Ellptique à étudier. Faire alors un symblotage à l'Instrument.

Bon essai sur la Table à Dessin.... sans calcul.

Connectez-vous pour ajouter un commentaire.
1
ourea
( Modifié )

Une approche analytique (non itérative) fournissant une discrétisation continue sur [E1, E2] et accessoirement à dérivée continue en E1 et E2 (à supposer que ce soit le cas avant discrétisation), avec une évolution régulière des longueurs d'arcs de cercle entre E1 et E2 fonction de la courbure locale (plus d'arcs de cercle là où il faut afin d'approcher au plus près le profil elliptique à moindre coût).

Définition du problème

Via les transformations appropriées, on exprime le problème dans le repère de l'ellipse : axes principaux alignés avec x et y, centre en (0,0), et on normalise le rayon selon x ; le rayon selon y devient "a" (histoire de ne pas se promener des rapports de rayons dans les équations). Pour cela, on applique les transformations successives : translation en (0,0), rotation de l'ellipse (des points E1 et E2), puis normalisation (il faudra appliquer les transformations inverses, en sens inverse après la résolution afin de se replacer dans la configuration réelle : "dé-normalisation", rotation inverse, translation en C). Les points E1 et E2 deviennent e1 et e2.
On définit également une "erreur" (maxi) pour la discrétisation, "e", comme la distance maximale entre la discrétisation en arcs de cercles et l'arc d'ellipse.

Résolution

(On peut travailler en coordonnées polaires dans un premier temps, mais les coordonnées curvilignes semblent plus appropriées.)

  1. On calcule la courbure le long de l'arc d'ellipse (solution analytique)
  2. On distribue des points le long de ce profil en fonction de C, avec une densité proportionnelle à la courbure (une approche exacte existe).
    Les points définissent les lieux d'intersection entre l'arc d'ellipse et les arcs de cercle.
  3. En chaque point, on calcule le cercle de courbure (solution analytique)
  4. On calcule les points d'intersection des cercles de courbure voisins (solution analytique, il y en à 2, il faut prendre le bon)
    Les arcs de cercle définissent la discrétisation de l'arc d'ellipse. On remarque que puisque les rayons des cercles de courbure sont d'autant plus petits que la courbure est localement importante, les intersections sont "du côté" où la courbure locale est la plus grande, ce qui donne bien une discrétisation plus fine là où la courbure est la plus grande.
  5. Pour chaque point d'intersection, on calcule la distance minimale à l'arc d'ellipse (il doit aussi y avoir une solution analytique), c'est l'"erreur" en ce point, qui est localement le plus éloigné de l'arc d'ellipse ; c'est donc bien l'erreur maximale. Grâce à l'étape 2, les points devraient avoir des erreurs similaires, ce qui est ce que l'on recherche.

Si l'erreur est supérieure à l'erreur maximale fixée (e), alors c'est qu'il n'y a pas assez de points. On recommence avec un nombre plus grand. Sinon, on peut diminuer le nombre de points.

En creusant, il doit être pouvoir de connaître l'erreur (et donc le nombre de points) a priori. Sinon, on commence avec un ou quelques points internes.

La méthode implique qu'il y aura au moins un point intermédiaire. Le cas d'un seul arc de cercle est à traiter séparément... Sinon, réviser l'approche pour considérer les points comme les extrémités des arcs de cercle plutôt que leurs points d'intersection avec l'arc d'ellipse.

Mis à jour
Boris Beaulant
( Modifié )

Merci ourea !

J'avoue qu'à la lecture le raisonnement semble se tenir. Mais j'ai aucune idée comment le coder et je suis pas certain d'en avoir vu les subtilités.

Je dirai pas non à un petit croquis 😉 ?


On calcule la courbure le long de l'arc d'ellipse

et

En chaque point, on calcule le cercle de courbure

C'est pas la même chose ? = rayon du cercle oscultateur ?

ourea

Non, la courbure, c'est la dérivée seconde (la variation de la pente). C'est l'inverse du rayon du cercle osculateur.

Grande courbure = petit rayon de courbure.

Boris Beaulant
( Modifié )

Ta proposition se rapproche de ceci, non ?

ourea
( Modifié )

Oui, ça m'a l'air d'être la même chose (et les résultats sont cohérents). L'avantage de ce document est qu'il est formulé directement pour le problème posé...

Il traite les points 1 et 2, qui à mon avis sont les briques essentielles, et la suite découle mieux que ce que j'ai décris ci-dessus.

Je me baserais donc sur ce document.

Il te faudra quand même une mesure d'erreur pour savoir combien de points utiliser.

(Par contre, à relire, le cas d'un arc d'ellipse est un peu plus compliqué que ce qu'il explique, car la courbure ne varie pas forcément de façon monotone. Je pense que la solution au point 2 se rapproche alors de ce que j'ai décris ailleurs).

PS. Je t'aiderais bien avec des formules ou du pseudocode, mais je ne suis vraiment pas dispo ces jours-ci.

ourea
( Modifié )

Boris Beaulant

Je repars de ce commentaire : lairdubois.fr/...entaires/368855. C'est en fait l'expression inverse (le rayon de courbure) qu'il faut utiliser.

Pour découper ton arc d'ellipse en segments de longueur variant en fonction du rayon de courbure (arcs plus petits là où le rayon de courbure est plus petit), et le faire de manière exacte, c'est-à-dire en pouvant obtenir ces arcs directement à partir de leur nombre sans avoir à appliquer de corrections a posteriori, voici la démarche en pratique :

  • Calculer et tabuler le rayon de courbure le long de l'arc d'ellipse. Tu le découpes par exemple en 100 pas angulaires, et tu enregistres tout ça dans deux tableaux (un pour l'angle et un pour le rayon de courbure). Tu as donc accès à la valeur de la courbure en tout point (via des interpolations entre les points).

  • Calculer l'intégrale du rayon de courbure le long du profil. Pour ça, tu crées un autre tableau (rayon de courbure intégré). Les angles sont les mêmes que précédemment. L'intégrale du rayon de courbure est obtenue en copiant le tableau "rayons de courbure", puis en faisant simplement un "for (i = 1; i < N; i++) c[i + 1] += c[i];" (pour une indexation 0). En d'autres termes, pour chaque entrée du tableau (excepté la première), tu ajoutes la valeur de l'entrée précédente (dans le sens ascendant, pour un effet cumulatif). Tu peux ensuite normaliser les valeurs par rapport à la dernière : le tableau contient alors des valeurs qui varient entre 0 et 1.
    (en fait, ça démarre à un peu plus que 0)

  • Il faudra utiliser la fonction inverse. Donc, conceptuellement, tu considères alors le second tableau (les rayons intégrés) comme ton axe des x et le premier (l'angle) comme l'axe des y.

Supposons que tu veuilles 11 points le long de l'arc (en comptant les points aux extrémités). Comment faire ?

Tu considères les valeurs 0, 0.1, 0.2, ..., 0.9, 1 (tu peux aussi omettre 0 et 1, qui correspondent aux extrémités de l'arc d'ellipse). Tu recherches la case correspondante dans le tableau "rayons intégrés" et tu lis la valeur dans la même case du tableau "angle".

(Pour peaufiner, plutôt que de prendre la valeur de la case, une interpolation (linéaire) serait bienvenue...)

Boris Beaulant
( Modifié )

Merci !
Voici déjà un premier résultat sans interpolation avec 36 points sur une ellipse complète et un échantilon de 1000 valeurs calculées 😉
Je regarderai à faire mieux plus tard.

ourea

Et ben voilà, la grande classe ! 😉

Boris Beaulant

Mais dans cette façon de faire, il va y avoir un nombre fixe de points quelque soit la longueur de l'arc. Et il n'y a pas forcément de point sur les extremums.
Il faudrait presque toujours faire les calcul sur l'ellipse complète et extraire les points contenus sur l'arc... 🤔

ourea
( Modifié )

Et il n'y a pas forcément de point sur les extremums. Il faudrait presque toujours faire les calcul sur l'ellipse complète et extraire les points contenus sur l'arc...

Il faut construire les tableaux (initiaux) sur l'arc d'ellipse et non sur l'ellipse complète.
Tu connais les points aux extrêmes. Pour n points intermédiaires, tu considères les valeurs i/(n+1), i variant de 1 à n. Cela te donne une distribution adéquate de points sur l'arc.
(Les extrêmes correspondent à i=0 et n+1, mais tu connais déjà les positions...)

Mais dans cette façon de faire, il va y avoir un nombre fixe de points quelque soit la longueur de l'arc.

Savoir combien il faut de points est un autre problème (mathématique). Cela dépend de la manière dont tu définis les arcs de cercle et l'erreur que tu acceptes sur l'approximation de l'arc d'ellipse en arcs de cercle.

EDIT Au sujet du nombre de points, tu peux aussi (peut-être) l'estimer en fonction des valeurs du rayon de courbure le long de l'arc. Suppose que tu appliques cela à un cercle. Le rayon de courbure sera toujours la même et donc n=0... (Par contre, c'est bien un problème différent de celui de savoir comment positionner les points.)

Boris Beaulant
( Modifié )

Je voulais dire qu'il n'y a pas forcément de point "clé" sur les 4 "pointes" de l'ellipse (sur les rayons).

Pour la répartition des points une chose qui me semble importante par rapport à l'usage ici est que quelque soit la taille de la portion d'arc à traiter les points choisis se trouvent aux mêmes endroits pour une ellipse donnée.

Ceci afin de ne pas avoir deux formes complémentaires dans le dessin qui ne donneraient pas la même approximation parce qu'elles n'ont pas la même longueur d'arc.

C'est comme dans la vraie vie de l'atelier. Couper une pièce de bois à la côte précise n'a pas toujours d'intérêt, mais tout couper à la même taille, oui.

Exemple dans le cas suivant :

ourea
( Modifié )

Effectivement, ça n'est pas une contrainte prise en compte.
Dans ce cas, il faut discrétiser l'ellipse entière avec un nombre de points multiple de 4, prendre la discrétisation sur l'arc donné et ajouter les points aux extrémité de l'arc.

PS. (Juste pour info) Sais-tu "détecter" les formes complémentaires ?

Boris Beaulant

Sais-tu "détecter" les formes complémentaires ?

Oui et non.
Il y a juste que dans l'exemple donné, ma détection donnera naturellement la même ellipse pour les deux arcs.

ourea
( Modifié )

OK, merci.

Donc, selon la méthode ci-dessus et avec un nombre de points multiple de 4, les points seront distribués proportionnellement au rayon de courbure le long de l'arc, sauf au début et à la fin, où il seront plus courts, et il y aura des points aux extremums.

A traiter les objets indépendamment, je pense qu'on ne peut pas faire mieux pour respecter la contrainte de complémentarité.

PS. Je vois qu'il y a un petit écart sur les extremums le cas à 36 points sur ton image ci-dessus, ce qui ne devrait pas être le cas. Il doit y avoir une imperfection quelque part...

Boris Beaulant
( Modifié )

C'est vrai que le résultat est étrangement décalé.
Voici le code à coller dans la console SketchUp pour afficher ces points :

a = 5.0
b = 3.0

def point_at_t(a, b, t)
 Geom::Point3d.new(a * Math.cos(t), b * Math.sin(t))
end

def curvature_at_t(a, b, t)
 (a * b) / Math.sqrt((a**2 * Math.sin(t)**2 + b**2 * Math.cos(t)**2)**3)
end

def point_at_dk(a, b, ts, dks, dk)
 i = dks.find_index { |v| v >= dk }
 point_at_t(a, b, ts[i])
end

ts = []
ks = []

# Compute curvatures
key_count = 1000
(0...key_count).each do |i|
 t = 2 * Math::PI * i / key_count
 ts << t
 ks << curvature_at_t(a, b, t)
end

# Integrate
dks = ks.dup
(1...dks.length).each do |i|
 dks[i] += dks[i - 1]
end
max = dks.max
dks.map! { |dk| dk / max }

# Draw points
point_count = 36
(0...point_count).each do |v|
 kn = v / pint_count.to_f
 Sketchup.active_model.entities.add_cpoint(point_at_dk(a, b, ts, dks, kn))
end
ourea
( Modifié )

Boris Beaulant C'est une histoire de discrétisation, d'intégration et d'interpolation, le diable étant dans les détails... Je pourrai te regarder ça sous quelques jours si tu veux.

Boris Beaulant

La meilleure façon d'avoir les extremums et une répartition homogène est surement d'appliquer ta proposition seulement sur 1/4 d'ellipse et de dupliquer les positions trouvées sur les 3 autres.

ourea

Boris Beaulant Effectivement, j'y pensais aussi.

Sinon, il faudrait faire attention à l'intégration, etc., ou alors essayer d'intégrer analytiquement, ce qui réglerait le problème aussi.

Mais la solution 1 est la plus simple.

Boris Beaulant
( Modifié )

Voici un bout de code qui peut être copier coller dans la console de SketchUp.

Il permet de dessiner les points répartis suivant la courbure sur un quart d'ellipse en fonction des paramètres qu'on lui donne au début.

Je pense qu'ensuite on pourrait utiliser la méthode des 3 points proposée par Kentaro pour former les arc en calculant un point milieu à chaque arc.

def point_at_t(xradius, yradius, t)
 Geom::Point3d.new(xradius * Math.cos(t), yradius * Math.sin(t))
end

def point_at_dk(xradius, yradius, ts, dks, dk)
 point_at_t(xradius, yradius, ts[dks.find_index { |v| v >= dk }])
end

def curvature_at_t(xradius, yradius, t)
 (xradius * yradius) / Math.sqrt((xradius**2 * Math.sin(t)**2 + yradius**2 * Math.cos(t)**2)**3)
end

xradius = 5.0
yradius = 3.0
key_count = 100
arc_count = 8

prompts = [ "xradius", "yradius", "key_count", "arc_count" ]
defaults = [ xradius, yradius, key_count, arc_count ]
xradius, yradius, key_count, arc_count = UI.inputbox(prompts, defaults, "Settings")

ts = []
ks = []
ps = []

# Compute curvature at key points
(0..key_count).each do |i|
 t = Math::PI / 2 * i / key_count
 ts << t
 ks << curvature_at_t(xradius, yradius, t)
end

# Integrate
dks = ks.dup
(1...dks.length).each { |i| dks[i] += dks[i - 1] }
max = dks.max
dks.map! { |dk| dk / max }

# Clear model
Sketchup.active_model.entities.clear!

# Draw points
(0..arc_count).each do |v|
 p = point_at_dk(xradius, yradius, ts, dks, v / arc_count.to_f)
 ps << p
 Sketchup.active_model.entities.add_cpoint(p)
end

SKETCHUP_CONSOLE.clear
puts "-----"
puts "xradius = #{xradius}"
puts "yradius = #{yradius}"
puts "key_count = #{key_count}"
puts "arc_count = #{arc_count}"
puts "-----"
i = 1
ps.each_cons(2) do |p1, p2|
 puts "arc #{i} => start = (#{p1.x.to_f.round(1)}, #{p1.y.to_f.round(1)}) end = (#{p2.x.to_f.round(1)}, #{p2.y.to_f.round(1)})"
 i += 1
end
ourea
( Modifié )

Oui, ensuite il y a le choix pour la construction des arcs de cercle, et la méthode à 3 points semble appropriée. Il est certainement suboptimal de choisir le point central, car cela ne minimise pas forcément l'écart entre l'arc d'ellipse et l'arc de cercle, mais je ne sais pas s'il est facilement envisageable de faire mieux, et on serait vraiment dans le raffinement du raffinement...

David Marmilloud
( Modifié )

Bonjour,
Je me permet un commentaire, non pas sur la méthode (je suis dépassé), mais sur la fonctionnalité.

Il me semble très important que les arcs de cercles soient tangents entre eux, au risque de voir apparaitre des bourrelets ou des ondulations. (les amateurs de CAO auront en tête le zébrage discontinu des surfaces)

Autrement dit, que le point de connexion entre deux arcs soit alignés avec les centre des ces mêmes arcs.

J'ai testé avec le solveur de Fusion360 et l'approche ne surcontraint pas la géométrie (les points de connexion sont coïncidents avec l’ellipse)

Sans trop d'assurance, à partir du moment ou vous savez déterminer la position de ces points en fonction de l'équation de l’ellipse, il doit être jouable de déterminer l'équation de la droite passant par le point en question et les deux centres afin de déterminer l'arc suivant. C'est de l’itératif et non de l'analytique me direz vous 😅

Attention toutefois : les positions angulaires des points sur l'ellipse sont interdépendantes. Autrement dit, on ne peut pas compter sur la courbure pour déterminer la position de tous les points. Il faudrait le vérifier mathématiquement, mais avec le solveur graphique je peux fixer la position de tous les points sauf 1, peu importe lequel.

ourea
( Modifié )

Il me semble très important que les arcs de cercles soient tangents entre eux, au risque de voir apparaitre des bourrelets ou des ondulations. (les amateurs de CAO auront en tête le zébrage discontinu des surfaces)
Autrement dit, que le point de connexion entre deux arcs soit alignés avec les centre des ces mêmes arcs.

Je pense que c'était la suggestion de benjams et que ça n'est pas possible... Voir la discussion ici.

Sur ton dessin, les deux extrémités d'un arc (qui sont contraints d'appartenir à l'ellipse) sont probablement à une distance différente du "centre".

David Marmilloud
( Modifié )

En effet, je n'avais pas lu en détail, mais c'est exactement ce que décrit benjams.
Cependant, en manipulant le solveur graphique, je n'arrive pas à vos conclusions.

En effet, on est coincé si on détermine toutes les positions des points à l'avance. Il faut en laisse une de libre (mais néanmoins positionné sur l’ellipse) pour donner le degré de liberté nécessaire à la résolution.

Je vais essayer de l'expliquer avec mes mots:

Partons du quadrant nord et traçons un arc en direction de l'est avec un point d'arrivée sur l'éllipse. Le centre de cet arc est sur l'axe des ordonnées (l'arc serait donc tangent à son symétrique vertical).
Traçons le rayon entre le centre et ce point d'arrivée.
Tarçons un nouvel arc dont le centre si situe sur ce rayon, le point de départ coïncide avec le point d'arrivée d' l'arc précédent. Rien n’empêche ce rayon d'intersecter l'ellipse. Nous pouvons donc trouver un point d'arrivée sur l'ellipse.

On peut continuer ainsi, mais on ne pourra par rejoindre l'axe des abscisses car dans ma démarche le point d'arrivée de l'arc est un résultat et non un paramètre.

Du coup, pour terminer ma figure, je suis parti depuis le quadrant est. J'ai tracé un arc dont le centre est positionné sur l'axe des abscisses (l'arc est donc tangent à son symétrique horizontal) et le point d'arrivée est sur l'ellipse.

Il suffit ensuite de créer un arc de raccordement dont le centre est situé à intersection du dernier rayon venant du nord et de celui venant de l'est. (triangle jaune).

Ce n'est pas très mathématique comme explication, mais je suis confiant que le fait que ça puisse se mettre en équation.

David Marmilloud
( Modifié )

En fait, la difficulté à la fin c'est d'écrire l'équation du point de rencontre de deux cercles dont on connait :

  • Les coordonnées d'un point de "départ",
  • L'équation de la droite sur laquelle est situé le centre.
  • L'équation de l'ellipse sur lequel est situé le point d'arrivée.

Une autre manière de le résoudre, c'est dire que le point d'intersection entre le dernier rayon (celui qui est flottant) et le rayon de fin d'ellipse est équidistant du point de fin d'ellipse et du point de fin de l'arc précédent.

Bon je vais faire des copeaux maintenant :)

ourea
( Modifié )

David Marmilloud Sur ton schéma, le premier arc est tangent à l'ellipse à l'intersection avec l'axe des abscisses (par construction), mais (étant donné les discussions précédentes) je pense qu'il ne l'est pas en son autre extrémité : on peut choisir le rayon du cercle pour intersecter l'ellipse où on veut, mais l'ellipse et le cercle ne sont pas tangents en cette intersection.

Dès lors, ça ne fonctionne plus...

Boris Beaulant
( Modifié )

David Marmilloud j'ai peut-être mal compris la base du raisonnement, mais comment ces deux premiers rayons peuvent-ils être égaux si les deux extrémités de l'arc sont sur l'ellipse ?

ourea
( Modifié )

Boris Beaulant Ca, c'est possible (voir ci-dessous). Le problème est que tout se superpose sur l'image de David Marmilloud.

David Marmilloud On voir bien sur l'image ci-dessous que la tangente n'est pas la même au second point d'intersection (pour illustrer mon propos ci-dessus). Si le rayon du cercle est tel que le cercle est intérieur à l'ellipse, il n'y a pas de seconde intersection, mais dès lors que le cercle est (en partie) extérieur, il n'intersecte pas l'ellipse avec la même tangente...

David Marmilloud
( Modifié )

En effet, le cercle n'est pas tangent à l'ellipse. Il est tangent à l'arc suivant.
Ca me semble plus important pour la continuité des surface (au detriment de la précision peut etre)

Au passage, merci pour ton graphique qui est très clair.

Boris Beaulant

David Marmilloud mais la il est question d’export 2D. Si des surfacés doivent être exploitées il y au ra l’export 3D.

David Marmilloud
( Modifié )

C'est vrai que j'avais les problèmes surfaciques en tête, mais il le semble que le souci reste entier en 2D. Si l'export est destiné à un usinage CN par exemple, les discontinuités ont tendance à se voir. Tout particulièrement si la pièce a une finition brillante.

David Marmilloud

Sur ce, je pense avoir passablement monopolisé l'attention et je suis sûr que vous avez compris mon avis... Et ce n'est qu'un avis.
Je suis certain que vous ferez pour le mieux.
Bonne suite sur ce sujet et bonne soirée pour l'immédiat.

francoisB30

je suis d'accord avec David Marmilloud c'est le résulta que je constat sur la deuxième photo que j'ai publié

Kentaro
( Modifié )

David Marmilloud Rappelons que l'idée de Boris Beaulant c'est de pouvoir exporter des fichiers Sketchup en dxf et de résoudre le problème des courbes segmentées de Sketchup pour avoir quelque chose de "mieux".
En approximant par une série d'arcs de cercles, certes, on va avoir des "bosses".
Une piste avait été évoquée pour trouver des arcs de cercles dont les extrémités sont tangentes entre elles, mais il semblerait que cela ne marche pas.

Ceci étant dit, le projet, c'est pour permettre aux gens qui utilisent Sketchup de passer en dxf. Pas de faire des trucs à l'état de surface parfait. Les professionnels qui veulent un truc parfait n'utilisent pas Sketchup, mais 50 autres logiciels bien plus sophistiqués qui dès l'origine ne segmentent pas les courbes, et fournissent le passage automatique en dxf.

Le mieux n'est pas parfait, mais c'est déjà un grand mieux.

David Marmilloud

Kentaro c'est vrai. Et comme dans tous les domaines, c'est la simplicité qui fonctionne (et qui est souvent difficile à atteindre).
Je ne sais pas ce qui est le plus simple ici. Aux codeurs de le déterminer.

Boris Beaulant

Je sais même pas si c'est vraiment une question de simplicité, mais plus d'objectif.
En effet, j'ai l'impression que si toutes les portions d'arc de cercle sont tangentes 2 à deux, on s'éloigne plus de la forme de l'ellipse que si on ne l'est pas.

Le choix est donc : forme ou continuité. Et en même temps avec plus de points, ça répond forcément mieux aux critères ... mais s'éloigne d'une "simplicité" pour l'exploitation du résultat.

Et je rejoins Kentaro que de base SketchUp est merdique sur cette notion de continuité. C'est donc de toutes façons pas pire que la donnée source.

Jean-Claude Di Fazio
( Modifié )

Boris Beaulant

En effet, j'ai l'impression que si toutes les portions d'arc de cercle sont tangentes 2 à deux, on s'éloigne plus de la forme de l'ellipse que si on ne l'est pas.

Ce type de construction ne peut donner qu’un cercle ou une spirale. Mais certainement pas une ellipse.

ourea

Jean-Claude Di Fazio Oui, idée à abandonner ici je pense...

Boris Beaulant

Jean-Claude Di Fazio Ce type de construction ne peut donner qu’un cercle ou une spirale.

Je suis pas d'accord avec ça. L'approximation en 3 cercles montre le contraire.
Il est certain que ce n'est forcément pas un ellipse, puisque c'est une approximation 😉

Boris Beaulant
( Modifié )

J'ai poussé l'essai commencé ici pour que ça recherche les arc de cercles avec le point central de la portion et la méthode à 3 points.

Il en sort ceci. On voit que lorsque l'ellipse s'aplatit, on s'éloigne de plus en plus du fait que les portions d'arc de cercle soient tangentes les unes aux autres.

Et des NaN apparaissent dans la recherche des centres d'arc parce que les 3 points sont quasiment alignés ...

ourea
( Modifié )

Je ne comprends pas tout à la représentation graphique, mais lorsque l'ellipse est très aplatie, le centre du cercle approchant part à l'infini, d'où les NaN. Ca doit se voir dans les équations (avec un dénominateur qui s'annule, probablement ?).

Peut-être faudrait-il un test quelque part pour approximer par un segment de droite plutôt qu'un cercle dans ce cas-là ? (même avec une autre définition d'arc de cercle, le problème restera sûrement le même...)

A partir du rapport entre la longueur de l'arc et le rayon de courbure, tu peux choisir entre un segment de droite et un arc de cercle.

Boris Beaulant
( Modifié )

Je ne comprends pas tout à la représentation graphique

Ce qui se dessine c'est les points début et fin de chaque arc et un trait pointillé qui les relie au centre de chaque arc.

J'ai voulu reproduire ce que David Marmilloud montre dans son dessin avec les rayons coïncidents.

d'où les NaN

Les NaN sont surtout au début (t = 0) où les arcs sont très courts et donc les points début, milieu et fin des arcs trop proche pour ne pas être vu comme alignés dans la précision possible.

Oui dans ce cas nul autre choix que de remplacer par un segment ou de retirer le point étape.

le centre du cercle approchant part à l'infini

Oui, il y aura aussi ce cas à l'autre bout.

Jean-Claude Di Fazio
( Modifié )

Désolé si je calme vos ardeurs mais à ce stade de vos réflexions et essais, quel est l’intérêt d’utiliser des arcs de cercle par rapport à une suite de segments ?
Dit autrement par rapport à votre contexte : est-ce que cela va réellement plus loin qu’une polyline ?

Si j’ai bien suivi, les segments présentaient des discontinuités gênantes, notamment du fait des arrondis. Les arcs aussi visiblement. Il faut en calculer un certain nombre pour diminuer l’ondulation générée.
==> ne suffit-il pas de calculer un certain nombre de segments ?

Le seul problème à résoudre (dans les deux méthodes d’ailleurs) serait de trouver « le certain nombre ».

ourea

L'intérêt est d'avoir un nombre d'objets limités. Il faudrait avoir un nombre de segments supérieur d'un facteur 10 ou 100 au nombre d'arcs de cercle pour atteindre le même niveau d'approximation (en terme de distance à l'ellipse), et la courbure des arcs de cercle est intéressante à avoir...

Boris Beaulant

Jean-Claude Di Fazio les arcs de cercles, même s'ils ne sont pas parfaitement tangents les uns aux autres offrent une bien meilleure continuité que la suite de segments. Même imparfait, c'est forcément une courbe plus douce et c'est ça qui est désiré.

Si on veut des segments, il n'y a rien à calculer, parce que ici c'est la donnée source qui est comme ça dans SketchUp.

Connectez-vous pour ajouter un commentaire.
1
MatthieuP

Je n'ai pas une réponse directe mais le problème est super intéressant. A brûle pourpoint je pense à la façon dont fonctionne un ellipsographe et je me dis qu'on doit pouvoir s'en inspirer. Car tel que je le vois à chaque instant il décrit justement un arc de cercle dont le centre varie... bref il faudrait transformer cette intuition en équation.

tazzon
Je suis d'accord

Même pensée en lisant l'énnoncé

Connectez-vous pour ajouter un commentaire.
0
ADPB
( Modifié )

Voilà un problème interessant ! Ce qui est certain c'est qu'on ne trouvera pas ici une unique bonne réponse puisque tout est affaire de compromis entre le suivi parfais de l'élipse et la simplificiation de sa description en arcs.

Je manque un peu de temps pour suivre jusqu'au bous chacun des raisonnements mathématiques qui ont déjà été décris dans les précédents commentaires. C'est d'ailleurs toujours en plaisir de constater à quel point la communauté de l'Air du Bois est impliqué dans la résolution de sujets aussi variés que complexes.

De mon coté, je ne prétend pas apporter grand chose sur la description en équation du problème, surtout par manque de temps. Mais j'ai une intuition à la lecture de "l'énoncé" du Professeur Beaulant :

Pourquoi ne pas revenir au principe d'une anse de panier ?

Intuitivement j'ai toujours vu ce principe comme étant une méthode pour construire un "ovale" à partir d'arcs de cercle simples.
Alors c'est sur qu'un arc à 3 anses sera un peu approximatif, au risque de dénaturer la forme de l'éclipse initiale :

Mais qu'est ce qui empêcherait alors de voir le nombre de cercles de l'anse de panier comme un paramètre ? (un peu comme on choisi le nombre de segment lors du dessin d'un cercle dans sketchup)

Dans ce cas, en réglant le nombre de cercle à 5, 7 (...voir en peu plus ?), on tenderait de plus en plus vers l'élipse parfaite non ?

Dans cette hypothèse, en plus de garder un principe de description d'élipse plutôt simple et compréhensible, on garderait ainsi toujours les points essentiels de l'ellipse initiale comme intersections entre nos arcs.

Enfin voilà mon point de vue intuitif, malgré que je n'ai pas le temps d'aller au bout d'une vraie démonstration. J'espère que cela peux ajouter un peu d'eau au moulin 😃

Pierre

PS : quelques infos sur les anses de panier 1
quelques infos sur les anses de panier 2

PPS : Pas tout à fait la même technique mais si ça peux aider

Mis à jour
Jean-Claude Di Fazio

Et encore :

Boris Beaulant
( Modifié )

Merci ADPB !

Pas facile de faire un choix quand la solution ultime n’existe pas :)

Connectez-vous pour ajouter un commentaire.
0
o314
( Modifié )

A voir

axes de recherche :

en ouvrant le pb

  • spline fitting / cubic spline fitting
  • polygonalization / curvature estimation

PS: ~pas reussi a indenter les listes. dsl~ corrigé

Mis à jour
o314
Boris Beaulant

Merci o314.

Il semble y avoir des choses à creuser, mais c'est le genre de lecture que j'ai du mal à comprendre :(.

pas reussi a indenter les listes. dsl

Il faut changer de puce -, puis +

o314

Le temps passé sur les maths peut effectivement etre raidasse suivant le parcours.
Et les matheux ont generalement pas fait gestion de projet pour depanner en cours du soir

De la chance, enormement de ces algos sont implementes la :
github.com/All...t/circle_fit.py
quali a verifier

A voir niveau code + tuto

J'aime bien l'option tres simple de
stackoverflow....251997#27251997

Connectez-vous pour ajouter un commentaire.
0
benjams

Salut,

Il y a peut-être quelque chose a faire du côté de la courbe développée (lieu des centres de courbures, ou enveloppe des normales, ce qui est pareil)

Si tu veux une belle courbe (continue a dérivée continue, ie avec des cercles qui se raccordent sans angles) il faut diviser L'ellipse en tronçons Pour chaque extrémité d'un tronçon tu calcules les normales, le centre du cercle approché est l'intersection des normales. Une methode par 3 pts sur la courbe risque de te donner des "angles" même si tu n'avances que d'un point a la fois

Il y a une équation générale assez simple de la développée d'une ellipse quelconque en fonction de ses petits et grands axes ( serge.mehl.fre...x/developp.html ). J'ai pas creusé plus les formules mais si les "t" de l'équation sont les mêmes, on calcule très facilement autant de portions de cercles qu'on veut.

Si tu prends un pas assez important il faut peut-être avoir recours a des techniques détournés types faire la moyenne entre les deux centres de courbures.

ourea
( Modifié )

Mais est-il possible d'obtenir une discrétisation à dérivée continue approximant une ellipse par des arcs de cercle ?

Deux cercles approchant voisins vont forcément s'intersecter en un point où la dérivée est non continue, non ?

Est-ce que je rate quelque chose ?

Sinon, c'est intéressant.

benjams

Tu as raison si on approxime la courbe par des cercles, la courbure ne peux pas être continue.

Seulement la coubure est une notion venant de la dérivée seconde.

On peut tracer une courbe continue (les points se raccordent) a dérivée continue (les tangeantes se raccordent) si on approxime par des cercles. Évidemment avec derivé seconde continue (rayon de courbure continu) ça n'est pas possible vu que deux cercles de diamètre différents ont une coubure différente.

Si la courbe est visuellement plaisante quand les tangentes sont continues, ça peut quand même causer des abberations au niveau des reflexions notamment (reflet d'une chose sur l'objet qui a une "cassure" au niveau des raccords de cercles)

Kentaro
( Modifié )

benjams Boris Beaulant J'aime bien cette idée du cercle défini par l'intersection des normales aux extrémités d'un tronçon, puisque de ce fait, les tangentes seront les mêmes au niveau du raccordement des tronçons, donc, ce sera "lisse".

Mais j'ai essayé de dessiner le truc. Je me suis peut-être planté, en faisant cela très vite, mais a priori, le cercle passant par l'intersection des normales ne passe pas par les deux extrémités du tronçon (ce qui est assez normal, puisque c'est une ellipse). Donc, on fait comment pour le prochain tronçon ?

ourea
( Modifié )

benjams Merci pour le complément. Ca m'a l'air élégant.

Une chose qui me trouble : si je considère les 4 points d'intersection de l'ellipse avec ses axes et que j'essaie d'appliquer cela, ça ne marche pas : les normales se croisent au centre, et il n'existe pas de cercle ayant ce centre et passant par les points d'intersection (étant donné qu'ils ne sont pas à la même distance du centre).
Je pense qu'il en est de même pour toute paire arbitraire de points sur l'ellipse (notamment, des points plus proches, comme dans l'application concernée).

Du coup, comment on traite ça ? On approxime ? Ne perd-t-on pas alors la continuité de la dérivée première ?

Kentaro
( Modifié )

ourea benjams Oui, je trouve le même problème pour un tronçon, comme dit plus haut, j'ai essayé avec un dessin. Le cercle de centre défini par l'intersection des normales et passant par une extrémité du tronçon, dévie pas mal à l'autre extrémité.

benjams

Effectivement tu as raison Kentaro ça ne marche pas bien. Je pense qu'il faut une astuce par exemple prendre le rayon moyen des deux cercles. De toute façon quand la courbure varie beaucoup, on ne peux juste pas approximer par des cercles. (En y réfléchissant ca me semble impossible si on conserve les tangentes à la courbe, soit on se donne de la liberté sur la position des intersections, soit on se donne de la liberté sur la tangente)

Bref ce que je voulais dire c'est que pour que deux cercles se raccorde de manière harmonieuse en un point M (tangentes continues), il faut que le centre du second cercle soit sur la droite reliant le point M et le centre du premier cercle.

En connaissant le dernier cercle on a plus que deux degrés de libertés scalaires sur les dimensions de l'arc : son rayon et son angle, donc on ne peut régler que deux paramètres, soit la position du point suivant (x,y) soit la direction de la tangente.

J'ai l'intuition que effectivement cette méthode ne peux pas marcher tu auras toujours un raccord qui n'est pas tangent quand on referme la courbe puisque qu'on ne maitrise pas la tangente en ce point

Kentaro

benjams C'est dommage, car ce serait élégant...

benjams

Kentaro en fait pour que ça marche il faudrait approximer par des troncons de coniques (ax²+by²+cx+dy+exy=f), comme ça on pourrait approximer notre ellipse par une ellipse 🙃

Kentaro

benjams Ché pas con...

Boris Beaulant

Merci benjams.

Par contre, j'ai du mal à voir comment ça rendra les portions d'arc plus lisses les unes par rapport aux autres 🤔

Connectez-vous pour ajouter un commentaire.
0
Eric78
( Modifié )

En cherchant un peu, j'ai retrouvé le moyen de connaitre le cercle tangent en un point d'une ellipse.
Les Ref sont les suivantes :
Ref 1
Ref 2
On peut ensuite recalculer le centre du cercle tangent avec le calcul suivant. J'ai juste vérifier le cas trivial d'un cercle, mais il serait intéressant de le tester graphiquement.

Après, la stratégie pourrait être de

  • Calculer en coordonnées polaires les points des extrémités E1 et E2 (ie. calcul des t1 et t2 dans l'équation ci-dessus).
  • définir un nombre d'arcs à tracer
  • itérer sur le nombre d'arcs
  • calculer les tn, tn+1 (ie. chaque P1 et P2)
  • calculer le point sur l'ellipse avec l'angle (tn + tn+1)/2 - (ie. point entre P1 et P2)
  • retrouver le centre du cercle tangent en ce point milieu avec les formules ci-dessus

On devrait alors avoir les points P1, P2 et le centre pour chaque arc.

Autre stratégie, peut-être plus fine graphiquement: on itère sur les rayons de courbure (attention, il y aura peut-être un extremum à passer), on recalcule l'angle polaire correspondant et on en déduit les points intermédiaires correspondant à ce rayon.

Mis à jour
Boris Beaulant

Merci Eric78 !

Connectez-vous pour ajouter un commentaire.
0
etiennedm
( Modifié )

En lisant ceci en diagonale, ça ressemble pas mal à ce que vous cherchez à faire. En plus le pseudo-code est fourni, ça ne devrait pas être bien dur à tester rapidement (modulo les transformations de repère à faire, toujours facile de s’y emmêler les pinceaux) !

Mis à jour
Boris Beaulant

Merci etiennedm.

Oui et la publication est même plus fournie ici.

Reste qu'il ne travail que sur des quart d'ellipse et donc d'extrémum à extremum. La solution n'est pas clé en main pour l'adaptée à un arc. Mais ça reste en effet une autre stratégie intéressante. Même si la dernière page ne montre pas un résultat si parfait, même à 8 points :)

Connectez-vous pour ajouter un commentaire.
0
francoisB30
( Modifié )

si cela peu vous aidai voici la photo d'une élipse tel qu'elle est générée en polylignes transformable en DXF par mon logiciel machine Masterwork
elle a un rayon horizontal de 300 et 200 en vertical
la sorte de d'aile d'oiseau en dessous représente les différents centre des différents arcs de cercles
les segments de camembert sont respectivement à 12.38 °22.5° 31.99° 45° 59.96° 90°

si cela peut aidai je peu le transmettre en DXF ou PDF

j'ai ajouté cette photo car je n'arrive pas à suivre tout vos résonnements(je n'ai qu'un niveau de 3°) mais j'ai l'impression que que vous vous posez la question de la répartition des secteurs et donc là vous avez 2 cas de figure à droite un découpage sur une élipse plus ronde découpé en 6 secteurs à gauche une élipse plus plate découpée en 8 secteurs toujours avec Masterwork

Mis à jour
Boris Beaulant
( Modifié )

Merci francoisB30,

J'ai aussi regardé du côté de QCAD Pro qui offre le découpage suivant.
Mais cette fonction n'est pas dans la version Open Source.

Connectez-vous pour ajouter un commentaire.
0
Iskandar

my 2cts, je ferai un algo en deux temps pour générer les coordonnées avec l'équation de l'ellipse, puis appliquer un algo du type Douglas-Peucker pour réduire le nombre de points ca marche super bien

Boris Beaulant

Merci Iskandar, mais ça va donner une liste de points tout ça, non ?

Iskandar

Ta problématique me semble très proche de ce pour quoi j'ai utilisé Douglas Peucker, à savoir des fichiers GPX (fichier pour gps) et on parle aussi de polyline and co. Mais je vais relire à tête reposée tout à l'heure ta description j'ai peut être raté des éléments :)

Boris Beaulant
( Modifié )

J'ai déjà transformé une liste de points en un "chemin continu" = un liste de segments et/ou arcs de cercles/ellipse. Tous les points sont sur le chemin. A ce niveau aucun approximation.

Ce chemin peut être utilisé tel quel dans un fichier SVG. Mais le DXF ne supporte pas les arcs d'ellipse. Je cherche donc à convertir un arc d'ellipse en une série d'arcs de cercle.

Eric78
( Modifié )

Boris Beaulant, sauf erreur de ma part dans la doc que tu cites, on peut faire des arcs d'ellipse (paramètres 41 et 42). Mais je n'ai personnellement jamais créé de fichier DXF, je peux donc me tromper.

Boris Beaulant
( Modifié )

Eric78 oui, avec cette entité, on peut dessiner des ellipses et arcs d'ellipse. Mais c'est une entité flottante qui n'est connecté à rien à part que ses extrémités peuvent être plus ou moins au même endroit qu'une autres entités.

Le hic, c'est que ce qu'on donne pour définir cet arc c'est un centre, un rapport de rayons et deux angles. Il n'est jamais donné de point de départ ou arrivé. Et au fil des arrondis nécessaires parce que rien n'est précis à 1e-8 dans SketchUp, on en arrive à ça quand on zoom :

Jean-Claude Di Fazio

Boris Beaulant , si le plus important est de conserver une série d’arcs jointifs, tu n’as pas d’autre choix dans la « méthode des 3 points » que de choisir les deux extrémités sur l’ellipse.
Nécessairement, le 3ème point ne pourra pas s’y trouver.
C’est là qu’il faut choisir le taux d’erreur acceptable pour se donner ce 3ème point. Non pas en distance absolue comme 0,1 mm mais peut-être en % d’une dimension donnée représentant le caractère elliptique de ton ellipse. En effet, plus ton ellipse est circulaire, moins d’arcs seront nécessaires.
Le caractère elliptique s’apprécie par le ratio grand axe/petit axe. Si égal à 1, ton ellipse est un cercle exact. Si tendant vers l’infini, ton ellipse est allongée au point de ressembler à un segment de droite.
D’ailleurs ce ratio peut être utilisé pour choisir les points : plus il est grand, plus les points choisis doivent être nombreux. (Dans la limite du raisonnable car non seulement ce serait long à calculer mais faux aux limites : une ellipse plate s’approxime par un seul arc de cercle de rayon infini).

Connectez-vous pour ajouter un commentaire.
1 228 vues
11 réponses

Publications associées

0 collection

Licence

Licence Creative Commons
Voir aussi
par MDFM62 1 réponse
par gabriel  1 réponse
Navigation