chris_mtp Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 Bonjour à tous, J'ai une liste de points 3D sous la forme((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ....(xi yi zi).......(xj yj zj)....(xn yn zn)). Je voudrais conserver dans cette liste les deux points les plus proches de la coordonnée Xi du point p(i)Un exemple sera je pense un peu plus clair. Voici ma liste de points de 3D.((1 1 0) (2 3 1) (5 6 1) (8 3 2) (9 1 5)) et un point p(i) du type (4 5 0)Et bien la fonction devrait me retourner les deux points dont la coordonnée Xi soit 4 dans mon exemple est la plus proche de ces deux points soit ((2 3 1) (5 6 1)).Attention, petite précision mais qui à son importance, la liste des points est construite de manière à ce que les x soient croissants J'espère avoir été clair dans mes explications.Si vous avez une idée sur la manière dont traiter cette liste ou un exemple car je ne vois pas comment faire, merci par avance de votre aide John
Tramber Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 (setq lis '((1 1 0) (2 3 1) (5 6 1) (8 3 2) (9 1 5))) (setq lcomp '(4 5 0) index 0) (while (vl-some (function (lambda(e1) ( (setq lis(cdr lis)index(1+ index)) ) (1- index) index Ne fonctionne que parce que ta liste possède bien des X croissants. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 Salut, Avec une liste non triée : (setq lis '((1 1 0) (2 3 1) (5 6 1) (8 3 2) (9 1 5))) (setq lcomp '(4 5 0) index 0) ((lambda (l) (list (car l) (cadr l)) ) (vl-sort lis '(lambda (x1 x2) ( (abs (- (car x2) (car lcomp))) ) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 Bonjour, Mais que se passe-t-il "à la marge" quand lcomp vaut '(15 5 0) ou alors '(0 1 0) ?Avec une liste non triée et une vérification des limites : (defun PtNear (lis lcomp / RES index) ;; trier la liste selon les abscisses croissantes (setq lis (vl-sort lis '(lambda (x1 x2) (< (car x1) (car x2)) ) ) ) (setq index 0) (while (and (< (car (nth index lis)) (car lcomp)) (< index (length lis))) (setq index (+ index 1)) ) (cond ((zerop index) (alert "x inférieur au premier point") ) ((= index (length lis)) (alert "x supérieur au dernier point") ) (T (setq RES (list (nth (- index 1) lis) (nth index lis))) ) ) RES ) (defun c:PtnearMain () (setq lis '((1 1 0) (8 3 2) (5 6 1) (2 3 1) (9 1 5))) (setq lcomp '(4 5 0)) (setq RES (PtNear lis lcomp)) (if RES (print RES) ) (princ) ) AmicalementVincent [Edité le 23/11/2009 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
chris_mtp Posté(e) le 23 novembre 2009 Auteur Posté(e) le 23 novembre 2009 Merci à tous pour ces fonctions.Je vais les décortiquer même temps.John.
Bruno_T Posté(e) le 2 décembre 2009 Posté(e) le 2 décembre 2009 avec(setq lis '((1 1 0) (2 3 1) (5 6 1) (8 3 2) (9 1 5)))(setq lcomp '(4 5 0)) (setq xi (car lcomp) l (length lis) i -1) (while (and (< (setq i (1+ i)) l) (< (car (nth i lis)) xi))) (list (nth (1- i) lis)(nth i lis)) mais on ne connait pas entièrement le problème, notamment les réactions souhaitées sur les bords de la liste et en cas d'égalité avec le "x" d'un des éléments...
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