You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
La structure Vector3d représente une direction et une magnitude dans l'espace 3D. C'est une classe de géométrie fondamentale dans l'API .NET AutoCAD, utilisée extensivement pour les calculs directionnels, les transformations, les vecteurs normaux et les opérations géométriques.
Namespace
Autodesk.AutoCAD.Geometry
Propriétés Clés
Propriété
Type
Description
X
double
Obtient la composante X
Y
double
Obtient la composante Y
Z
double
Obtient la composante Z
Length
double
Obtient la longueur (magnitude) du vecteur
LengthSqrd
double
Obtient la longueur au carré (plus rapide que Length)
XAxis
Vector3d (static)
Obtient le vecteur unitaire (1, 0, 0)
YAxis
Vector3d (static)
Obtient le vecteur unitaire (0, 1, 0)
ZAxis
Vector3d (static)
Obtient le vecteur unitaire (0, 0, 1)
Méthodes Clés
Méthode
Type de Retour
Description
GetNormal()
Vector3d
Retourne le vecteur unitaire normalisé
DotProduct(Vector3d)
double
Calcule le produit scalaire avec un autre vecteur
CrossProduct(Vector3d)
Vector3d
Calcule le produit vectoriel (vecteur perpendiculaire)
GetAngleTo(Vector3d)
double
Obtient l'angle vers un autre vecteur (radians)
GetAngleTo(Vector3d, Vector3d)
double
Obtient l'angle signé autour d'un vecteur de référence
TransformBy(Matrix3d)
Vector3d
Transforme le vecteur par une matrice
RotateBy(double, Vector3d)
Vector3d
Effectue une rotation du vecteur autour d'un axe
Negate()
Vector3d
Retourne le vecteur inversé
MultiplyBy(double)
Vector3d
Multiplie le vecteur par un scalaire
IsParallelTo(Vector3d)
bool
Vérifie si parallèle à un autre vecteur
IsPerpendicularTo(Vector3d)
bool
Vérifie si perpendiculaire à un autre vecteur
IsCodirectionalTo(Vector3d)
bool
Vérifie si pointe dans la même direction
IsEqualTo(Vector3d)
bool
Vérifie l'égalité avec la tolérance par défaut
IsEqualTo(Vector3d, Tolerance)
bool
Vérifie l'égalité avec une tolérance personnalisée
Surcharges d'Opérateurs
Opérateur
Description
+
Addition de vecteurs
-
Soustraction de vecteurs
*
Multiplication scalaire
/
Division scalaire
==
Comparaison d'égalité
!=
Comparaison d'inégalité
Exemples de Code
Exemple 1: Créer et Normaliser des Vecteurs
// Créer des vecteursVector3dvec1=newVector3d(3,4,0);Vector3dvec2=newVector3d(10,0,0);// Obtenir les propriétés du vecteurdoublelength=vec1.Length;// 5.0doublelengthSqrd=vec1.LengthSqrd;// 25.0 (calcul plus rapide)// Normaliser en vecteur unitaireVector3dunitVec=vec1.GetNormal();// (0.6, 0.8, 0)// Utiliser les vecteurs d'axes prédéfinisVector3dxAxis=Vector3d.XAxis;// (1, 0, 0)Vector3dyAxis=Vector3d.YAxis;// (0, 1, 0)Vector3dzAxis=Vector3d.ZAxis;// (0, 0, 1)ed.WriteMessage($"\nVecteur : ({vec1.X}, {vec1.Y}, {vec1.Z})");ed.WriteMessage($"\nLongueur : {length:F2}");ed.WriteMessage($"\nVecteur unitaire : ({unitVec.X:F2}, {unitVec.Y:F2}, {unitVec.Z:F2})");
Vector3dv1=newVector3d(1,0,0);Vector3dv2=newVector3d(0,1,0);// Produit scalaire (résultat scalaire)doubledot=v1.DotProduct(v2);// 0 (vecteurs perpendiculaires)// Produit vectoriel (résultat vectoriel - perpendiculaire aux deux)Vector3dcross=v1.CrossProduct(v2);// (0, 0, 1) - Axe Z// Exemple pratique : vérifier si les vecteurs sont perpendiculairesVector3da=newVector3d(3,4,0);Vector3db=newVector3d(-4,3,0);doubledotAB=a.DotProduct(b);// 0 (perpendiculaire)ed.WriteMessage($"\nProduit scalaire : {dot}");ed.WriteMessage($"\nProduit vectoriel : ({cross.X}, {cross.Y}, {cross.Z})");ed.WriteMessage($"\nVecteurs perpendiculaires : {Math.Abs(dotAB)<0.001}");
Exemple 4: Calculs d'Angles
Vector3dv1=newVector3d(1,0,0);// Axe XVector3dv2=newVector3d(1,1,0);// 45° de l'axe X// Obtenir l'angle entre les vecteurs (toujours positif, 0 à π)doubleangle=v1.GetAngleTo(v2);doubledegrees=angle*(180.0/Math.PI);// Convertir en degrés// Obtenir l'angle signé (avec vecteur de référence)Vector3drefVec=Vector3d.ZAxis;doublesignedAngle=v1.GetAngleTo(v2,refVec);ed.WriteMessage($"\nAngle : {angle:F4} radians ({degrees:F2}°)");ed.WriteMessage($"\nAngle signé : {signedAngle:F4} radians");// Exemple pratique : trouver l'angle entre deux lignesPoint3dp1=newPoint3d(0,0,0);Point3dp2=newPoint3d(10,0,0);Point3dp3=newPoint3d(10,10,0);Vector3dline1=p1.GetVectorTo(p2);Vector3dline2=p2.GetVectorTo(p3);doublelineAngle=line1.GetAngleTo(line2);ed.WriteMessage($"\nAngle entre les lignes : {lineAngle*(180.0/Math.PI):F2}°");
Exemple 5: Transformations de Vecteurs
Vector3dvec=newVector3d(1,0,0);// Rotation du vecteur de 90° autour de l'axe Zdoubleangle=Math.PI/2;Vector3drotated=vec.RotateBy(angle,Vector3d.ZAxis);// Résultat : (0, 1, 0)// Transformation par matriceMatrix3drotation=Matrix3d.Rotation(Math.PI/4,Vector3d.ZAxis,Point3d.Origin);Vector3dtransformed=vec.TransformBy(rotation);// Mise à l'échelle du vecteurVector3dscaled=vec.MultiplyBy(5.0);// (5, 0, 0)ed.WriteMessage($"\nOriginal : {vec}");ed.WriteMessage($"\nRotation 90° : ({rotated.X:F2}, {rotated.Y:F2}, {rotated.Z:F2})");ed.WriteMessage($"\nTransformé : ({transformed.X:F2}, {transformed.Y:F2}, {transformed.Z:F2})");
Exemple 6: Génération de Vecteur Perpendiculaire
Vector3dvec=newVector3d(1,1,0);// Obtenir un vecteur perpendiculaire en utilisant le produit vectorielVector3dperp1=vec.CrossProduct(Vector3d.ZAxis);perp1=perp1.GetNormal();// Normaliser// Alternative : rotation de 90°Vector3dperp2=vec.RotateBy(Math.PI/2,Vector3d.ZAxis);perp2=perp2.GetNormal();// Vérifier la perpendicularitédoubledot=vec.DotProduct(perp1);boolisPerpendicular=Math.Abs(dot)<0.001;ed.WriteMessage($"\nVecteur original : {vec}");ed.WriteMessage($"\nVecteur perpendiculaire : {perp1}");ed.WriteMessage($"\nProduit scalaire (devrait être ~0) : {dot:F6}");ed.WriteMessage($"\nEst perpendiculaire : {isPerpendicular}");
Exemple 7: Projection de Vecteur
// Projeter le vecteur A sur le vecteur BVector3dvecA=newVector3d(5,3,0);Vector3dvecB=newVector3d(1,0,0);// Axe X// Formule de projection : proj_B(A) = (A · B / |B|²) * BdoubledotProduct=vecA.DotProduct(vecB);doublelengthSqrd=vecB.LengthSqrd;Vector3dprojection=vecB*(dotProduct/lengthSqrd);// Obtenir la composante perpendiculaire (rejet)Vector3drejection=vecA-projection;ed.WriteMessage($"\nVecteur A : {vecA}");ed.WriteMessage($"\nVecteur B : {vecB}");ed.WriteMessage($"\nProjection de A sur B : {projection}");ed.WriteMessage($"\nRejet (perpendiculaire) : {rejection}");// Vérifier : projection + rejet = originalVector3dsum=projection+rejection;ed.WriteMessage($"\nVérification (devrait égaler A) : {sum}");
Exemple 8: Vérifier les Relations entre Vecteurs
Vector3dv1=newVector3d(1,0,0);Vector3dv2=newVector3d(2,0,0);// Parallèle à v1Vector3dv3=newVector3d(0,1,0);// Perpendiculaire à v1Vector3dv4=newVector3d(-1,0,0);// Opposé à v1// Vérifier parallèleboolisParallel=v1.IsParallelTo(v2);// true// Vérifier perpendiculaireboolisPerpendicular=v1.IsPerpendicularTo(v3);// true// Vérifier codirectionnel (même direction)boolisCodirectional=v1.IsCodirectionalTo(v2);// trueboolisCodirectional2=v1.IsCodirectionalTo(v4);// false (opposé)// Vérifier l'égalité avec toléranceTolerancetol=newTolerance(0.001,0.001);Vector3dv5=newVector3d(1.0001,0,0);boolisEqual=v1.IsEqualTo(v5,tol);// trueed.WriteMessage($"\nv1 parallèle à v2 : {isParallel}");ed.WriteMessage($"\nv1 perpendiculaire à v3 : {isPerpendicular}");ed.WriteMessage($"\nv1 codirectionnel à v2 : {isCodirectional}");ed.WriteMessage($"\nv1 codirectionnel à v4 : {isCodirectional2}");
Exemple 9: Trouver l'Entité la Plus Proche d'une Coordonnée
[CommandMethod("FINDNEAREST")]publicvoidFindNearestEntity(){Documentdoc=Application.DocumentManager.MdiActiveDocument;Databasedb=doc.Database;Editored=doc.Editor;// Demander un pointPromptPointResultppr=ed.GetPoint("\nSélectionner le point de recherche : ");if(ppr.Status!=PromptStatus.OK)return;Point3dsearchPoint=ppr.Value;using(Transactiontr=db.TransactionManager.StartTransaction()){BlockTableRecordbtr=tr.GetObject(db.CurrentSpaceId,OpenMode.ForRead)asBlockTableRecord;EntitynearestEntity=null;doubleminDistance=double.MaxValue;Point3dnearestPoint=Point3d.Origin;foreach(ObjectIdidinbtr){Entityent=tr.GetObject(id,OpenMode.ForRead)asEntity;if(ent==null)continue;// Obtenir le point le plus proche sur l'entitéPoint3dclosestPt=ent.GetClosestPointTo(searchPoint,false);// Calculer la distance en utilisant un vecteurVector3ddistanceVec=searchPoint.GetVectorTo(closestPt);doubledistance=distanceVec.Length;if(distance<minDistance){minDistance=distance;nearestEntity=ent;nearestPoint=closestPt;}}if(nearestEntity!=null){// Calculer le vecteur de directionVector3ddirection=searchPoint.GetVectorTo(nearestPoint);Vector3dunitDirection=direction.GetNormal();ed.WriteMessage($"\n--- Entité la Plus Proche Trouvée ---");ed.WriteMessage($"\nType d'Entité : {nearestEntity.GetType().Name}");ed.WriteMessage($"\nDistance : {minDistance:F4}");ed.WriteMessage($"\nPoint le Plus Proche : ({nearestPoint.X:F2}, {nearestPoint.Y:F2}, {nearestPoint.Z:F2})");ed.WriteMessage($"\nVecteur de Direction : ({direction.X:F2}, {direction.Y:F2}, {direction.Z:F2})");ed.WriteMessage($"\nDirection Unitaire : ({unitDirection.X:F4}, {unitDirection.Y:F4}, {unitDirection.Z:F4})");// Mettre en surbrillance l'entiténearestEntity.Highlight();// Dessiner une ligne du point de recherche au point le plus procheLineindicator=newLine(searchPoint,nearestPoint);indicator.ColorIndex=1;// RougeBlockTableRecordspace=tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite)asBlockTableRecord;space.AppendEntity(indicator);tr.AddNewlyCreatedDBObject(indicator,true);}else{ed.WriteMessage("\nAucune entité trouvée dans l'espace courant.");}tr.Commit();}}
Exemple 10: Créer des Lignes Décalées en Utilisant des Vecteurs
// Créer une ligne décalée perpendiculaire à l'originalePoint3dstart=newPoint3d(0,0,0);Point3dend=newPoint3d(10,0,0);doubleoffsetDistance=5.0;// Obtenir le vecteur de direction de la ligneVector3dlineDirection=start.GetVectorTo(end);// Obtenir le vecteur perpendiculaire (rotation de 90° autour de Z)Vector3dperpendicular=lineDirection.RotateBy(Math.PI/2,Vector3d.ZAxis);Vector3doffsetVector=perpendicular.GetNormal()*offsetDistance;// Créer les points décalésPoint3doffsetStart=start.Add(offsetVector);Point3doffsetEnd=end.Add(offsetVector);using(Transactiontr=db.TransactionManager.StartTransaction()){BlockTableRecordbtr=tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite)asBlockTableRecord;// Ligne originaleLineoriginalLine=newLine(start,end);originalLine.ColorIndex=7;// Blancbtr.AppendEntity(originalLine);tr.AddNewlyCreatedDBObject(originalLine,true);// Ligne décaléeLineoffsetLine=newLine(offsetStart,offsetEnd);offsetLine.ColorIndex=3;// Vertbtr.AppendEntity(offsetLine);tr.AddNewlyCreatedDBObject(offsetLine,true);tr.Commit();}ed.WriteMessage($"\nLigne originale : {start} à {end}");ed.WriteMessage($"\nLigne décalée : {offsetStart} à {offsetEnd}");ed.WriteMessage($"\nVecteur de décalage : {offsetVector}");
// Trois points définissent un planPoint3dp1=newPoint3d(0,0,0);Point3dp2=newPoint3d(10,0,0);Point3dp3=newPoint3d(0,10,0);Vector3dv1=p1.GetVectorTo(p2);Vector3dv2=p1.GetVectorTo(p3);// La normale est perpendiculaire aux deux vecteursVector3dnormal=v1.CrossProduct(v2).GetNormal();
Vérifier si un Point est à Gauche ou à Droite d'une Ligne
Point3dlineStart=newPoint3d(0,0,0);Point3dlineEnd=newPoint3d(10,0,0);Point3dtestPoint=newPoint3d(5,5,0);Vector3dlineVec=lineStart.GetVectorTo(lineEnd);Vector3dpointVec=lineStart.GetVectorTo(testPoint);// La composante Z du produit vectoriel détermine le côtéVector3dcross=lineVec.CrossProduct(pointVec);if(cross.Z>0)ed.WriteMessage("\nLe point est à gauche");elseif(cross.Z<0)ed.WriteMessage("\nLe point est à droite");elseed.WriteMessage("\nLe point est sur la ligne");
Bonnes Pratiques
Normalisation : Toujours normaliser les vecteurs quand seule la direction est nécessaire : vec.GetNormal()
Performance : Utiliser LengthSqrd au lieu de Length lors de la comparaison de distances
Immutabilité : Vector3d est une structure ; les opérations retournent de nouveaux vecteurs
Tolérance : Utiliser des comparaisons basées sur la tolérance pour les vecteurs en virgule flottante
Vecteurs Zéro : Vérifier les vecteurs de longueur zéro avant de normaliser
Produit Vectoriel : Se rappeler que l'ordre du produit vectoriel importe : A × B ≠ B × A
Produit Scalaire : Utiliser pour les calculs d'angles et les projections
Vecteurs Unitaires : Utiliser les vecteurs prédéfinis XAxis, YAxis, ZAxis pour plus de clarté
Classes Associées
Point3d - Point 3D dans l'espace
Matrix3d - Matrices de transformation
Plane - Définition de plan utilisant un point et une normale
Vector2d - Vecteur 2D pour les opérations planaires