(gile) Posté(e) le 26 mars 2021 Posté(e) le 26 mars 2021 Salut, Je vais essayer de lancer un petit challenge de géométrie. Dans AutoCAD, pour dessiner un arc elliptique, on peut spécifier les angles de départ et de fin, mais il existe aussi une option 'Paramètres'. Extrait de l'aide : Quote Paramètre (option spécialisée) Nécessite une saisie angulaire, mais crée l'arc elliptique à l'aide de l'équation vectorielle paramétrique suivante pour l'angle de chaque extrémité : p(angle) = c + a * cos(angle) + b * sin(angle) où c représente le centre de l'ellipse, tandis que les lettres a et b représentent les longueurs négatives du grand axe et du petit axe, respectivement. Développer En programmation d'AutoCAD, on retrouve cette notion de paramètre pour tous les objets curviligne (vlax-curve-getParamAtPoint en LISP ou Curve.GetParamAtPoint avec.NET). On a coutume de dire qu'un petit dessin vaut mieux qu'un long discours : Le challenge, donc, serait de définir deux fonctions (peu importe le langage) : - AngleToParam : qui prend comme arguments une ellipse et un angle et qui renvoie le paramètre correspondant - ParamToAngle : qui prend comme arguments une ellipse et un paramètre et qui renvoie l'angle correspondant Exemples avec une ellipse de 10 100 unités de grand axe pour 60 unités de petit axe : - AngleToParam d'un angle de 30° doit retourner un paramètre de 43.90° - ParamToAngle d'un paramètre de 30° doit retourner un angle de 19.11° - AngleToParam d'un angle de 230° doit retourner un paramètre de 243.28° - ParamToAngle d'un paramètre de 230° doit retourner un angle de 215.57° Les exemples sont donnés en degrés, mais pour plus de simplicité et de cohérence avec les fonction natives fonctions utiliseront les radians. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 26 mars 2021 Posté(e) le 26 mars 2021 Bonjour Gilles J'ai bien envie de m'y coller mais je ne comprends pas ce qu'on doit livrer On connaît une ellipse (ou un arc elliptique) qu'on peut sélectionner à l'écran par exemple On donne en entrée utilisateur une valeur d'angle et on livre un Paramètre ou l'inverse C'est bien comme ça ou bien faut-il partir d'autre chose ? Ce n'est pas la première fois que je ne réponds pas à un challenge parce que je ne comprends pas ce qui est attendu Pardon pour mon "hermétisme" mais j'aimerais bien participer D'ailleurs, il faudrait donner une date butoir à laquelle tu déposeras ta solution, non ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 26 mars 2021 Auteur Posté(e) le 26 mars 2021 Non, l'idée de ces challenges est plutôt de juste fournir une fonction qui fait seulement les calculs pour répondre au problème posé. Ici, en LISP par exemple, ça serait une fonction 'paramToAngle' qui prend en arguments le ename (ou vla-object) d'un ellipse et un nombre représentant le paramètre de l'ellipse pour lequel on cherche l'angle et qui renvoie l'angle correspondant à ce paramètre : (defun paramToAngle (ellipse, param) ...) Pour tester, outre les exemples que j'ai donné, on peut utiliser la fonction dans une commande de test : (defun c:test (/ ellipse startParam endParam startAngle endAngle) (setq ellipse (car (entsel "\nSélectionnez un arc elliptique: "))) (setq dxf (entget ellipse)) (setq startParam (cdr (assoc 41 dxf))) ; paramètre de départ (setq startAngle (paramToAngle ellipse startParam)) ; appel de la fonction paramToAngle (setq endParam (cdr (assoc 42 dxf))) ; paramètre de fin (setq endAngle (paramToAngle ellipse endParam)) ; appel de la fonction paramToAngle (prompt (strcat "\nAngle de départ : " (angtos startAngle) "\tAngle de fin : " (angtos endAngle) ) ) (princ) ) Idem pour la fonction inverse : angleToParam. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 26 mars 2021 Auteur Posté(e) le 26 mars 2021 Ou encore, en partant d'un problème pratique. Je veux créer un arc elliptique entre 30° (pi/6rd) et 300° (10*pi/6rd) et je veux le faire avec entmake. Or la liste de données DXF à passer à entmake utilise les paramètres de l'ellipse (codes de groupe 41 et 42). J'ai donc besoin d'une fonction (angleToParam) pour convertir ces angles en paramètres. C'est cette fonction qu'il s'agit de définir. Inversement, je veux connaitre les angles de départ et de fin d'un arc elliptique d'après ses données DXF (obtenues avec entget) qui contiennent, entre autres, les paramètres (groupes 41 et 42). J'ai donc besoin d'une fonction (paramToAngle) pour convertir ces paramètres en angles. C'est cette fonction qu'il s'agit de définir. Il s'agit avant tout d'un problème de géométrie qu'on implémente ensuite dans un langage de programmation. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 26 mars 2021 Posté(e) le 26 mars 2021 Bonjour, mais (vlax-get sel 'startParameter) et (vlax-get sel 'endParameter) ne conviennent pas??? https://github.com/Fraiddd
(gile) Posté(e) le 26 mars 2021 Auteur Posté(e) le 26 mars 2021 @Fraid Ça ne serait pas un challenge. Il ne s'agit pas forcément des paramètres ou angle de départ ou de fin, mais de convertir en angle n'importe quel paramètre de l'ellipse ou inversement. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 Quote Ça ne serait pas un challenge. Développer Je suis d'accord, je part donc sur cette forme (AngleToParam angle) et (ParamToAngle param) car si on a une ellipse de sélectionné, c'est trop facile. ou je ne comprend toujours pas. https://github.com/Fraiddd
Fraid Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 par contre j'arrive sur une équation à 2 inconnues donc 3 reponses possibles avec seulement l'angle. car b peut être supérieur à a et égal (cercle) ... https://github.com/Fraiddd
(gile) Posté(e) le 27 mars 2021 Auteur Posté(e) le 27 mars 2021 Le 27/03/2021 à 18:41, Fraid a dit : Je suis d'accord, je part donc sur cette forme (AngleToParam angle) et (ParamToAngle param) car si on a une ellipse de sélectionné, c'est trop facile. ou je ne comprend toujours pas. Développer Le rapport entre "angle" et "paramètre" est lié aux données de l'ellipse, notamment les grand et petit rayons ou le ratio entre ces rayons (RadiusRatio ou groupe DXF 40), c'est pour ça que la forme est bien : (AngleToParam ellipse angle) et (ParamToAngle ellipse param). Pour tout point p d'une ellipse de centre c, de grand rayon a et de petit rayon b : - on appelle "angle" l'angle entre le grand axe et le segment de c à p - on appelle "paramètre" la valeur angulaire qui permet de définir les coordonnées du point p à l'aide de l'équation vectorielle paramétrique suivante p(param) = c + a * cos(param) + b * sin(param) autrement dit : p est égal à c plus le vecteur de coordonnées X = a * cos(param), Y = b * sin(param) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 Quote de centre c Développer je ne comprend pas la valeur de C si l'ellipse est au point zéro, c'est zéro ?? https://github.com/Fraiddd
(gile) Posté(e) le 27 mars 2021 Auteur Posté(e) le 27 mars 2021 c est le centre de l'ellipse. On peut voir aussi le paragraphe Image d'un cercle par une affinité sur la page Ellipse (Mathématique de wikipédia). Dans la dernière phrase du chapitre le terme "anomalie excentrique" correspond au "paramètre" de l'ellipse. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 que c'est le centre, sa c'est bon mais si ce n'est pas excentré c'est égal à zéro dans l’équation que tu donne https://github.com/Fraiddd
Fraid Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 je vient de retourner sur wiki, c tous seul n'as pas de valeur ... ce sont les vecteurs qui passent par c je bloque sur cette valeur pour comprendre l'équation que tu donne par contre c'est peut être la distance du centre au foyer ? comme il est dit dans le chapitre Relations entre les grandeurs de la même page wiki https://github.com/Fraiddd
(gile) Posté(e) le 27 mars 2021 Auteur Posté(e) le 27 mars 2021 Dans l'équation paramètrique telle que donnée dans l'aide d'AutoCAD : p(param) = c + a * cos(param) + b * sin(param) p est le point de l'ellipse correspondant au "paramètre" param c est le centre de l'ellipse a est le vecteur de c à l'extrémité du grand axe b est le vecteur de c à l'extrémité du petit axe L'angle au point p est l'angle entre le vecteur a et le vecteur cp. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Olivier Eckmann Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 Salut Gilles, Je te propose ça (sans aucun contrôle) (defun paramToAngle (ellipse param / dA dB X Y ) (setq dA (distance '(0 0 0) (cdr (assoc 11 (entget ellipse))))) (setq dB (* dA (cdr (assoc 40 (entget ellipse))))) (setq X (* dA (cos param))) (setq Y (* dB (sin param))) (atan Y X) ) Par contre je n'arrive pas dans AutoCAD à créer une ellipse avec un grand axe plus petit que le petit axe. Dans ton exemple, avec une ellipse 60 grand rayon et 10 petit rayon, il faut un paramètre de 64.3° pour obtenir un angle de 19.1° Olivier
(gile) Posté(e) le 27 mars 2021 Auteur Posté(e) le 27 mars 2021 Bravo @Olivier Eckmann ! Le code fonctionne. Il pourrait juste être simplifié. Reste la fonction inverse (mais maintenant, c'est plus facile). Le 27/03/2021 à 21:14, Olivier Eckmann a dit : Par contre je n'arrive pas dans AutoCAD à créer une ellipse avec un grand axe plus petit que le petit axe. Développer Oui, il faut que le grand axe soit plus grand que le petit (autrement dit, que le ratio petit rayon / grand rayon soit inférieur ou égal à 1) pour que cette fonction paramétrique qui sert à calculer l'ellipse puisse fonctionner. Avec la commande ELLIPSE, si on donne une seconde valeur plus grande que la première, c'est la seconde qui est prise comme grand axe. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 27 mars 2021 Posté(e) le 27 mars 2021 j'ai essayé comme cela (defun AngleToParam ( sel ang / param) (if (= (type sel ) 'PICKSET) (setq sel (vlax-ename->vla-object (ssname sel 0))));ssget (if (listp sel ) (setq sel (vlax-ename->vla-object (car sel))));entsel (setq ang (* pi (/ ang 180.0));degré en radian param (+(* (vlax-get sel 'MajorRadius) (cos ang))(* (vlax-get sel 'MinorRadius) (sin ang))) ) ) mais cela n'a pas l'air de fonctionner https://github.com/Fraiddd
(gile) Posté(e) le 28 mars 2021 Auteur Posté(e) le 28 mars 2021 Le 27/03/2021 à 21:14, Olivier Eckmann a dit : Dans ton exemple, avec une ellipse 60 grand rayon et 10 petit rayon, il faut un paramètre de 64.3° pour obtenir un angle de 19.1° Développer Je viens de comprendre. Honte sur moi, c'est une coquille, il fallait lire : "une ellipse de 100 unités de grand axe pour 60 unités de petit axe". C'est corrigé. Ça ne t'a pas empêché de donner la bonne réponse, encore bravo. @Fraid Non ça ne fonctionne pas. Ne t'embêtes pas avec la façon dont a été sélectionnée l'ellipse ou des angles en degrés. Ce type de fonction est destinée à des développeurs et peut prendre comme argument directement un ename ou un vla-object (en LISP) et un angle en radians. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 28 mars 2021 Posté(e) le 28 mars 2021 Bonjour Je me suis agacé quelque chose de rare car je travaille plus de façon empirique qu'analytique Après de multiples essais/erreurs en particulier parce que j'ai confondu certaines données dans mes tâtonnements je suis arrivé à : avec la fonction a->p pour angle vers paramètre, les arguments sont : ga = grand axe pa petit axe a angle (depuis l'axe des x en anti-horaire) et ça retourne une valeur en radians (defun a->p ( pa ga a) (atan (sin a) (* (/ pa ga ) (cos a))) ) Ce qui donne en animation : Par contre je voulais terminer en injectant ces paramètres (en donnant deux angles) dans ENTMAKE et je m'emmêle les pinceaux avec les valeurs de PI et mon ellipse est miroitée ou inversée ! Je réponds un peu tard mais je réponds... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 28 mars 2021 Auteur Posté(e) le 28 mars 2021 Bravo ! La fonction inverse avec des simplifications. On peut encore simplifier un petit peu le ratio entre le petit et le grand axe est une propriété de l'ellipse stockée avec le code DXF 40 dans la liste de données DXF ou qui s'appelle RadiusRatio dans les environnements COM et NET. J'avais essayé de donner une piste dans le premier message avec l'image qui montre les tangentes de l'angle et du paramètre dont le ratio est le même que celui de l'ellipse. On peut donc faire, en passant le ename de l'ellipse en argument : (defun paramToAngle (el p) (atan (* (cdr (assoc 40 (entget el))) (sin p)) (cos p)) ) (defun angleToParam (el a) (atan (sin a) (* (cdr (assoc 40 (entget el))) (cos a))) ) ou, depuis AutoCAD 2012 : (defun paramToAngle (el p) (atan (* (getpropertyvalue el "RadiusRatio") (sin p)) (cos p)) ) (defun angleToParam (el a) (atan (sin a) (* (getpropertyvalue el "RadiusRatio") (cos a))) ) ou, en passant le vla-object : (defun paramToAngle (el p) (atan (* (vla-get-RadiusRatio el) (sin p)) (cos p)) ) (defun angleToParam (el a) (atan (sin a) (* (vla-get-RadiusRatio el) (cos a))) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 28 mars 2021 Auteur Posté(e) le 28 mars 2021 Le 28/03/2021 à 15:58, didier a dit : Par contre je voulais terminer en injectant ces paramètres (en donnant deux angles) dans ENTMAKE et je m'emmêle les pinceaux avec les valeurs de PI et mon ellipse est miroitée ou inversée ! Développer Dans la liste pour entmake : 10 . centre de l'ellipse 11 . vecteur du centre à l'extrémité du grand axe (c'est lui qui sert de base à la mesure des angles) 40 . ratio (dans l'intervalle ]0-1] 41 . paramètre de départ (angle mesuré depuis le vecteur (11) en sens anti-horaire) 41 . paramètre de fin (angle mesuré depuis le vecteur (11) en sens anti-horaire) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 28 mars 2021 Posté(e) le 28 mars 2021 Bonjour (gile) Je n'ai pas bien compris l'intérêt du challenge si c'est pour créer une fonction qui calcule un paramètre existant puisque tu sélectionnes une entité ELLIPSE C'est pour ça que j'ai choisi de cliquer des points et ensuite, avec ces points, sans ellipse donc, trouver le paramètre qui correspond à l'angle désigné Je vais reprendre ce que j'ai fait avec le ENTMAKE mais il me semble que c'est ce que tu montres à suivre... Merci de nous avoir chamboulé la tête 😃 Je pense que pour les prochains challenges il faudrait s'entendre sur une date de dépôt des solutions car voir les solutions arriver n'est pas sans augmenter la pression et peut faire prendre des chemins de traverse, non ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 28 mars 2021 Auteur Posté(e) le 28 mars 2021 Le 28/03/2021 à 18:26, didier a dit : Je n'ai pas bien compris l'intérêt du challenge Développer Ça m'est venu à l'esprit quand j'ai revu ce code que j'avais écris il y a quelques années et je me souviens avoir eu quelques difficultés à comprendre ces "paramètres" puis quelques satisfactions quand j'ai réussi à démêler l'histoire. Je voulais juste essayer de faire partager ça à d'autres et puis je trouve intéressant d'approfondir nos connaissance de l'ellipse qui, si elle est la courbe la plus simple après ce cercle, n'en reste pas moins pleine de secrets pour moi. Sinon, d'un point de vue général, l'intérêt de ces challenges (au départ venus de TheSwamp et qu'on pratiquait assidument il y a quelques années avec feu Patrick_35, ElpanovEvengiy, ...) sont surtout un moyen de faire travailler nos méninges pour confronter différents algorithmes, différentes façon de coder sans forcément avoir un intérêt pratique ou professionnel. Par exemple celui-ci qui consistait à implémenter différents algorithmes de tri est d'un intérêt pratique tout relatif puisque AutoLISP fournit vl-sort, mais a toutefois généré un vrai engouement. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 29 mars 2021 Posté(e) le 29 mars 2021 Bonjour, Je voulais m'y remettre hier soir, mais c'étais résolu, une fois lu c'étais foutu. Pas grave, j'ai revu la trigo. et effectivement plus découvert l'Ellipse. Je me suis bien cassé la tête, et c'étais le but. Merci https://github.com/Fraiddd
lrdb@home Posté(e) le 2 septembre 2022 Posté(e) le 2 septembre 2022 Bonjour à tous, Juste pour le partage Je ne comprends pas tout ce que dit le narrateur, mais cette démo sur les propriétés de l'ellipse est magnifique write a book about what ??
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant