Aller au contenu

Tri liste de points


Messages recommandés

Posté(e)

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

Posté(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)
(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

 

./__\.
(.°=°.)
Posté(e)

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

Posté(e)

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

 

Amicalement

Vincent

 

 

[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)

  • 2 semaines après...
Posté(e)

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

 

 

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é