Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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 triangle

Et 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 point

moi 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]

Posté(e)

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?

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é