Aller au contenu

intersection de faces 3D avec une droite


Messages recommandés

Invité charles74
Posté(e)

Bonjour à tous !

 

Je rencontre un problème en programmation vba, j'espère que vous pourrez m'aider !

 

Le but est de créer un point résultant de l'intersection de plusieurs faces 3D triangulées avec une droite.

Le fichier dxf est déjà importé et est dessiné dans l'espace objet. la droite est également créée comme ci-dessous :

[surligneur]

Dim lineobj As AcadLine

Set lineobj = ThisDrawing.ModelSpace.AddLine(Position_slt_1.Coordinates, Point_arbitraire.Coordinates)

[/surligneur]

'Intersection entre le modèle triangulé de faces 3D "model_theorique" (contenues dans une sélection) et la droite "lineobj"

[surligneur]

Dim intPoints As Variant

Dim h As Integer

 

For h = 0 To f Step 1 'f nbre de faces 3D

 

intPoints = lineobj.IntersectWith(model_theorique.Item(h), acExtendNone) 'Does not extend either object.

 

Dim point_inter As AcadPoint

Dim location4(0 To 2) As Double

 

location4(0) = intPoints(0): location4(1) = intPoints(1): location4(2) = intPoints(2)

 

Set point_inter = ThisDrawing.ModelSpace.AddPoint(location4)

ThisDrawing.SetVariable "PDMODE", 34

ThisDrawing.SetVariable "PDSIZE", 1

[/surligneur]

Il me dit problème d'index avec la variable "intpoints". Je pense que je comprends mal son fonctionnement.

 

Merci de votre aide,

cordialement,

 

Charles

Posté(e)

Salut,

 

Je ne pourrais pas t'aider en VBA, mais connaissant un peu l'interface COM (accessible aussi avec Visual LISP et .NET), il me semble que ton problème vient de l'utilisation de la valeur de retour de méthode IntersectWith.

 

Cette méthode retourne un array de doubles (coordonnées des points d'intersection trouvés).

Cet array est donc vide s'il n'y a pas d'intersection, il faut donc tester si l'array n'est pas vide avant de cherche à récupérer ses 3 premiers termes.

 

D'autre part, IntersectWith utilisé avec une droite et une face 3d ne retournera que les intersections entre la droite et les arrêtes des faces.

Si tu cherches une intersection à l'intérieur de la face 3d, il faut, par le calcul vectoriel trouver un point d'intersection entre la droite et le plan de la face 3d, et, si ce point existe, verifier qu'il est bien à l'intérieur du triangle.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité charles74
Posté(e)

Bonjour Gile,

 

Merci de ta réponse, je vais donc m'orienter vers les maths !

J'ai fait une batterie de test et effectivement intersectwith ne reconnait que les côtés des faces 3D...

Je vais donc dès demain attaquer le calcul vectoriel.

 

Merci du temps que tu m'as consacré,

Bonne semaine

 

Charles

Posté(e)

Je peux te donner le principe du calcul pour l'intersection d'une droite et d'un plan :

 

Soient :

- P1 et P2 deux points distincts de la droite ;

- P0 un point quelconque sur le plan (un des sommets de la face 3d par exemple) ;

- Norm le vecteur normal de la face 3d (les faces 3d n'ayant pas de propriété Normal, il faut calculer ce vecteur en utilisant le produit vectoriel des vecteurs du premier sommet au second et du premier au troisième)

 

Calculer le produit scalaire de Norm et du vecteur de P1 à P2 (scal). Si scal est égal à 0, c'est que les vecteurs sont perpendiculaires, il n'y a donc pas d'intersection.

 

Si scal est différent de 0, calculer le produit scalaire de Norm et du vecteur de P0 à P1 et diviser le résultat par scal. On obtient ainsi l'échelle avec laquelle multiplier le vecteur de P2 à P1 qui ajouté à P1 donne le point d'intersection de la droite avec le plan.

 

Reste à calculer si ce point est bien à l'intérieur de la face 3d.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité charles74
Posté(e)

ok Merci !

 

Pour ce qui est du triangle, il suffit de vérifier si le point est barycentre des trois sommets du triangle avec les coefficients de pondération positif.

 

Demain je programme tout ca !

 

Merci encore

à bientôt

Charles

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é