pingoo666 Posté(e) le 6 novembre 2006 Posté(e) le 6 novembre 2006 Bonjour, une fois n'est pas coutume ;) j'ai un problème. je cherche un moyen de récuperer la 3D face qui inscrit un point.En gros je donne un point et le lisp me donne la 3Dface dans laquelle est ce point. Voila auriez vous une idée ? Merci d'avance.
saamreivax Posté(e) le 6 novembre 2006 Posté(e) le 6 novembre 2006 Salut le principe c'est de créer une fonction qui calcule si ton point est à l'intérieur du triangle que tu répète pour chaque triangle Tu dois connaitre le sens de rotation de ta face avec la formule de la somme des angles intérieur et extérieur du triangleEt si ton point se trouve à l'intérieur du triangle alors la somme des angles est égale à 400gr ou chaque angle est <= à 200 gr Tu me suis?? Désolé c la fatigue Voici le code (c'est des fonctions sauf la première) : (defun c:ptri () ;;selection du point (print (setq point (getpoint))) ;;selection du triangle (setq E_tri (car (entsel))) (if (= (Point_dans_le_triangle E_tri point) T) (interpol_Triangle E_tri point) ) ) ;; Calcul l'angle entre deux segments (defun ang (angle_PT1 angle_PT2 angle_PT3 / a) (setq a (/ (* (- (angle angle_PT2 angle_PT3) (angle angle_PT2 angle_PT1)) 200 ) pi ) ) (if (< a 0) (setq a (+ a 400)) (setq a a) ) ) ;; Vérifie si le point est dans le triangle (Defun Point_dans_le_triangle (entite_triangle TPoint / somme pt10 pt11 Pt12 pt13) (setq pt10 (point3D->2D (cdr (assoc 10 (entget entite_triangle))))) (setq pt11 (point3D->2D (cdr (assoc 11 (entget entite_triangle))))) (setq pt12 (point3D->2D (cdr (assoc 12 (entget entite_triangle))))) (setq pt13 (point3D->2D (cdr (assoc 13 (entget entite_triangle))))) (setq somme (+ (ang pt10 Pt11 Pt12) (ang pt11 Pt12 Pt10) (ang Pt12 pt10 Pt11) ) ) (if (= somme 1000) (progn (setq pt10_pt_pt11 (ang pt10 TPoint Pt11)) (setq pt11_pt_pt12 (ang pt11 TPoint Pt12)) (setq pt12_pt_pt10 (ang pt12 TPoint Pt10)) ) ) (if (= somme 200) (progn (setq pt10_pt_pt11 (ang pt11 TPoint Pt10)) (setq pt11_pt_pt12 (ang pt12 TPoint Pt11)) (setq pt12_pt_pt10 (ang pt10 TPoint Pt12)) ) ) (or (if (or (> pt10_pt_pt11 200) (> pt11_pt_pt12 200) (> pt12_pt_pt10 200) ) Nil T ) (if (or (= (distance Tpoint pt10) 0) (= (distance Tpoint pt11) 0) (= (distance Tpoint pt12) 0) ) T nil ) ) ) ;; Transforme un point 3D en point 2D (defun point3D->2D (TPoint) (reverse (cdr (reverse Tpoint))) ) .....Edit :Je me sers de cette fontion pour faire une interpolation et déduire l'atitude de mon pointmoi toi avec en modifiant le code tu pourras récupérer l'id de ta face 3D[Edité le 6/11/2006 par saamreivax] [Edité le 1/12/2006 par saamreivax]
pingoo666 Posté(e) le 7 novembre 2006 Auteur Posté(e) le 7 novembre 2006 merci !!! je veux bien le code d'interpolation aussi :) c'est ma deuxième étape :)
saamreivax Posté(e) le 7 novembre 2006 Posté(e) le 7 novembre 2006 Salut Voila la suite : (defun interpol_Triangle (entite_triangle TPoint) (setq pt10 (cdr (assoc 10 (entget entite_triangle)))) (setq pt11 (cdr (assoc 11 (entget entite_triangle)))) (setq pt12 (cdr (assoc 12 (entget entite_triangle)))) ;;(alert "Va calculer une intersection") (setq TInters (inters (point3D->2D pt10) (point3D->2D Tpoint) (point3D->2D pt11) (point3D->2D pt12) nil ) ) ;;(alert "Va calculer une interpolation") (setq z (interpolation pt11 pt12 (distance Tinters Pt11) ) ) ;;(alert "Va calculer une interpolation") (setq Tinters (reverse (cons z (reverse Tinters)))) (setq z (interpolation pt10 Tinters (distance (point3D->2D Tpoint) (point3D->2D Pt10)) ) ) (setq Tinters (reverse (cons z (reverse (point3D->2D Tpoint))))) ) ;; Calcul une interpolation (defun interpolation (Tpoint1 Tpoint2 TDistance) (setq Tdist (distance (point3D->2D Tpoint1) (point3D->2D Tpoint2))) (setq TDN (denivele Tpoint1 Tpoint2)) (+ (nth 2 Tpoint1) (* (/ TDN Tdist) Tdistance)) ) ;; Calcul une dénivélé entre 2 points 3D (defun denivele (Tpoint3 Tpoint4) (- (nth 2 TPoint4) (nth 2 TPoint3)) ) Pour information personnelle quelle est le but final de ton programme?
pingoo666 Posté(e) le 7 novembre 2006 Auteur Posté(e) le 7 novembre 2006 c'est pour faire une fonction de projection de polyligne sur une surface (un ensemble de 3D face)
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