Aller au contenu

[Challenge]Paramètres de l'ellipse


(gile)

Messages recommandés

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.

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 :

Ellipse_parameter.png

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

3 minutes ago, Fraid said:

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.

 

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)

 

paramètre de l'ellipse.png

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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.

image.png

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Bravo @Olivier Eckmann !

Le code fonctionne. Il pourrait juste être simplifié. Reste la fonction inverse (mais maintenant, c'est plus facile).

50 minutes ago, Olivier Eckmann said:

Par contre je n'arrive pas dans AutoCAD à créer une ellipse avec un grand axe plus petit que le petit axe.

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

8 hours ago, Olivier Eckmann said:

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°

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 :

2021-03-28_16-49-56gif.gif

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

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

42 minutes ago, didier said:

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 !

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

2 hours ago, didier said:

Je n'ai pas bien compris l'intérêt du challenge

Ç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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an aprè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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité